19

PhantomJS スクリプトでカスタム モジュールをロードしたいのですが、PhantomJS では相対パスが機能しないようです。

script.js:

var foo = require('./script/lib/foo.js');
foo.bar('hello world');
phantom.exit();

foo.js:

exports.bar = function(text){
  console.log(text);
}
  • fs.workingDirectory によると、私は適切なディレクトリにいます
  • foo.js が phantomjs のルックアップ パスにない

何か不足していますか?

編集:

inject() は、HTML ページに JS を挿入する必要はなく、reverant ではありません。代わりに、require('fs') のような独自のモジュールを相対パスでロードします。

4

5 に答える 5

3

To load your own module, the right way to do it is to use module.exports, like this: foo.js

function bar(text) {
   console.log(text);
}

exports.bar = bar 

And in script.js (which is executed with phantomjs script.js):

var foo = require('./script/lib/foo');
foo.bar('hello world');
phantom.exit();
于 2015-07-01T09:39:06.953 に答える
2

この構造のように、外部フォルダーからサブフォルダーjson内にリソースファイル(ファイルとしましょう)をロードする私のソリューション:phantomjs

├── consumer.js
├── assets
    ├── data.json
    ├── loader.js

data.jsonをモジュールによってロードする必要がconsumerあり、このモジュールがこのマシンの別の場所 (プロジェクトのルート フォルダー以外) によって呼び出されると仮定すると、それが呼び出し元ファイルのパスになるため、 は機能しませfs.workingDirectoryん。これを解決するために、ロードするファイルがあるフォルダーloader内に単純なモジュールを作成しました。assets

(function() {

var loader = {
    load : function(fileName) {
        var res=require('./'+fileName);
        return res;
    }
}
module.exports=loader;

}).call(this);

したがって、次のようにloaderモジュールからモジュールをconsumer呼び出します

var loader=require('./data/loader');
var assets=loader.load('data.json');

以上です。

ノート。これrequireはバージョンでphantomjsはなく必須nodeであるため、動作が少し異なります。この場合、は宣言data.jsonのない json 配列でした。メソッドを呼び出すと、module.exports配列は変数に直接戻されます。assetsloader.load(fileName)

于 2016-09-06T08:52:09.160 に答える
0

injectJs(filename)を使用しようとしましたか

PhantomJS ドキュメントからの抜粋:

指定されたファイルから外部スクリプト コードを挿入します。現在のディレクトリでファイルが見つからない場合は、追加の検索に libraryPath が使用されます。

この関数は、注入が成功した場合は true を返し、それ以外の場合は false を返します。

于 2012-08-09T07:06:34.797 に答える