千里之行,从写一个 node addon 开始。因为需要一个执行 Win32 API 的项目开展实验和测试。容易混淆的 3 个概念:c++ addons api, N-API, node-addon-api. 简单地说,c++ addons api 表示最底层 api,直接从它来写会非常复杂。N-API 在这前者之上做了一层抽象,解决了不同版本兼容的问题,但也还是很复杂,基于c 的实现。而 node-addon-api 是N-API 的 C++封装,用起来相对容易很多。所以我们选择了 node-addon-api 来开发。
1 开发环境:
在此假设你已经安装了 git 和 node。在命令行执行
npm
install
--global --production windows-build-tools
将安装 vs build tools 和 python,cc,make 用于编译。
编写代码可以使用任意的你喜欢的编辑器。个人偏爱 vs code。
2 第一个项目
安装脚手架
npm install -g yo // 国内网络困难请用 npm --registry https://registry.npm.taobao.org install -g yo
npm install -g generator-napi-module
生成 node addon 项目
mkdir win32-printer
cd win32-printer
yo napi-module
报告错误yo : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yo.ps1,因为在此系统上禁止运行脚本解决方法:用管理身份打开 powershell,执行命令set-ExecutionPolicy RemoteSigned将计算机上的 执行策略更改为 RemoteSigned。检查:get-ExecutionPolicy
运行测试一下
命令
npm test
出现
Tests passed- everything looks OK!
说明编译环境搭建无误了。
3 修改项目
添加编译指令
修改 package.json 的内容:
"scripts": {
// 添加的内容
"build": "node-gyp build",
"start": "node --napi-module ./test/run.js”,
"test": "node --napi-modules ./test/test_binding.js"
},
添加文件 ./src/run.js
const Win32Printer = require("../lib/binding.js");
const result = Win32Printer("hello");
console.log(result)
修改下 src/win32_printer.cc
const Win32Printer = require("../lib/binding.js");
// 把 return 的文本改了一下
const result = Win32Printer("hello");
console.log(result)
编译和执行
命令执行
npm run build
npm run start
屏幕打出 mini world 编译执行成功