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

2022-08-30 05:39:20

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

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

然后我的问题是“如何将任意javascript文件加载到Node中.js以便我可以利用其功能而不必重写它,以便它确实可以?exports

我对Node很陌生.js所以如果我对它的工作原理的理解有一些明显的漏洞,请告诉我。


编辑:深入研究更多的东西,我现在看到Node.js使用的模块加载模式实际上是最近开发的用于加载Javascript库的标准的一部分,称为CommonJS。它在Node.js的模块文档页面上说了这一点,但直到现在我才错过了。

最终可能是我的问题的答案是“等到你图书馆的作者开始编写CommonJS接口,或者你自己做。


答案 1

以下是我认为这种情况的“最正确”答案。

假设您有一个名为 的脚本文件。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/

然后,您的文件将从文件系统加载该库,并执行正确导出内容的工作。./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();

我喜欢这种方法,因为没有必要更改第三方库的任何源代码 - 因此更容易维护。升级时需要做的就是查看它们的源代码,并确保仍在导出正确的对象。


答案 2

有一个比使用:vm模块更好的方法。eval

例如,这是我的模块,它在任一上下文中或全局上下文中评估脚本:execfilepathcontext

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;
}

此方法的最大优点是,您可以完全控制已执行脚本中的全局变量:您可以传入自定义全局变量(via),并且脚本创建的所有全局变量都将添加到 .调试也更容易,因为语法错误等将使用正确的文件名进行报告。contextcontext