环境准备
- vscode安装(以下均在vscode中操作)
- node.js安装,版本不要太老
- c++工具链安装,安装Visual Studio2019社区版即可,或者执行
npm install --global windows-build-tools
(这个我没试过,windows喜欢用vs2019) - 安装编译构建工具
npm install -g node-gyp
项目初始化
- 新建文件夹 c2js ,命令行进入所在文件夹,执行
pnpm init
或者npm init
初始化 - 安装依赖
pnpm add node-addon-api
或npm install node-addon-api
- 按下ctrl+shift+P,搜索c++,添加
c_cpp_properties.json
文件
- 创建文件binding.gyp,文件内容如下:
{
"targets": [
{
"target_name": "napi_sample",
"sources": [ "src/main.cpp"],
"cflags!": [ "-fno-exceptions" ],
"cflags_cc!": [ "-fno-exceptions" ],
"defines": [ "NAPI_DISABLE_CPP_EXCEPTIONS" ],
"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")"
],
}
]
}
- 命令行执行
node-gyp configure
,没有binding.gyp文件会失败;执行之后将Dnode_root_dir(下图红色框)添加到c_cpp_properties.json
的includePath中。
至此,准备工作完成。
以下是我的开发环境版本信息,index.js中只有一行代码console.log(process.versions)
示例实战
- 新建文件夹
src
,并在src文件夹下新建文件main.cpp
,binding.gyp中的source即c++源文件
#include<napi.h>
int plus(int a, int b){
return a + b;
}
// 调用函数(我把c++函数独立出来了,个人风格)
Napi::Value add(const Napi::CallbackInfo& info){
Napi::Env env = info.Env();
Napi::EscapableHandleScope scope(env);
if (info.Length() < 2)
return Napi::Boolean::New(env, false);
int res = plus(info[0].As<Napi::Number>().Int64Value(), info[1].As<Napi::Number>().Int64Value());
return Napi::Number::New(env, res);
}
// 导出此函数
Napi::Object Init(Napi::Env env, Napi::Object exports)
{
// 第一个参数定义了导出的函数名
exports.Set(Napi::String::New(env, "add"), Napi::Function::New(env, add));
return exports;
}
// 第一个参数即为导出的模块名,与binding中的target_name对应
NODE_API_MODULE(napi_sample, Init);
在引入napi.h
的时候可能会飘红,鼠标移到红色线,点击quick fix选择第一个增加includePath即可。
我的c_cpp_properties.json
文件如下:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:\\Users\\11441\\AppData\\Local\\node-gyp\\Cache\\16.17.1",
"C:/Users/11441/AppData/Local/node-gyp/Cache/16.17.1/include/node"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}
- 命令行执行
node-gyp rebuild
进行构建,不报错即大功告成,如下图所示。
- 新建
index.js
文件,在命令行执行node index.js
。
// index.js
const {add} = require('./build/Release/napi_sample.node');
console.log(add(1, 2));
推荐阅读
- 从暴力到NAN再到NAPI————Node.js 原生模块开发方式变迁
- N-API官方文档
最后
关于如何在ts及react项目中引用尚在研究,umi脚手架中如何使用尚在研究(其中大概率会用到node-loader加载解析node文件)。