使用c++开发node原生插件

1,075 阅读2分钟

构建node的原生插件-配置c++和python环境

需要提前安装visual studiopython 如何安装这两个依赖,可以关注我后续的文章介绍~!

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.txtnode.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