Electron切换加载窗口与主窗口时出现ERR_FAILED (-2)加载错误如何解决
报错核心原因
该ERR_FAILED (-2)报错本质是Electron无法正常加载指定路径的loader.html文件,或异步逻辑冲突导致加载中断,可按以下步骤排查修复:
排查与修复方案
- 路径正确性验证
- 确认
loader.html实际存放路径和代码中拼接的路径一致:__dirname指向当前主进程JS文件所在的目录,若你的主进程代码存放在子目录(如src/main.js),拼接出来的路径会指向子目录内的loader.html,和实际存放位置不符就会报错。 - 新增路径打印验证,在
createLoaderWindow调用loadFile前添加代码:
console.log('loader.html路径:', path.join(__dirname, 'loader.html'))
运行后对比控制台输出的路径和文件实际路径是否完全匹配。
- 兼容Windows路径转义问题,可改用
path.normalize处理路径:
await loaderwin.loadFile(path.normalize(path.join(__dirname, 'loader.html')))
- 修复异步逻辑错误
你的代码中调用createLoaderWindow时没有加await,异步函数未执行完成就执行后续的loaderwin.close(),会导致loaderwin未完成初始化就被销毁,引发加载中断。修改自执行函数中的对应代码:
// 原代码:mainWindow = createLoaderWindow() // 修改为: mainWindow = await createLoaderWindow()
- 调整窗口生命周期逻辑避免冲突
你在loaderwin的closed事件中绑定了创建主窗口的逻辑,同时又在自执行函数中主动关闭加载窗口,会存在逻辑冗余,可优化加载流程提升体验:加载窗口显示后就并行预加载主窗口,异步任务执行完成后直接关闭加载窗口、显示已加载完成的主窗口,避免关闭加载窗口后出现空白等待期。
修改后的核心代码示例:
const createLoaderWindow = async () => { loaderwin = new BrowserWindow({ title: app.name, show: false, width: 600, height: 300, frame : false, webPreferences : { devTools : false } }); loaderwin.on('ready-to-show', () => { loaderwin.show(); }); loaderwin.on('closed', () => { loaderwin = undefined; }); const loaderPath = path.join(__dirname, 'loader.html'); console.log('加载器路径:', loaderPath); await loaderwin.loadFile(loaderPath); return loaderwin; } (async () => { await app.whenReady(); Menu.setApplicationMenu(null); // 等待加载窗口创建完成 mainWindow = await createLoaderWindow(); // 并行预加载主窗口,不阻塞异步任务执行 const mainWinPromise = createMainWindow(); // 执行初始化异步任务 await syncfunct(); require('./server.js')(); // 等待主窗口加载完成 const mainWin = await mainWinPromise; // 关闭加载窗口,显示主窗口 loaderwin.close(); mainWin.show(); })();
- 兜底排查方案
如果路径确认无误仍报错,可临时将loaderwin的webPreferences.devTools设为true,打开加载窗口的控制台查看具体报错:如果是loader.html内部引用的CSS、JS等资源路径错误,也会触发该加载报错。
内容的提问来源于stack exchange,提问作者Juliver Galleto
相关产品推荐
相关产品推荐

