如何使用.node文件?

idu*_*ude 14 javascript node.js npm node-gyp

我试图安装node_mouse,当我查看我的节点模块文件夹而不是正常的.js文件扩展名时,我找到了一个.node文件扩展名.我怎么能运行node_mouse?我看了这个,我认为它可能是用C++编写的插件,但我不完全确定(Node addons)

Chr*_*isM 8

是的,这些 .node 文件是 Node Addons(二进制模块),您应该可以直接使用require()它们。请注意,它将首先查找.json.js文件。

文档

已编译的 Addon 二进制文件的文件扩展名是 .node(与 .dll 或 .so 相反)。编写 require() 函数以查找具有 .node 文件扩展名的文件并将其初始化为动态链接库。

调用 require() 时,通常可以省略 .node 扩展名,Node.js 仍会找到并初始化插件。然而,一个警告是 Node.js 将首先尝试定位和加载碰巧共享相同基本名称的模块或 JavaScript 文件。例如,如果在与二进制 addon.node 相同的目录中有一个文件 addon.js,那么 require('addon') 将优先加载 addon.js 文件并加载它。

您还应该知道这些是二进制模块,因此加载它们很像运行标准的可执行文件(.exe如果您熟悉 Windows,请考虑文件)。与本机可执行文件一样,它们更依赖于系统的详细信息,并且还存在潜在的安全风险。虽然标准.js模块是可移植的(有一些注意事项),但.node二进制模块将从根本上为特定的机器架构和操作系统构建,通常甚至是特定版本的 Node.js。如果您在加载二进制模块时遇到问题,您应该确保您正在为您的系统运行正确的版本,并与提供商确认您的系统确实受支持。

有时特定的功能或性能需要需要它,但使用 Node.js 你不应该加载二进制模块,除非你真的必须这样做。


Jac*_*ade 5

是的,正常的“require”用法适用于 .node 文件。这些文件的目的是创建可移植的二进制文件(使用 node-gyp,来自 C++),可以像普通节点一样被引用。请参阅节点插件文档的 hello.js 部分:

const addon = require('./build/Release/addon');

console.log(addon.hello());
Run Code Online (Sandbox Code Playgroud)

在查看这个 NPM 库后,它在我的 Windows、Mac 和 Linux 虚拟机上正确加载到具有多个不同节点版本的节点上,但二进制文件引发了一系列错误。在 windows 上,它有一个特定版本的 windows 作为构建目标(可能是 NT,因为 windows 10 会引发错误):

Error: %1 is not a valid Win32 application.
Run Code Online (Sandbox Code Playgroud)

在 OS X 上,这是 dyld 无法打开二进制文件引用的共享库。(参见 man dlopen):

Error:dlopen(/.../node_mouse/node_mouse.node, 1): no suitable image found. 
Run Code Online (Sandbox Code Playgroud)

在 Linux 上,我们收到一个 ELF 标头错误,它告诉我们二进制文件无法在此操作系统上运行。

Error: /app/available_modules/1484064894000/node_mouse/node_mouse.node: invalid ELF header
Run Code Online (Sandbox Code Playgroud)

笔者看来,做了很多的Windows NT工作,所以如果你真的需要这方面的工作,找到Windows NT的全新副本的所有开发附加功能。

最后,考虑在您的代码库中运行第三方闭源二进制文件的安全风险(尤其是那些控制鼠标移动的)。

  • “在 Windows 上,它有一个特定版本的 Windows 作为构建目标(可能是 NT,因为 Windows 10 引发错误)”没有意义,因为 Windows 10 是 Windows NT 的一个实例。您可能没有意识到,没有一个“Windows NT”名称适用于所有非基于 DOS 的 Windows 版本,其中包括从 Windows XP 开始的所有消费者、服务器和嵌入式版本。 (2认同)