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.
实现插件有三种选项:Node-API、nan 或直接使用内部的 V8、libuv 和 Node.js 库。除非需要直接访问 Node-API 未公开的功能,否则应使用 Node-API。有关 Node-API 的更多信息,请参阅 使用 Node-API 的 C/C++ 插件。
🌐 There are three options for implementing addons: Node-API, nan, or direct use of internal V8, libuv, and Node.js libraries. 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 is complicated, involving knowledge of several components and APIs:
- V8:Node.js 使用的 C++ 库,用于提供 JavaScript 实现。V8 提供了创建对象、调用函数等的机制。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类。 - Node.js 包含其他静态链接的库,包括 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.