在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);
}
我错过了什么吗?
编辑:
inject()并不令人满意,因为我不需要将JS注入HTML页面,而是加载我自己的模块,如require(' fs'),但是具有相对路径。
答案 0 :(得分:12)
经过大量时间寻找同样的事情,这是我理解的,虽然我可能错了:
require
,而是使用自己的require
,所以情况有所不同require
的相对路径时,它总是被解释为相对于当前工作目录 __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');
那就是它。
请注意。这里的require
是phantomjs
,不需要node
版本,因此它的工作方式略有不同。在这种情况下,data.json
是一个没有module.exports
声明的json数组。调用assets
方法时,数组将直接支持loader.load(fileName)
变量。
答案 3 :(得分:0)
您是否尝试过使用 injectJs(filename)
摘录自PhantomJS文档:
从指定文件中注入外部脚本代码。如果文件可以 在当前目录中找不到,使用了libraryPath 额外的抬头。
如果注入成功,则此函数返回true,否则返回true 返回false。
答案 4 :(得分:0)
你在运行哪个PhantomJS版本? 1.7中添加了对用户提供的模块的支持。