PhantomJS需要()一个相对路径

时间:2012-08-08 22:01:16

标签: requirejs phantomjs

在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()并不令人满意,因为我不需要将JS注入HTML页面,而是加载我自己的模块,如require(' fs'),但是具有相对路径。

5 个答案:

答案 0 :(得分:12)

经过大量时间寻找同样的事情,这是我理解的,虽然我可能错了:

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

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

  • 如果使用phantomjs pure,没有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')
    

答案 1 :(得分: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();

答案 2 :(得分: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');

那就是它。

请注意。这里的requirephantomjs,不需要node版本,因此它的工作方式略有不同。在这种情况下,data.json是一个没有module.exports声明的json数组。调用assets方法时,数组将直接支持loader.load(fileName)变量。

答案 3 :(得分:0)

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

摘录自PhantomJS文档:

  

从指定文件中注入外部脚本代码。如果文件可以   在当前目录中找不到,使用了libraryPath   额外的抬头。

     

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

答案 4 :(得分:0)

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