3 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
有比使用eval:vm模塊更好的方法。
例如,這是我的execfile模塊,該模塊path在context或全局上下文中評(píng)估腳本:
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;
}
該方法的最大優(yōu)點(diǎn)是您可以完全控制已執(zhí)行腳本中的全局變量:您可以傳入自定義全局變量(通過context),并且腳本創(chuàng)建的所有全局變量都將添加到中context。調(diào)試也更加容易,因?yàn)閷⑹褂谜_的文件名報(bào)告語法錯(cuò)誤等。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)于這種情況,我認(rèn)為這是“最正確的”答案。
假設(shè)您有一個(gè)名為的腳本文件quadtree.js。
您應(yīng)該構(gòu)建node_module具有這種目錄結(jié)構(gòu)的自定義...
./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/目錄中的所有內(nèi)容都是來自第3方庫的文件。
然后,您的./node_modules/quadtree/index.js文件將只從文件系統(tǒng)中加載該庫,并完成正確導(dǎo)出內(nèi)容的工作。
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
現(xiàn)在,您可以quadtree像其他任何節(jié)點(diǎn)模塊一樣使用模塊了。
var qt = require('quadtree');
qt.QuadTree();
我喜歡這種方法,因?yàn)椴恍枰哪牡?方庫的任何源代碼,因此維護(hù)起來更容易。升級(jí)所需要做的只是查看其源代碼,并確保您仍在導(dǎo)出適當(dāng)?shù)膶?duì)象。
添加回答
舉報(bào)