在 Nodejs 插件上使用什么。 Node.h 或 Napi.h

What to use on Nodejs addons. Node.h or Napi.h

我有一些非常简单的问题。

  1. node.h 和 napi.h 之间的主要区别是什么。
  2. 我应该为 normal/personal 用例使用什么。
  3. 为什么有更多的“nodejs”headers。 (node.h, napi.h, nan.h, node_api.h, ...)

我已经在 Internet 上寻找这些问题的答案,但我能找到任何答案。 如果这是必须知道的事情之一,我很抱歉,但我最近开始使用插件。

node.h 和 napi.h 之间的主要区别是什么。

参考nodejs doc (https://nodejs.org/dist/latest/docs/api/n-api.html#node-api) : (napi.h) 它独立于底层JavaScript运行时(例如V8)并被维护作为 Node.js 本身的一部分。

当你使用 node.h 编写节点插件时,你必须处理 v8 的东西,你的代码将与 v8 耦合。使用 napi.h(或 node_api.h napi.h 的 c++ 包装器)移除与 v8 的耦合,因此如果节点团队决定移动到另一个 javascript 后端(他们永远不会这样做,但如果他们这样做了)那么您的代码仍然可以工作而无需任何更新。

Node.js 插件有四种不同的界面

  • 根本没有接口的原始 node.h (C++) - 在这种情况下,您将不得不处理不同的 V8/Node.js 版本- 这非常困难和繁琐;
  • 旧的 Node.js Nan (C++) 仍在维护,它允许您在所有 [=38= 中使用统一的 C++ API ] 版本 - 但它要求你的插件是为每个 Node.js 版本单独构建的,并且不支持 worker_threads;
  • 新的 napi.h (C) 具有跨所有版本的统一 ABI - 这意味着为一个版本构建的二进制模块将适用于所有后续版本;
  • 最新的 Node Addon API (C++),它是围绕 napi.h 的一组 C++ 类,允许您使用 N API 具有 C++ 语义。它与 napi.h 完全兼容,您可以混合使用两者。

对于新模块,Node Addon API 是迄今为止最好的选择。