這幾天在看 Node.js 的官方文檔,看到了 C++ 插件部分,由于很久沒有接觸 C/C++ 了,看起來着實吃力,決定寫一個 Hello World 後跳過該部分。
在 Node.js 上使用 C++,需要用 node-gyp 工具對 C++ 檔案進行編譯,是以首先要安裝 node-gyp :
然後在項目目錄下寫一個 hello.cc 檔案:
#include <node.h>
namespace demo{
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
using v8::Number;
// Method1 實作一個 輸出"hello world ONE !" 的方法
void Method1(const FunctionCallbackInfo<Value>& args){
Isolate* isolate = args.GetIsolate();
args.GetReturnValue().Set(String::NewFromUtf8(isolate, "hello world ONE !"));
}
// Method2 實作一個 加一 的方法
void Method2(const FunctionCallbackInfo<Value>& args){
Isolate* isolate = args.GetIsolate();
// 擷取參數,js Number 類型轉換成 v8 Number 類型
Local<Number> value = Local<Number>::Cast(args[]);
double num = value->NumberValue() + ;
// double 轉 char*,這裡我不知道有沒有其他辦法
char buf[] = {};
sprintf(buf,"%f", num);
args.GetReturnValue().Set(String::NewFromUtf8(isolate, buf));
}
void init(Local<Object> exports){
NODE_SET_METHOD(exports, "hello1", Method1);
NODE_SET_METHOD(exports, "addOne", Method2);
}
NODE_MODULE(addon, init)
}
按照我的了解,Method1、Method2就是我們為這個 C++ 插件提供的功能,其參數是個回調函數,args.GetReturnValue().Set() 方法應該是輸出了這個函數的傳回值,也就是在 js 中調用這個函數得到相應傳回值。
Node.js插件必須導出一個具有如下模式的初始化函數:
void Initialize(Local<Object> exports);
NODE_MODULE(module_name, Initialize)
官網上說 NODE_MODULE 後面沒有分号,因為他不是一個函數(一臉懵逼)。在上面的 hello.cc 檔案中,初始化函數是 init,插件子產品名為 addon。NODE_SET_METHOD 是對插件輸出的函數命名。
接下來就要對這個檔案編譯成 Node.js 的插件了,首先需要一個配置檔案。在項目目錄中建立一個 binding.gyp 的檔案,這個檔案會被 node-gyp 使用到:
{
"targets": [
{
"target_name": "addon",
"sources": ["hello.cc"]
}
]
}
然後在項目目錄下使用 node-gyp configure 指令,這樣在 Windows 上會得到一個 build 檔案夾:
build
│ addon.vcxproj
│ addon.vcxproj.filters
│ binding.sln
│ config.gypi
│
└─Release
└─obj
└─addon
└─addon.tlog
然後繼續使用 node-gyp build 指令,成功後在 build/Release 檔案夾下有個 addon.node 的二進制檔案,這就是最終得到的 C++ 插件,可以在 js 中調用下:
const addon = require('./build/Release/addon.node');
console.log(addon.hello1());
console.log(addon.addOne());
輸出:
hello world ONE !
到此一個 Node.js 中 C++ 插件的 Hello World 結束。