C++ 插件


【C++ addons】

Addons 是用 C++ 编写的动态链接共享对象。require() 函数可以像加载普通 Node.js 模块一样加载 addons。Addons 提供了 JavaScript 与 C/C++ 库之间的接口。

Addons are dynamically-linked shared objects written in C++. The require() function can load addons as ordinary Node.js modules. Addons provide an interface between JavaScript and C/C++ libraries.】

实现插件有三种选择:

【There are three options for implementing addons:】

除非需要直接访问 Node-API 未暴露的功能,否则应使用 Node-API。有关 Node-API 的更多信息,请参阅 使用 Node-API 的 C/C++ 插件

【Unless there is a need for direct access to functionality which is not
exposed by Node-API, use Node-API. Refer to C/C++ addons with Node-API for more information on Node-API.】

在不使用 Node-API 时,实现插件会变得更加复杂,需要了解多个组件和 API:

【When not using Node-API, implementing addons becomes more complex, requiring
knowledge of multiple components and APIs:】

  • V8:Node.js 使用的 C++ 库,用于提供 JavaScript 实现。它提供了创建对象、调用函数等机制。V8 的 API 主要在 v8.h 头文件中有文档说明(Node.js 源代码树中的 deps/v8/include/v8.h),也可以在 在线 获取。
  • libuv:一个实现 Node.js 事件循环、其工作线程以及平台上所有异步行为的 C 库。它还作为一个跨平台抽象库,提供类似 POSIX 的简便接口,使所有主要操作系统都能轻松访问许多常见的系统任务,例如与文件系统、套接字、定时器和系统事件的交互。libuv 还提供了类似 POSIX 线程的线程抽象,以支持需要超越标准事件循环的更复杂的异步插件。插件作者应避免通过 I/O 或其他耗时任务阻塞事件循环,而应通过 libuv 将工作卸载到非阻塞系统操作、工作线程或自定义的 libuv 线程中。
  • Node.js 内部库:Node.js 本身导出 C++ API,插件可以使用,其中最重要的是 node::ObjectWrap 类。
  • 其他静态链接库(包括 OpenSSL):这些其他库位于 Node.js 源代码树的 deps/ 目录中。只有 libuv、OpenSSL、V8 和 zlib 的符号是由 Node.js 有意重新导出的,并且可能在各种程度上被插件使用。有关更多信息,请参见 链接到 Node.js 中包含的库

以下所有示例均适用于 下载,并可用作插件的起点。

【All of the following examples are available for download and may be used as the starting-point for an addon.】