一尘不染

将“ Vanilla” Javascript库加载到Node.js中

node.js

我想在Node.js服务器中使用一些第三方Javascript库,这些库具有某些功能。(特别是我想使用找到的QuadTree
javascript库。)但是这些库只是简单的.js文件,而不是“ Node.js库”。

因此,这些库不遵循exports.var_nameNode.js对其模块期望的语法。据我了解,这意味着当您这样做时,module = require('module_name');或者module = require('./path/to/file.js');最终将得到一个没有公共可访问功能的模块,等等。

然后我的问题是“如何将一个任意的javascript文件加载到Node.js中,这样我就可以利用其功能而不必重写它就可以了exports?”

我对Node.js还是很陌生,所以请让我知道我对它的工作方式是否有明显的了解。


编辑
:进行了更多研究,现在我看到Node.js使用的模块加载模式实际上是最近开发的用于加载称为CommonJS的
Javascript库的标准的一部分。它在Node.js模块文档页面上说得很对,但是直到现在我都没想到。

我的问题的答案可能最终是“等到您的库的作者开始编写CommonJS接口或自己做的那样做。”


阅读 258

收藏
2020-07-07

共1个答案

一尘不染

有比使用evalvm模块更好的方法。

例如,这是我的execfile模块,该模块pathcontext或全局上下文中评估脚本:

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。调试也更容易,因为将使用正确的文件名报告语法错误等。

2020-07-07