有一些第三方Javascript库具有一些我想在 node 中使用的功能.js服务器.(具体来说,我想使用我找到的四叉树javascript库.)但这些库只是简单的.js个文件,而不是"Node.js库".

因此,这些库不遵循该 node 的exports.var_name语法.js期待它的模块.据我所知,这意味着当你做module = require('module_name');module = require('./path/to/file.js');时,你最终会得到一个没有公共可访问功能的模块,等等.

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

我对诺德很陌生.所以,请让我知道,如果有一些明显的漏洞,在我的理解如何工作.


EDIT:通过进一步研究,我现在看到了 node 的模块加载模式.js uses实际上是最近开发的用于加载Javascript库的标准CommonJS的一部分.module doc page for Node.js上写着这句话,但我一直没听到.

我的问题的答案可能是"等到你的库作者开始编写CommonJS接口,或者自己动手."

推荐答案

有一种比使用eval更好的方法:vm模块.

例如,这里是我的execfile模块,它在context或全局上下文中计算path处的脚本:

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

Node.js相关问答推荐

MongoDB:更新批量操作中许多不能正常工作的内容

如何使用MongoDB在Node.js 中向数组中添加项?

如何在MEVN堆栈中结合创建和更新表单流程?

如何在Reaction应用程序中查看存储的斑点图像?

如何在医学中按patientId查找一个并同时插入多个数据

当变量在另一个文件中初始化时,在初始化错误之前无法访问变量

使用 Google Drive API 按文件夹 ID 检索文件夹的内容

我的 MERN 网站一直告诉我我的一个函数不是一个函数

PM2 是否需要成为其托管项目的依赖项?

我需要聚合两个 MongoDB 集合

为什么 client.on("messageCreate") 的 TextChannel 中缺少 nsfw 属性?

在 NodeJS/ESP32 中通过 WebSocket 发送二进制数据 - 如何识别二进制和文本消息

Winston http 日志(log)级别的行为与 info 不同

为什么我的 Heroku Express API 数据是持久的,即使它只是来自一个变量

我可以通过 JNI 从 Node.js 调用 Java 吗?如何?

使用 nvm-windows 时更新 npm

如何在客户端使用 node.js 模块系统

如何为 node.js 服务器分配域名?

为什么我会收到错误:解决方法指定过多?

node.js(ES6 / Babel)中 import X 和 import * as X 的区别?