19

在 PhantomJS 脚本中,我想加载一个自定义模块,但似乎相对路径在 PhantomJS 中不起作用?

脚本.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() 并不重要,因为我不需要将 JS 注入 HTML 页面,而是加载我自己的模块,如 require('fs') 但使用相对路径。

4

5 回答 5

15

经过大量时间搜索相同的东西,这是我的理解,虽然我可能是错的:

  • PhantomJS 不使用 Node 的require,而是它自己的require,所以情况有所不同
  • 当提供 phantomjs 的相对路径时require,它总是被解释为相对于当前工作目录
  • PhantomJS 没有实现 node's __dirname,因此没有直接的方法来获取脚本的目录

我发现最不烦人的解决方案:

  • 如果使用 phantomjs 纯,没有 casperjs :

    require(phantom.libraryPath + '/script/lib/foo.js')
    
  • 如果使用 casperjs :

    var scriptName = fs.absolute( require("system").args[3] );
    var scriptDirectory = scriptName.substring(0, scriptName.lastIndexOf('/'));
    require(scriptDirectory + '/script/lib/foo.js')
    
于 2016-05-06T15:18:44.097 回答
3

要加载自己的模块,正确的做法是使用 module.exports,如下所示:foo.js

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

exports.bar = bar 

script.js(使用 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');

就是这样。

笔记。这里requirephantomjsrequire 而不是node版本,所以它的工作方式有点不同。在这种情况下,它data.json是一个没有module.exports声明的 json 数组。调用方法时,数组将直接支持在assets变量中。loader.load(fileName)

于 2016-09-06T08:52:09.160 回答
0

您是否尝试过使用injectJs(filename)

摘自 PhantomJS 文档:

从指定文件注入外部脚本代码。如果在当前目录中找不到该文件,则使用 libraryPath 进行额外查找。

如果注入成功,此函数返回 true,否则返回 false。

于 2012-08-09T07:06:34.797 回答
0

您正在运行哪个 PhantomJS 版本?1.7 中添加了对用户提供的模块的支持。

于 2013-09-21T10:51:44.247 回答