PhantomJS требует() относительного пути - программирование
Подтвердить что ты не робот

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'), но с относительным путем.

4b9b3361

Ответ 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.