3 回答

TA貢獻1876條經驗 獲得超5個贊
有比使用eval:vm模塊更好的方法。
例如,這是我的execfile模塊,該模塊path在context或全局上下文中評估腳本:
var vm = require("vm");
var fs = require("fs");
module.exports = function(path, context) {
context = context || {};
var data = fs.readFileSync(path);
vm.runInNewContext(data, context, path);
return context;
}
可以這樣使用:
> var execfile = require("execfile");
> // `someGlobal` will be a global variable while the script runs
> var context = execfile("example.js", { someGlobal: 42 });
> // And `getSomeGlobal` defined in the script is available on `context`:
> context.getSomeGlobal()
42
> context.someGlobal = 16
> context.getSomeGlobal()
16
其中example.js包含:
function getSomeGlobal() {
return someGlobal;
}
該方法的最大優點是您可以完全控制已執行腳本中的全局變量:您可以傳入自定義全局變量(通過context),并且腳本創建的所有全局變量都將添加到中context。調試也更加容易,因為將使用正確的文件名報告語法錯誤等。

TA貢獻1804條經驗 獲得超3個贊
對于這種情況,我認為這是“最正確的”答案。
假設您有一個名為的腳本文件quadtree.js。
您應該構建node_module具有這種目錄結構的自定義...
./node_modules/quadtree/quadtree-lib/
./node_modules/quadtree/quadtree-lib/quadtree.js
./node_modules/quadtree/quadtree-lib/README
./node_modules/quadtree/quadtree-lib/some-other-crap.js
./node_modules/quadtree/index.js
./node_modules/quadtree/quadtree-lib/目錄中的所有內容都是來自第3方庫的文件。
然后,您的./node_modules/quadtree/index.js文件將只從文件系統中加載該庫,并完成正確導出內容的工作。
var fs = require('fs');
// Read and eval library
filedata = fs.readFileSync('./node_modules/quadtree/quadtree-lib/quadtree.js','utf8');
eval(filedata);
/* The quadtree.js file defines a class 'QuadTree' which is all we want to export */
exports.QuadTree = QuadTree
現在,您可以quadtree像其他任何節點模塊一樣使用模塊了。
var qt = require('quadtree');
qt.QuadTree();
我喜歡這種方法,因為不需要更改您的第3方庫的任何源代碼,因此維護起來更容易。升級所需要做的只是查看其源代碼,并確保您仍在導出適當的對象。
添加回答
舉報