PhantomJS требует() относительного пути
В phantomJS script Я хотел бы загрузить пользовательский модуль, но кажется, что относительные пути не работают в 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
Я что-то пропустил?
EDIT:
inject() не является излишним, потому что мне не нужно вводить JS на HTML-страницу, но вместо этого загружать мой собственный модуль, например require ('fs'), но с относительным путем.
Ответы
Ответ 1
После того, как много времени искал то же самое, вот что я понял, хотя я мог ошибаться:
- PhantomJS не использует Node
require
, но свой собственный require
, поэтому все по-другому
- при предоставлении относительного пути к phantomjs
require
он всегда интерпретируется как относительный рабочий каталог
- PhantomJS не реализует Node
__dirname
, и поэтому нет прямого способа иметь каталог вашего script
Решение, которое я нашел наименее раздражающим:
-
если использовать 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')
Ответ 2
Чтобы загрузить собственный модуль, правильный способ сделать это - использовать 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();
Ответ 3
Мое решение загрузить файл ресурса (например, скажем, файл 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
. Массив будет поддерживаться в переменной assets
непосредственно при вызове метода loader.load(fileName)
.
Ответ 4
Вы пытались использовать injectJs (имя файла)
выдержка из документации PhantomJS:
Вводит внешний script код из указанного файла. Если файл может не найден в текущем каталоге, libraryPath используется для Дополнительный поиск.
Эта функция возвращает true, если инъекция прошла успешно, в противном случае возвращает false.
Ответ 5
Какую версию PhantomJS вы используете? Поддержка пользовательских модулей была добавлена в 1.7.