2012-08-08 40 views
16

Trong tập lệnh PhantomJS, tôi muốn tải mô-đun tùy chỉnh nhưng có vẻ như đường dẫn tương đối không hoạt động trong PhantomJS?PhantomJS yêu cầu() đường dẫn tương đối

script.js:

var foo = require('./script/lib/foo.js'); 
foo.bar('hello world'); 
phantom.exit(); 

foo.js:

exports.bar = function(text){ 
    console.log(text); 
} 
  • Theo fs.workingDirectory Tôi đang ở thư mục tốt
  • foo.js không nằm trong tra cứu đường dẫn của phantomjs

Am Tôi thiếu cái gì?

EDIT:

bơm() là không Revelant bởi vì tôi không cần phải tiêm một JS đến một trang HTML mà thay vào đó nạp mô-đun riêng của tôi như yêu cầu ('fs') nhưng với một đường dẫn tương đối.

Trả lời

12

Sau rất nhiều thời gian tìm kiếm điều tương tự, đây là những gì tôi hiểu, mặc dù tôi có thể là sai:

  • PhantomJS không sử dụng Node của require, nhưng riêng của mình require, vì vậy điều này là khác nhau
  • khi cung cấp một đường dẫn tương đối đến của phantomjs require, nó luôn luôn hiểu là tương đối so với thư mục làm việc hiện tại
  • PhantomJS không thực hiện nút của __dirname, và như vậy không có cách nào trực tiếp để có thư mục của kịch bản của bạn

Các giải pháp tôi đã tìm thấy ít nhất gây phiền nhiễu:

  • nếu sử dụng phantomjs thanh tịnh, không casperjs:

    require(phantom.libraryPath + '/script/lib/foo.js') 
    
  • nếu sử dụng casperjs:

    var scriptName = fs.absolute(require("system").args[3]); 
    var scriptDirectory = scriptName.substring(0, scriptName.lastIndexOf('/')); 
    require(scriptDirectory + '/script/lib/foo.js') 
    
0

có bạn cố gắng sử dụng injectJs (filename)

trích PhantomJS dạng tài liệu:

Tiêm mã kịch bản bên ngoài từ các tập tin cụ thể. Nếu không thể tìm thấy tệp trong thư mục hiện tại, thư việnPath được sử dụng cho tra cứu bổ sung.

Hàm này trả về true nếu tiêm thành công, nếu không thì hàm sẽ trả về giá trị sai.

+5

Tiêm được sử dụng để tiêm tệp .js trong trang không có đầu. Tôi sử dụng nó để chèn một jquery.js vào một trang nhất định. Tôi cần phải tải mô-đun của riêng tôi như tôi đã làm với yêu cầu ('fs'). Nhưng tôi muốn sử dụng một đường dẫn tương đối như trong NodeJS –

+0

Vì vậy, phantom.injectJs() dường như làm việc cho trường hợp đơn giản của tôi. Tệp đích không phải là một mô-đun. Dường như có bất kỳ cuộc thảo luận nào về ML. –

0

Bạn đang chạy phiên bản PhantomJS nào? Hỗ trợ cho các mô-đun do người dùng cung cấp đã được thêm vào 1.7.

3

Để tải mô-đun riêng của bạn, đúng cách để làm điều đó là sử dụng module.exports, như thế này: foo.js

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

exports.bar = bar 

Và trong script.js (được thực hiện với tập lệnh phantomjs.js):

var foo = require('./script/lib/foo'); 
foo.bar('hello world'); 
phantom.exit(); 
+1

Điều này khác với câu hỏi như thế nào? –

2

Giải pháp của tôi để tải một tập tin tài nguyên (như chúng ta hãy nói một file json) trong một thư mục con phantomjs từ một thư mục bên ngoài như thế nào trong cấu trúc này:

├── consumer.js 
├── assets 
    ├── data.json 
    ├── loader.js 

Giả sử data.json phải tải bởi consumer và module này được gọi bởi một nơi khác trên máy này, bên ngoài thư mục gốc của dự án, fs.workingDirectory sẽ không hoạt động, vì nó sẽ là đường dẫn của tệp người gọi. Vì vậy, để giải quyết việc này, tôi đã làm một loader module đơn giản trong assets thư mục, nơi các tập tin tôi muốn tải là:

(function() { 

var loader = { 
    load : function(fileName) { 
     var res=require('./'+fileName); 
     return res; 
    } 
} 
module.exports=loader; 

}).call(this); 

do đó tôi gọi là mô-đun loader từ các module consumer như

var loader=require('./data/loader'); 
var assets=loader.load('data.json'); 

và đó là nó.

LƯU Ý. Số require ở đây là phantomjs không yêu cầu phiên bản node, vì vậy nó hoạt động hơi khác một chút. Trong trường hợp này, data.json là một mảng json không có khai báo module.exports. Mảng sẽ được sao lưu trực tiếp trong biến số assets khi gọi phương thức loader.load(fileName).

Các vấn đề liên quan