Node.js 的 C 扩展怎么写?怎么调用?
在 Node.js 中编写 C 扩展可以显著提高性能,特别是在处理计算密集型任务时。下面是一个简单的示例来说明如何编写和使用 Node.js 的 C 扩展。
1. 创建 C 源文件
首先,创建一个 C 文件(例如 addon.cc
),在这个文件中定义你的扩展函数。以下是一个简单的例子:
// addon.cc
#include <node.h>
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void Add(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
int a = args[0]->Int32Value(isolate->GetCurrentContext()).ToChecked();
int b = args[1]->Int32Value(isolate->GetCurrentContext()).ToChecked();
args.GetReturnValue().Set(a + b);
}
void Initialize(Local<Object> exports) {
NODE_SET_METHOD(exports, "add", Add);
}
NODE_MODULE(addon, Initialize)
2. 编译 C 扩展
为了编译这个 C 文件,你需要安装 node-gyp
工具。你可以通过 npm 安装它:
npm install -g node-gyp
然后,在包含 addon.cc
的目录中运行以下命令来配置和构建项目:
node-gyp configure
node-gyp build
这将生成一个动态链接库(例如 build/Release/addon.node
)。
3. 在 Node.js 中使用 C 扩展
现在你可以在 Node.js 中使用这个扩展了。创建一个 JavaScript 文件(例如 index.js
)并加载扩展:
const addon = require('./build/Release/addon');
console.log(addon.add(5, 3)); // 输出 8
总结
以上就是如何编写和使用 Node.js 的 C 扩展的基本步骤。关键点包括编写 C 代码、使用 node-gyp
进行编译,并在 Node.js 中加载生成的动态链接库。这种方法非常适合需要高性能计算的任务。
官方api上有的
要编写和调用 Node.js 的 C 扩展,可以使用 node-addon-api
或者直接使用 N-API
(Node-API)。以下是一个简单的示例,展示如何创建一个 C 扩展并从 Node.js 中调用它。
示例代码
1. 创建 C 扩展
首先,创建一个名为 addon.cc
的文件,内容如下:
#include <napi.h>
// 定义一个简单的 C 函数
double Add(double a, double b) {
return a + b;
}
// 绑定这个函数到 Node.js
Napi::Number AddWrap(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 2 || !info[0].IsNumber() || !info[1].IsNumber()) {
Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();
return Napi::Number::New(env, 0);
}
double a = info[0].As<Napi::Number>().DoubleValue();
double b = info[1].As<Napi::Number>().DoubleValue();
double result = Add(a, b);
return Napi::Number::New(env, result);
}
// 导出函数
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "add"),
Napi::Function::New(env, AddWrap));
return exports;
}
NODE_API_MODULE(addon, Init)
2. 编译扩展
确保安装了 node-gyp
,然后运行以下命令来编译扩展:
npm install -g node-gyp
cd path/to/your/project
node-gyp configure
node-gyp build
3. 在 Node.js 中调用扩展
创建一个 index.js
文件,内容如下:
const addon = require('./build/Release/addon');
console.log(addon.add(1.0, 2.0)); // 输出: 3
解释
addon.cc
文件中定义了一个简单的 C 函数Add
,该函数将两个双精度浮点数相加。- 使用
Napi::Function::New
将Add
函数绑定到 Node.js 中的一个 JavaScript 函数add
。 Init
函数用于导出add
函数。NODE_API_MODULE
宏用于指定模块名称和初始化函数。
通过这些步骤,你可以成功创建并调用一个 Node.js 的 C 扩展。这种方法非常适合需要高性能计算的任务,或者当你希望重用现有的 C/C++ 库时。