将“ Vanilla” Javascript库加载到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接口或做该死的自我时,”。


javascript node.js 


MYYA
浏览 602回答 3
3回答

慕运维8079593

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

狐的传说

对于这种情况,我认为这是“最正确的”答案。假设您有一个名为的脚本文件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 libraryfiledata = 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方库的任何源代码,因此维护起来更容易。升级所需要做的只是查看其源代码,并确保您仍在导出适当的对象。
打开App,查看更多内容
随时随地看视频慕课网APP