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方库的任何源代码,因此维护起来更容易。升级所需要做的只是查看其源代码,并确保您仍在导出适当的对象。
添加回答
举报