Electron解决“NODE_MODULE_VERSION xxx”不匹配的问题

问题背景

在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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值