ES6的新特性
electron通信方式
electron的性能优化
Electron 性能优化
资源优化
渲染进程分离:
- 为每个窗口创建独立的渲染进程,避免内存资源的过度共享。
1
2
3
4
5
6
7
8
9let win = new BrowserWindow({
webPreferences: {
nodeIntegration: true,
contextIsolation: false, // 根据需求调整此选项
sandbox: false, // 根据需求调整此选项
preload: './preload.js',
partition: 'persist:window-id' // 使用唯一标识符区分渲染进程
}
});
- 为每个窗口创建独立的渲染进程,避免内存资源的过度共享。
资源压缩与缓存:
- 使用合适的图片格式(如WebP)并进行压缩优化,减少加载时间和内存占用。
- 利用HTTP缓存头或Service Worker实现静态资源缓存,加快加载速度。
1
2
3
4win.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => {
details.requestHeaders['Cache-Control'] = 'max-age=3600'; // 设置缓存有效期为1小时
callback({ requestHeaders: details.requestHeaders });
});
动态资源按需加载:
- 采用异步加载、懒加载等策略,确保非首屏关键资源在需要时才加载。
1
2
3
4
5
6document.addEventListener('DOMContentLoaded', () => {
// 延迟加载某个模块
import('./non-critical-module.js').then(module => {
module.init();
});
});
- 采用异步加载、懒加载等策略,确保非首屏关键资源在需要时才加载。
预加载
- 预加载技术:
- 提前加载某些资源,降低用户交互时的延迟。
1
2
3
4
5let win = new BrowserWindow({
webPreferences: {
preload: './preload.js'
}
}); - 在
preload.js中预先加载一些 Node.js 模块或执行初始化操作。1
2
3
4
5
6// preload.js
const fs = require('fs');
window.fs = fs; // 将Node.js模块暴露给渲染进程
// 或者执行一些初始化逻辑
console.log('Preloading...');
- 提前加载某些资源,降低用户交互时的延迟。
内存管理与资源释放
内存管理:
- 管理渲染进程内存:避免在渲染进程中存储大量数据,特别是DOM元素和大数组,并谨慎使用
remote模块以减少内存压力。 - 主进程内存优化:及时释放不再使用的资源,如关闭无用的窗口、清理全局变量等,并使用
process.memoryUsage()监控内存使用情况。 - GPU内存优化:对于图形密集型应用,合理设置Chromium的GPU内存限制以防内存泄漏。
- 管理渲染进程内存:避免在渲染进程中存储大量数据,特别是DOM元素和大数组,并谨慎使用
资源释放:
- 及时释放不再使用的资源,避免内存泄漏。
垃圾回收与代码分割
利用 V8 引擎优化内存回收:
- 使用
--expose-gc标志来手动触发垃圾回收。1
app.commandLine.appendSwitch('expose-gc');
- 使用
代码分割与动态导入:
- 使用 Webpack、Rollup 等构建工具对应用进行代码分割,减少初始加载时间和内存占用。
启动优化
优化主进程启动:
- 避免在主线程执行耗时操作,如读取大量文件或复杂的计算任务,可以考虑异步执行或转交给 Worker 线程。
1
2
3
4
5
6
7
8
9
10
11
12// 异步初始化
app.whenReady().then(async () => {
await performHeavyInitialization();
createWindow();
});
// 或者使用Worker线程
const worker = new Worker('./heavy-task.js');
worker.postMessage(data);
worker.onmessage = (event) => {
// 处理Worker线程完成的任务
};
- 避免在主线程执行耗时操作,如读取大量文件或复杂的计算任务,可以考虑异步执行或转交给 Worker 线程。
减小启动包体积:
- 精简 Electron 应用的主进程和渲染进程代码,剔除不必要的依赖。利用 Webpack 或 Parcel 等工具进行 tree shaking 和 code splitting。
使用快速启动模式:
- Electron 9.0 及以上版本支持快速启动模式,可以更快地启动应用,但请注意启用此模式可能会影响某些功能的使用。
1
2
3app.commandLine.appendSwitch('disable-features', 'OutOfProcessPdf'); // 必须禁用PDF预览以启用快速启动
app.enableSandbox(); // 必须启用沙箱以启用快速启动
app.disableHardwareAcceleration(); // 快速启动模式下可能需要禁用硬件加速
- Electron 9.0 及以上版本支持快速启动模式,可以更快地启动应用,但请注意启用此模式可能会影响某些功能的使用。
离线资源缓存与服务端推送
离线缓存策略:
- 利用 Service Worker 和 IndexedDB 等 Web API 实现离线缓存,确保应用在离线状态下仍能正常运行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18navigator.serviceWorker.register('service-worker.js')
.then(registration => {
// 注册Service Worker
registration.update(); // 当有新资源可用时更新缓存
});
// 在service-worker.js中实现资源缓存策略
self.addEventListener('install', event => {
event.waitUntil(
caches.open('my-cache-v1').then(cache => {
return cache.addAll([
'/static/css/app.css',
'/static/js/app.js',
'/images/logo.png'
]);
})
);
});
- 利用 Service Worker 和 IndexedDB 等 Web API 实现离线缓存,确保应用在离线状态下仍能正常运行。
服务器推送更新:
- 如果应用有后台服务支撑,可以采用 WebSocket、Server-Sent Events (SSE) 等方式接收服务器推送的更新通知,及时刷新或预加载资源。
代码级优化
性能分析工具:
- 利用 Chromium 内置的
Performance面板进行性能分析,找出瓶颈并针对性优化。
- 利用 Chromium 内置的
避免阻塞渲染线程:
- 避免长时间运行的 JavaScript 代码阻塞渲染线程,如过度复杂的计算、大量的 DOM 操作等。可以考虑使用 Web Workers 或
requestAnimationFrame等技术。1
2
3
4
5
6
7// 使用requestAnimationFrame优化动画
function animate() {
// 更新动画状态
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
- 避免长时间运行的 JavaScript 代码阻塞渲染线程,如过度复杂的计算、大量的 DOM 操作等。可以考虑使用 Web Workers 或
启用硬件加速:
- 虽然快速启动模式可能需要禁用硬件加速,但在大多数情况下,开启硬件加速能有效提升图形渲染性能。
1
app.commandLine.appendSwitch('--enable-gpu-rasterization');
- 虽然快速启动模式可能需要禁用硬件加速,但在大多数情况下,开启硬件加速能有效提升图形渲染性能。
减少重绘与回流:
- 在 DOM 操作中注意减少不必要的重绘与回流,如合并修改样式、使用 CSS3 动画替代 JavaScript 动画等。
主进程与 Renderer 进程通信优化
- IPC通信效率:
- Electron 中主进程与 Renderer 进程间的通信(IPC)也可能成为性能瓶颈。应尽量减少不必要的通信,合理设计消息结构,并可考虑批量处理消息。
1
2// 使用ipcMain和ipcRenderer模块时避免频繁小消息发送
ipcRenderer.invoke('batch-action', [...dataArray]);
- Electron 中主进程与 Renderer 进程间的通信(IPC)也可能成为性能瓶颈。应尽量减少不必要的通信,合理设计消息结构,并可考虑批量处理消息。
多线程架构与负载均衡
- 多窗口资源共享:
- 当应用包含多个窗口时,可以通过共享
BrowserWindow实例来减少资源开销。同时,对于计算密集型任务,可考虑分散到多个子进程中执行,减轻主进程负担。
- 当应用包含多个窗口时,可以通过共享
使用硬件加速与性能工具
使用硬件加速:
- 开启硬件加速,利用 GPU 加速图形渲染和计算操作。
1
app.commandLine.appendSwitch('--enable-gpu-rasterization');
- 开启硬件加速,利用 GPU 加速图形渲染和计算操作。
使用性能工具:
- 利用 Electron 内置的性能工具,如 Chrome DevTools 和 Electron Performance API,进行性能分析和优化。
其他优化策略
使用事件委托:
- 减少 DOM 元素的监听器数量,提高性能。
避免频繁的 DOM 操作:
- 通过批量处理或使用虚拟 DOM 技术优化 DOM 操作。
使用缓存策略:
- 减少网络请求和数据传输量,提高应用响应速度。
避免内存泄漏:
- 及时释放不再使用的资源,定期检查应用以确保没有内存泄漏问题。
使用原生模块:
- 原生模块通常比 JavaScript 模块性能更好,尽量在性能敏感的任务中使用它们。
减少主进程和渲染进程之间的通信:
- 过多的进程间通信会增加应用负担,应尽量减少不必要的通信。
保持 Electron 版本更新:
- 新版本的 Electron 通常包含性能优化和 bug 修复,因此应定期更新至最新版本。
通过实施这些策略,可以显著提升 Electron 应用的性能和用户体验。
typescript 定义的 类型中如何删除一个属性
vue2 和 vue3 的区别
vue 的性能优化关注哪些方面
排序算法有哪些,说一说
冒泡排序
选择排序
插入排序
快速排序
归并排序
堆排序
等等…
事件循环机制
前端架构师需要关注的点有哪些?
作为前端,如何做好项目管理,和产品设计之间的协作,以及团队管理
1 | ### 作为前端开发者,如何做好项目管理、与产品设计协作以及团队管理 |