c++组件
vscode开发需要安装Node.js Modules Intellisense组件
node写c++的组件,需要使用node-gyp:https://github.com/nodejs/node-gyp
安装node-gyp
npm install -g node-gyp
安装环境
还需要安装工具,这里以windows为例,
先安装python:我装了Python 3.8
安装 Visual C++ Build Environment:
可以使用visual studio install来安装:
如何写node组件
https://nodejs.org/api/n-api.html
Node-API介绍
我们使用Node-API不用v8api(因为v8api会在不同版本node.js下有兼容问题)
node-addon-api依赖
因为Node-Api只支持c语言的语法,为了支持c++,需要安装node-addon-api
https://github.com/nodejs/node-addon-api/blob/main/doc/setup.md
示例:
https://github.com/nodejs/node-addon-example
为了兼容不同的node.js版本,最好只包含一个头文件
#include <node_api.h>
Node-API的编译
Linux
For Linux developers, the necessary C/C++ toolchain packages are readily available. GCC is widely used in the Node.js community to build and test across a variety of platforms. For many developers, the LLVM compiler infrastructure is also a good choice.
Mac
xcode-select --install
Windows
visual studio c++ toos
node-gyp
node-pre-gyp
building.gyp文件
因为是从gyp-next来的
有个简单的文档
https://github.com/nodejs/gyp-next/blob/main/docs/UserDocumentation.md
例子:
https://github.com/nodejs/node-gyp/blob/main/docs/binding.gyp-files-in-the-wild.md
Hello world
建一个c++文件hello.cpp
#include <napi.h>
Napi::String Method(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
return Napi::String::New(env, "world");
}
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(hello, Init)
建一个binding.gyp(编译add one的配置)
{
"targets": [
{
"target_name": "hello",
"sources": [
"hello.cpp"
],
"dependencies": [
"<!(node -p \"require('node-addon-api').targets\"):node_addon_api"
]
}
]
}
再写一个index.js调用模块
const binding = require("./build/Release/hello");
console.log(binding.hello());
新建package.json用来编译和运行
{
"dependencies": {
"node-addon-api": "*"
}
"scripts": {
"start": "node index.js",
"build":"node-gyp configure &&node-gyp build"
}
}
执行编译命令
npm run build
运行
npm run start
说明
模块的入口
void Initialize(Local<Object> exports);//模块的Ini函数
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) //NODE_GYP_MODULE_NAME 模块名,指定模块的初始函数
hello.cc中的初始函数
void Initialize(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}
将方法method设到hello模块中
也可以使用Node-API(与javascript runtime无关)
napi_value init(napi_env env, napi_value exports)
NAPI_MODULE(NODE_GYP_MODULE_NAME, init)
node-pre-gyg使用
细节
async函数堆栈打印不完整
如下:没有定位到出错问题的stack
官方有此问题: