Node.js Addon(C++ 原生扩展)
Node.js I/O 强但 CPU 密集型任务弱,可通过 C++ 编写原生插件(Addon)弥补不足。编译后生成 .node 文件,直接 require 使用。
编译产物
| 平台 | 文件类型 |
|---|---|
| Windows | .dll |
| macOS | .dylib |
| Linux | .so |
最终都编译成 .node 扩展。
扩展编写方式
1. NAN(Native Abstractions for Node.js)
"一次编写,到处编译"。封装了不同 Node.js/V8 版本的 API 差异,保持兼容性。
2. N-API / node-addon-api
Node.js 官方推出的标准 API,独立于 V8,API 稳定不随版本变化。
sh
# C 风格(底层)
#include <node_api.h>
# C++ 封装(推荐)
npm install node-addon-api3. C++ Addon 基本结构
cpp
#include <napi.h>
Napi::String Method(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
return Napi::String::New(env, "hello from c++");
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "hello"),
Napi::Function::New(env, Method));
return exports;
}
NODE_API_MODULE(addon, Init) // 注册模块4. 编译配置(binding.gyp)
json
{
"targets": [{
"target_name": "addon",
"sources": ["addon.cpp"]
}]
}bash
npm install node-gyp -g
node-gyp configure && node-gyp build5. Node.js 中使用
js
const addon = require('./build/Release/addon.node')
console.log(addon.hello()) // 'hello from c++'使用场景
- 加密/压缩等 CPU 密集计算
- 图像/视频处理
- 调用已有 C/C++ 库
- 性能敏感的逻辑