23

我正在寻找使用带有 C++ 的节点 js 插件的项目。我遇到了两个可以使用的抽象库 NAN 和 N-API。但是我无法决定应该使用哪一个。我无法在这两个库之间找到适当的比较。

两者的优缺点和区别是什么?如何在它们之间进行选择?

到目前为止,我发现 NAN 有更多关于异步调用的在线教程/文章。但是 N-API 得到了 Node 的官方支持(并且是在 NAN 之后创建的,作为一个更好的选择,虽然不确定。)

4

2 回答 2

25

我的理解是这样的:

N-API被添加到 v8.0.0 的核心 node.js 接口中。“它旨在将插件与底层 JavaScript 引擎的变化隔离开来……”引用文档。它还提供了一些其他包装器,例如缓冲区和异步工作(这应该有助于避免在其“ABI 稳定性的影响”部分中提到的一些底层非稳定 API)。

nan(Native Abstractions for Node)确实更老,所以也支持旧版本的 node.js——回到 node.js 0.8!现在,尽管它的作者在 2017 年声称:

正如我在其他地方提到的,N-API 并不意味着直接用于任何事情。这个观念是从哪里来的?它是一个(实际上是内部的)低级基础设施层,旨在提供 ABI 稳定性。上面会有另一层。

…我在官方的 Node.js 附加文档中没有看到太多关于这种效果的警告。也许其他评论更有见地:

是的,您仍应将 NAN 用于生产用途。它涵盖了 Node.js 的每个相关版本。另请注意,N-API 不适用于最终用户。您最终应该使用https://github.com/nodejs/node-addon-api

再一次,那是 2017 年 6 月,当时 nan 的维护者。与此同时,node-addon-api 似乎已经成熟并保持活跃。事实上,我在 -addon-api repo 中发现了一个目前只有一个月大的评论:

…部分目标是让从 nan 的过渡变得容易。

所以我认为答案是:

  • nan如果您想要成熟且非常向后兼容的东西,请使用
  • node-addon-api如果您想要 C++ 中的前瞻性内容,请使用
  • N-API如果您愿意在 C 中工作并处理可能的较低级别的问题,请使用
于 2019-02-28T23:46:53.843 回答
6

您应该将node-addon-API模块用于新的 C++ 代码(或 N-API 用于 C 代码)。所有受支持(非 EOL)的 Node.js 版本都支持它,它使维护和分发本机插件变得NODE_MODULE_VERSION更加容易:而使用 NAN 的插件需要为每个(Node.js 的主要版本)重建模块,使用 N 的模块-API/Node-Addon-API 是前向兼容的:

N-API的给定版本n将在发布它的 Node.js 的主要版本以及所有后续版本的 Node.js 中可用,包括后续主要版本。

这里有一个有点令人困惑的兼容性矩阵。例如,N-API 版本 3 与 Node.js v8.11.2+、v9.11.0+ 和所有后续主要版本 (v10+) 兼容。

最重要的是,node-addon-API 修复了 NAN 的许多烦人的部分(比如 Buffers 总是char*代替,比如说uint8_t*)。


NAN 当然还是可以的,网上的学习资源也比较多,但是 node-addon-API 是前进的方向。

于 2019-12-21T22:52:15.837 回答