节点JS插件-NAN与N-API?

时间:2019-02-18 05:28:37

标签: node.js node.js-addon

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

两者的利弊是什么?如何在它们之间进行选择?

到目前为止,我发现NAN有更多关于异步调用的在线教程/文章。但是Node正式支持N-API(尽管不确定,它是在NAN之后创建的,是更好的选择)。

3 个答案:

答案 0 :(得分:5)

我的理解是:

N-API已添加到v8.0.0的核心node.js接口中。引用该文档,“这是为了使Addons与基础JavaScript引擎的更改保持隔离……”它还围绕缓冲区和异步工作(这应有助于避免在其Implications of ABI stability部分中提到的一些底层的不稳定API)提供其他包装器。

nan (Native Abstractions for Node)确实是较旧的,因此也支持旧版本的node.js-回到node.js 0.8!现在,尽管作者声称back in 2017

  

正如我在其他地方提到的,N-API并不意味着可以直接用于任何事物。这个概念从何而来?它是(有效内部的)低层基础结构层,旨在提供ABI稳定性。

...在官方的Node.js附加文档中,我没有看到太多关于这种效果的警告。也许this other comment更具洞察力:

  

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

同样,那是在2017年6月,当时是nan的维护者。似乎node-addon-api在此期间已经成熟并保持活动状态。实际上,我发现a comment in the -addon-api repo目前只有一个月的时间:

  

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

所以我认为答案是:

  • 如果需要成熟且向后兼容的软件,请使用nan
  • 如果要在C ++中具有前瞻性,请使用node-addon-api
  • 如果您愿意使用C并处理可能的低级问题,请使用N-API

答案 1 :(得分:2)

如果要启动新的本机模块,则可以考虑 N-API (或 node-addon-api ),它是基于C的N上的C ++包装器-API)。希望本文可以帮助您使您对此有所了解,也可以让您快速入门。
https://github.com/msatyan/MyNodeC

答案 2 :(得分:0)

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

  

N-API的给定版本 n 将在发布该版本的Node.js的主要版本以及所有后续的Node.js版本(包括后续的主要版本)中提供。

compatibility matrix here有点令人困惑。例如,N-API版本3与Node.js v8.11.2 +,v9.11.0 +和所有更高的主要版本(v10 +)兼容。

最重要的是,node-addon-API修复了NAN中许多烦人的部分(例如,缓冲区始终是char*而不是uint8_t*)。


当然,NAN仍然有效,并且在线上有更多的学习资源,但是node-addon-API是前进的方向。