Electron自动更新时主进程阻塞导致界面卡死怎么办?

心虹🍀 阅读 37

在Electron应用中,当我点击检查更新按钮后,主进程被阻塞,界面卡死了。我尝试过把检查更新的代码放在setTimeout里,但还是不行。错误提示是“Failed to check for updates”,但日志里没更多信息。这是怎么回事?

我的代码是这样的:<pre class="pure-highlightjs line-numbers"><code class="language-javascript"><code class="language-html">&lt;button onclick="checkUpdate()"&gt;检查更新&lt;/button&gt;
&lt;script&gt;
const { ipcRenderer } = require('electron');
function checkUpdate() {
  ipcRenderer.send('check-update');
  // 尝试过这里加setTimeout也没用
}
&lt;/script&gt;</code></code></pre>
我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
慧娜 Dev
检查更新应该在主进程里异步执行,别在渲染进程用 setTimeout 耽误事。
主进程加个监听就行了:

const { ipcMain } = require('electron');
ipcMain.on('check-update', async () => {
// 这里调用 autoUpdater 检查更新
autoUpdater.checkForUpdates();
});
点赞 6
2026-02-04 22:27
萌新.文斌
这个问题挺常见的,主要是因为Electron的主进程在处理更新检查时,可能会占用主线程资源,导致界面卡死。直接用setTimeout并不能真正解决问题,因为它只是延时执行,但还是跑在主线程里。

### 第一步:把更新检查逻辑放到单独的子进程中
Electron的主进程是用来管理窗口和处理跨窗口通信的,所以尽量不要让它干太多重活。对于这种耗时任务,建议用Node.js的child_process模块创建一个子进程来专门处理更新检查。

修改你的主进程代码,大概这样写:
const { spawn } = require('child_process');
const path = require('path');

// 当渲染进程发送'check-update'信号时
ipcMain.on('check-update', (event) => {
// 启动一个子进程来检查更新
const updateChecker = spawn('node', [path.join(__dirname, 'update-checker.js')]);

// 子进程的标准输出会发回给渲染进程
updateChecker.stdout.on('data', (data) => {
event.reply('update-status', data.toString());
});

// 如果子进程出错,也通知渲染进程
updateChecker.stderr.on('data', (data) => {
event.reply('update-error', data.toString());
});

updateChecker.on('close', (code) => {
console.log(子进程退出,状态码 ${code});
});
});


这里我们用spawn启动了一个叫update-checker.js的子进程,这个文件专门用来做更新检查。

### 第二步:写一个专门的更新检查脚本
新建一个update-checker.js文件,内容大概是这样:
const { autoUpdater } = require('electron-updater');

autoUpdater.on('checking-for-update', () => {
process.stdout.write('正在检查更新...');
});

autoUpdater.on('update-available', () => {
process.stdout.write('发现新版本!');
});

autoUpdater.on('update-not-available', () => {
process.stdout.write('当前已是最新版本。');
});

autoUpdater.on('error', (err) => {
process.stderr.write(更新检查出错: ${err.message});
});

// 开始检查更新
autoUpdater.checkForUpdates();


这个脚本只负责检查更新,并通过标准输出/错误流把结果发回去。因为它是独立运行的,不会阻塞主进程。

### 第三步:在渲染进程中处理结果
你的HTML部分不用太大改动,只需要监听从主进程发回来的消息就行:
<button onclick="checkUpdate()">检查更新</button>
<script>
const { ipcRenderer } = require('electron');

function checkUpdate() {
ipcRenderer.send('check-update'); // 发送信号到主进程
}

// 监听更新状态
ipcRenderer.on('update-status', (event, message) => {
alert(message); // 弹出状态信息
});

// 如果有错误也捕获一下
ipcRenderer.on('update-error', (event, error) => {
console.error(error);
});
</script>


### 为什么这样做?
1. **避免阻塞主进程**:更新检查可能涉及到网络请求、版本对比等耗时操作,放在子进程里就不会影响主进程。
2. **清晰的责任划分**:主进程专注于窗口管理和消息传递,具体的业务逻辑交给独立的脚本处理。
3. **可维护性更强**:以后如果更新逻辑变复杂了,可以直接修改update-checker.js,不影响其他部分。

最后提醒一下,electron-updater模块需要正确配置才能正常工作,比如设置好发布服务器地址之类的。如果还是报“Failed to check for updates”,可以先检查网络或者配置是不是有问题。
点赞 2
2026-01-30 14:26