我正在寻找一个使用带有C ++的node js插件的项目。我遇到了两个我可以使用的抽象库NAN和N-API。但是,我无法决定应该使用哪一个。我找不到这两个库之间的适当比较。
两者的利弊是什么?如何在它们之间进行选择?
到目前为止,我发现NAN有更多关于异步调用的在线教程/文章。但是Node正式支持N-API(尽管不确定,它是在NAN之后创建的,是更好的选择)。
答案 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
node-addon-api
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是前进的方向。