Electron 应用启动太慢,怎么优化主进程加载速度?

逸龙 Dev 阅读 5

我用 Electron 做了个桌面应用,但每次启动都要等好几秒,感觉卡在主进程加载了。试过把 require 放到 ready 之后,还是没明显改善。

现在主进程里引入了不少模块,比如 const { app, BrowserWindow, ipcMain } = require('electron'),还有自己写的 config、db 连接之类的。是不是这些同步操作拖慢了启动?有没有办法延迟加载或者用异步方式提速?

另外看到有人提 preload 脚本会影响性能,但我还没动那块,主要是主进程一跑就慢。求真实可行的优化方案!

我来解答 赞 7 收藏
二维码
手机扫码查看
1 条解答
Good“树珂
主进程启动慢,基本就是两件事卡着:要么是同步IO操作,要么是模块加载时自动执行的代码。

先说一个你可能忽略的点:require本身不慢,但模块里的同步操作才要命。你引进的config、db这些,模块一加载就执行了连接或读取,这就是拖慢的原因。

懒加载是核心思路,改一下你的代码结构:

// 改成这样,不要在文件顶部直接require
let config = null;
let db = null;

// 需要用的时候再加载
function getConfig() {
if (!config) {
config = require('./config');
}
return config;
}

function getDb() {
if (!db) {
const Database = require('./db');
db = new Database();
}
return db;
}


db连接这种异步操作,别在app ready之前做,放到ready回调里:

const { app, BrowserWindow } = require('electron');

let mainWindow;

app.whenReady().then(async () => {
// db连接放到这里,等appready之后
const db = require('./db');
await db.connect();

mainWindow = new BrowserWindow({...});
});


再检查一下你的模块里有没有同步阻塞:

// 这种同步读取文件会卡启动
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('./config.json', 'utf8')); // 改成异步

// 改成这样
const fs = require('fs').promises;
const config = JSON.parse(await fs.readFile('./config.json', 'utf8'));


还有一点,如果你用了babel或webpack打包,检查一下是不是打包体积太大。可以用electron-builder的分析功能看看,打包后main进程的代码量。

最后一个小技巧,可以在主进程开头加个console.time标记,看看具体卡在哪一步:

console.time('main-process-start');
// 你的代码
console.timeEnd('main-process-start');


基本上就这样,核心就是:同步操作异步化、模块懒加载、减少启动时的初始化工作。db连接、config读取这些大头改完,启动应该会快不少。
点赞
2026-03-16 17:09