有一些第三方Javascript库具有某些功能,我想在Node.js服务器中使用。(特别是我想使用找到的QuadTree javascript库。)但是这些库只是简单的.js文件,而不是“ Node.js库”。
.js
因此,这些库未遵循exports.var_nameNode.js对其模块期望的语法。据我了解,这意味着当您这样做时,module = require('module_name');或者module =require('./path/to/file.js');最终将得到一个没有公共可访问功能的模块,等等。
exports.var_name
module = require('module_name');
module =require('./path/to/file.js');
然后我的问题是“我如何将一个任意的javascript文件加载到Node.js中,这样我就可以利用其功能而不必重写它就可以了exports?”
exports
我对Node.js还是很陌生,所以请让我知道我对它的工作方式是否有明显的了解。
编辑 :进行了更多的研究,现在我看到Node.js使用的模块加载模式实际上是最近开发的用于加载称为CommonJS的Javascript库的标准的一部分。它在Node.js的模块文档页面上说得很对,但直到现在我都没想到。
我的问题的答案可能最终是“请等到您的库的作者开始编写CommonJS接口或做该死的自我”。
有比使用eval:vm模块更好的方法。
eval
vm
例如,这是我的execfile模块,该模块path在context或全局上下文中评估脚本:
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包含:
example.js
function getSomeGlobal() { return someGlobal; }
此方法的最大优点是您可以完全控制已执行脚本中的全局变量:您可以传入自定义全局变量(通过context),并且脚本创建的所有全局变量都将添加到中context。调试也更容易,因为将使用正确的文件名报告语法错误等。