Skip to content

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-api

3. 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 build

5. Node.js 中使用

js
const addon = require('./build/Release/addon.node')
console.log(addon.hello())  // 'hello from c++'

使用场景

  • 加密/压缩等 CPU 密集计算
  • 图像/视频处理
  • 调用已有 C/C++ 库
  • 性能敏感的逻辑