为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MYYA 2019-11-22 15:59:53
我希望在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 
查看完整描述

3 回答

?
慕运维8079593

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


查看完整回答
反对 回复 2019-11-22
?
狐的传说

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


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 629 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信