You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron中使用npm deasync模块导致渲染进程崩溃问题求助

解决Electron渲染进程因deasync崩溃的问题

先梳理下你的问题场景:

环境信息

  • 操作系统:Windows 10 Pro(x64)
  • Electron版本:1.7.9(也测试过1.8.3)
  • deasync模块版本:0.1.11、0.1.12

问题表现

将var deasync = require('deasync')作为预加载脚本引入BrowserWindow后,渲染进程会随机崩溃,且每次从锁屏会话恢复后必现,重现步骤为:

  1. 运行应用
  2. 锁定系统会话
  3. 解锁会话
  4. 渲染进程崩溃

问题根源

deasync的底层是通过劫持Node.js事件循环实现异步转同步,而Windows锁屏恢复时,Electron渲染进程会进行线程状态重置与资源重新分配,两者的机制冲突直接导致了崩溃。

可行的解决办法

  1. 彻底替换deasync(最推荐)
    deasync这种强行异步转同步的模块本身就不符合Node.js/Electron的异步设计理念,建议用async/await或Promise重构代码,比如:
async function handleAsyncTask() {
  try {
    const data = await yourAsyncFunction();
    // 这里编写原同步逻辑
  } catch (err) {
    console.error(err);
  }
}

这种方式不仅能规避崩溃问题,代码可读性和维护性也会提升。

  1. 调整deasync加载时机
    不要在预加载脚本中直接引入deasync,等渲染进程完全初始化后再加载:
window.addEventListener('DOMContentLoaded', () => {
  // 页面DOM加载完成后再引入deasync
  const deasync = require('deasync');
  // 在这里使用deasync功能
});

预加载脚本是Electron渲染进程启动初期执行的,这个阶段引入deasync极易和初始化逻辑冲突,延后加载能避开风险。

  1. 更换deasync版本或替代模块
    可以尝试降级到deasync 0.1.10版本,该版本在旧版Electron上兼容性可能更好;如果是为了处理同步竞争场景,也可以换成async-lock这类更安全的模块。

  2. 针对锁屏场景做兼容处理
    监听Windows锁屏/解锁事件,在解锁后重置deasync状态:

// 主进程中监听系统解锁事件
const { powerMonitor } = require('electron');
powerMonitor.on('unlock-screen', () => {
  // 通知渲染进程重置deasync
  mainWindow.webContents.send('reset-deasync-module');
});

// 渲染进程中接收消息并处理
const { ipcRenderer } = require('electron');
ipcRenderer.on('reset-deasync-module', () => {
  // 清除模块缓存,重新加载deasync
  delete require.cache[require.resolve('deasync')];
  const deasync = require('deasync');
  // 重新初始化相关功能
});

这样能在锁屏恢复后重新初始化deasync,避免状态冲突导致崩溃。

内容的提问来源于stack exchange,提问作者Pasquale Vitale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:08:47