Electron iohook编译方案
一、 iohook介绍
Node.js 全局本地键盘和鼠标监听器,同样适用于Electron。
二、 ABI介绍
原生Node.js模块由Electron支持,但由于Electron具有与给定Node.js不同的 应用二进制接口 (ABI)(由于使用Chromium的 BoringSL 而不是 OpenSSL 等 差异),您使用的原生模块需要为Electron重新编译。 否则,当您尝试运行您的应用程序时, 将会遇到以下的错误:
Error: The module '/path/to/native/module.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION $XYZ. This version of Node.js requires
NODE_MODULE_VERSION $ABC. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
2.1 Electron的ABI版本
通过node-abi库(npm库)进行获取。
2.2 Node.js的ABI版本
通过node-abi库(npm库)进行获取,或者通过process.versions.modules获取。
三、 针对Electron的编译方案
由于iohook官方的github仓库很难编译出适用于Electron 22.3.4版本的C++ Addon,于是改用下面的两个库进行编译。
3.1 Mystk/iohook库
该仓库是fork的iohook仓库,能编译出4.0.0版本到22.0.0版本的Electron C++ Addon。
3.1.1编译ia32架构
$ cd D:/case-study
$ mkdir electron-iohook-ia32-demo
$ cd electron-iohook-ia32-demo
$ npm init -y # 初始化编译项目,在该步骤中,修改package.json,新增如下配置:
"iohook": {
"targets": [
"node-93",
"electron-110"
],
"platforms": [
"win32"
],
"arches": [
"x64",
"ia32"
]
}
$ mkdir node_modules
$ cd node_modules
$ git clone https://github.com/MystK/iohook.git # 克隆仓库
$ cd iohook
$ nvm use 16.17.1 32 # 切换编译环境为ia32
$ yarn # 给仓库安装编译所需的依赖
$ export npm_config_target=22.3.4 # 设置环境变量
$ export npm_config_arch=ia32
$ export npm_config_target_arch=ia32
$ export npm_config_disturl=https://electronjs.org/headers
$ export npm_config_runtime=electron
$ export npm_config_build_from_source=true
$ npm run build # 执行编译脚本
3.1.2编译x64架构
$ cd D:/case-study
$ mkdir electron-iohook-x64-demo
$ cd electron-iohook-x64-demo
$ npm init -y # 初始化编译项目,在该步骤中,修改package.json,新增如下配置:
"iohook": {
"targets": [
"node-93",
"electron-110"
],
"platforms": [
"win32"
],
"arches": [
"x64",
"ia32"
]
}
$ mkdir node_modules
$ cd node_modules
$ git clone https://github.com/MystK/iohook.git # 克隆仓库
$ cd iohook
$ nvm use 16.17.1 64 # 切换编译环境为x64
$ yarn # 给仓库安装编译所需的依赖
$ export npm_config_target=22.3.4 # 设置环境变量
$ export npm_config_arch=x64
$ export npm_config_target_arch=x64
$ export npm_config_disturl=https://electronjs.org/headers
$ export npm_config_runtime=electron
$ export npm_config_build_from_source=true
$ npm run build # 执行编译脚本
3.1.3编译产物以及使用方式
至此,已完成iohook的全部编译工作,包含ia32和x64两种架构的Electron C++ Addon,分别在如下的两个项目中:
● D:/case-study/electron-iohook-ia32-demo
● D:/case-study/electron-iohook-x64-demo
编译的产物在均在各自项目的node_modules/iohook/build/release目录里,包含iohook.node和uiohook.lib两个文件。使用时,需要通过node_modules/iohook/index.js进行引用。在node_modules/iohook/index.js中有一处代码需要注意,就是拼接modulePath变量的地方,这里使用了process.arch进行拼接,注意,在windows平台下,不论当前的编译环境是ia32或者是x64,该值均返回ia32,因此这里是不正确的。因此需要对这里进行改造,鉴于此情况,我把iohook编译后的产物单独封装成了一个小的插件进行使用,目录如下:
上述的demo示例是根据x64的情况进行封装的。那么在有的项目里,需要同时兼容32位和64位的系统该怎么办?此时应该在项目里封装iohook-x64和iohook-x86插件,根据当前的arch架构,来决定引用哪一个插件即可。关于早node中如何精确判断arch,上面已经说过了,不要使用process.arch进行判断,可以自己在网上搜索一下如何在node环境中精确判断arch架构。
3.2 arifnpm/iohook库
该仓库是fork的iohook仓库,并编译出来了多个版本的Addon可供直接使用。
四、 针对Node.js的编译方案
针对纯Node.js环境(非Electron项目)的编译非常简单,过程如下:
$ cd D:/case-study
$ mkdir node-iohook-ia32-demo
$ cd node-iohook-ia32-demo
$ npm init -y
$ mkdir node_modules
$ cd node_modules
$ git clone https://github.com/wilix-team/iohook.git
$ cd iohook
$ nvm use 16.17.1 ia32
$ cp build_def/win32/binding.gyp ./bingding.gyp
$ cp build_def/win32/uiohook.gyp ./uiohook.gyp
$ npm run build
以该种方式编译出来的产物在build/release/目录中。
五、 被隐藏的node-gyp
为什么要说是被隐藏的node-gyp,因为在三、四中讲到的编译方式,全都没有直接涉及到node-gyp命令行的使用,所以这里要特别介绍一下node-gyp。node-gyp是C++ Addon的编译工具,要想把自己编写的C或C++代码编译成Node Addon插件,就必须使用node-gyp进行编译。node-gyp的使用方式请参考node官方文档的介绍nodejs.org/docs/latest…和nodejs.org/docs/latest…。
关于node-gyp的核心内容,有以下四点:
● 在项目根目录中必须要要有一个binding.gyp的编译入口文件。
● 使用node-gyp configure命令生成编译配置文件。
● 使用node-gyp build命令进行编译。
● 编译后的文件在build/release/目录中。
上述第三、第四节中讲到的npm run build命令,调用的是node_modules/iohook/build.js脚本,build.js脚本进行编译时使用的就是node-gyp工具,可以自行阅读node_modules/iohook/build.js源码了解详细情况。
六、 参考链接
● Electron官网关于Node原生模块的编译介绍
www.electronjs.org/zh/docs/lat…
● Node ABI介
● node-gyp介绍
github.com/nodejs/node… nodejs.org/docs/latest… nodejs.org/docs/latest…
转载自:https://juejin.cn/post/7377439806135910452