构建node的原生插件-配置c++和python环境
需要提前安装visual studio 和 python
如何安装这两个依赖,可以关注我后续的文章介绍~!
0. 查看visual studio版本
- 我使用的vs版本是
2019 - 此外使用的python版本为
3.7.4
1. 先构建工程结构 bash启动
npm install node-gyp --global
cd /f
mkdir my-sqlite
cd my-sqlite
touch .npmrc
echo msvs_version=2019 > .npmrc
2. 项目初始化
yarn init -y
npm install --msvs_version=2019
3. 查看node版本
node -v # v16.20.1 我的node版本是16.20.1,注意接下来的步骤要保证版本的一致性
4. 离线下载资源
从 https://nodejs.org/download/release/v16.20.1 这个远程地址中:
下载 node-v16.20.1-headers.tar.gz
下载 SHASUMS256.txt
下载 win-x64/node.lib
下载完之后, 将node-v16.20.1-headers.tar.gz在项目根目录(my-sqlite)下解压缩得到*node-v16.20.1*目录
5. 在.npmrc中增加配置
echo 'nodedir=F://my-sqlite//node-v16.20.1' >> .npmrc
6. 在node-v16.20.1下面创建子目录release
mkdir node-v16.20.1/release # 没错就是在解压得到的目录下创建子目录
7. 子目录release
将下载的SHASUMS256.txt和node.lib放到子目录node-v16.20.1/release下,注意两个文件是在同一目录下!这个和下载地址的文件结构不同,不要参考远程地址的文件结构。
8. 创建模组开发目录
mkdir addon
cd addon
# addon.cpp
touch addon.cpp
# addon.cpp的内容
cat <<EOT >> addon.cpp
#include <node.h>
// 使用宏定义来声明一个返回字符串的函数
#define ADDON_FUNCTION(name) \\
void name(const v8::FunctionCallbackInfo<v8::Value> &args) \\
{ \\
v8::Isolate *isolate = args.GetIsolate(); \\
args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, "Hello from " #name).ToLocalChecked()); \\
}
// 在这里可以添加自定义的功能函数
ADDON_FUNCTION(MyFunction)
// 初始化 addon 模块
void InitializeAddon(v8::Local<v8::Object> exports)
{
NODE_SET_METHOD(exports, "myFunction", MyFunction);
}
// 定义 addon 模块
NODE_MODULE(addon, InitializeAddon)
EOT
# binding.gyp
touch binding.gyp
# binding.gyp的内容
echo '{
"targets": [
{
"target_name": "addon",
"sources": ["addon.cpp"]
}
]
}' > binding.gyp
9. 配置
npx node-gyp configure
10. 打包
# ATTENTION! 文件行尾序列一定要保证是CRLF格式的
npx node-gyp build
11. 测试使用
# 创建测试文件
touch test.js
# 测试文件中的内容
cat <<EOT >> test.js
const { myFunction } = require("./build/Release/addon.node");
console.log("myFunction: ", myFunction);
console.log("myFunction call: ", myFunction());
EOT
12. 测试结果
node test.js
>>> 结果:
myFunction: [Function: myFunction]
myFunction call: Hello from MyFunction