问题背景
在windows搭建Electron环境时,遇到如下问题:
NODE_MODULE_VERSION 108. This version of Node.js requires
NODE_MODULE_VERSION 110. Please try re-compiling or re-installing
问题原因
Electron的发布版本和NodeJs的发布版本的NODE_MODULE_VERSION不一致,例如:
上文中,我的Electron的发布版本是22,对应的NODE_MODULE_VERSION是108,而NodeJs的版本是18,对应的NODE_MODULE_VERSION是110,而两者都是官方版本。
解决思路
用NodeJs重新构建Electron,使两者NODE_MODULE_VERSION版本统一。
具体方案
cnpm install --save-dev electron-rebuild
.\node_modules\.bin\electron-rebuild.cmd
.\node_modules\.bin\electron.cmd .
结果验证
用个hello world试一下。
#官网下载安装node并验证
node -v
npm -v
#国内用cnpm加速
npm install cnpm -g --registry=http://registry.npm.taobao.org
#到gitee或者github上下载electron-quick-start,需要手动搜索下
git clone xxx/xxx/electron-quick-start.git
#首次构建验证Electron环境,install受网络影响,遇到Cannot find module,删除node_modules目录后,多试几次
cnpm install && cnpm start
#在根目录创建binding.gyp,后面详细解
#在根目录创建hello.cc,后面详细解
#main.js里添加c++函数,后面详细解
#执行构建脚本
node-gyp configure
node-gyp build
.\node_modules\.bin\electron-rebuild.cmd
#运行程序
.\node_modules\.bin\electron.cmd .
binding.gyp
{
"targets": [{
"target_name": "addon",
"sources": [ "hello.cc"]
}]
}
c++的插件名称是addon,源文件是hello.cc。
hello.cc
// hello.cc
#include <node.h>
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
args.GetReturnValue().Set(true);
}
void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, init)
}
main.js
const { app, BrowserWindow } = require('electron')
const path = require('path')
function createWindow() {
/* 创建一个浏览器窗口。*/
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
//测试Electron的c++调用
const addon = require('./build/Release/addon');
console.log(addon.hello());
}
控制台输出
electron .
true
其他事项
package.json
增加start和rebuild指令后,可以通过cnpm run rebuild或者cnpm run start执行。
"scripts": {
"start": "electron .",
"rebuild": "electron-rebuild -f -w addon"
}
electron版本
"scripts": {
... ...
}
"devDependencies": {
"electron": "22.0.0",
"electron-packager": "^15.4.0"
}
cnpm
cnpm执行遇到无法加载文件问题时,解决方法是PowerShell里面执行。
set-ExecutionPolicy RemoteSigned
#然后选A
完成控制台的授权。
node-gyp
js加载c++前,低版本node js需要执行如下指令,而nodejs 18以上不需要单独执行。
cnpm install -g --production windows-build-tools
cnpm install -g node-gyp