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
nan(Node.js 的原生抽象)- 直接使用内部的 V8、libuv 和 Node.js 库
除非需要直接访问 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.】