iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Modern Web

從 0 到 1:30 篇文章帶你玩轉 Electron 與 React系列 第 19

中場休息:聊聊 Electron 中的性能優化策略

  • 分享至 

  • xImage
  •  

不知不覺時間也過了一半了,前面的文章(目錄傳送門)已經探討了大部分 Electron 的核心功能以及概念,接下來依照規劃會開始逕行實作的部分,筆者會將前面提到的一些範例在進行更深入地講解以及實作,搭配不同的實作主題一步一步的讓讀者了解如何實作強大的 Electron & React 跨平台視窗程式。

隨著 Electron 程式越來越受歡迎,其應用的規模和複雜度也不斷提升。儘管 Electron 是一個強大的跨平台框架,但它基於 Chromium 和 Node.js 的結構,使得性能問題在大型或資源密集型應用中成為一個潛在的挑戰。為了提供流暢的用戶體驗,我們需要採取多種性能優化策略來提升應用的效能。

筆者將介紹一些實用的 Electron 性能優化技巧,涵蓋從應用啟動時間、程序管理、記憶體優化,到性能監測工具的應用等方面,幫助開發者打造高效能的桌面應用。

減少應用啟動時間

應用的啟動速度對於用戶體驗至關重要,過長的啟動時間會讓用戶感到不滿意。以下是幾個減少 Electron 應用啟動時間的策略:

使用懶載入

懶載入(Lazy Loading)是優化應用啟動性能的有效方式。在應用啟動時,僅載入必要的資源和模組,將非關鍵功能的程式推遲到需要時再載入。這樣可以減少初始載入的文件大小,縮短啟動時間。

// Example: Lazy loading modules
let heavyModule;
document.getElementById('loadModuleButton').addEventListener('click', () => {
  if (!heavyModule) {
    heavyModule = require('./heavy-module');
  }
  heavyModule.doSomething();
});

減少依賴項

檢查應用中是否有不必要的第三方依賴,或者可以將部分功能替換為內建的模組。依賴過多的 library 不僅會增加應用的大小,還會拖慢啟動速度。

你可以使用工具如 Webpack 或 esbuild 來進行程式分割和優化,減少打包大小。

最小化主程序的負載

主程序 是 Electron 應用的核心,負責創建視窗、處理文件系統和管理系統資源。如果主程序過載,整個應用的性能會受到影響。因此,我們需要將主程序的工作負載保持在最低。

將繁重任務移到渲染程序

對於計算密集型或長時間執行的任務,應避免在主程序中直接執行,否則可能導致應用無法及時回應用戶操作。這些任務應該移到渲染程序,或使用 Worker Threads 或 子程序 來分擔負載。

// Example: Using a worker thread for heavy computation
const { Worker } = require('worker_threads');

const worker = new Worker('./heavy-task.js');
worker.on('message', (result) => {
  console.log(`Task completed: ${result}`);
});

減少 IPC 通信頻率

Electron 的程序間通信(IPC)可能會帶來性能開銷,尤其是頻繁的同步通信。因此,應優化程序之間的通信,減少不必要的同步 IPC 消息。可以考慮使用異步通信來代替同步操作,以避免阻塞程序。

// Use asynchronous IPC to avoid blocking the main process
ipcRenderer.send('async-message', 'ping');
ipcRenderer.on('async-reply', (event, response) => {
  console.log(response); // 'pong'
});

使用多程序處理和 Worker Threads

Electron 支持多程序架構,渲染程序和主程序可以各自處理不同的任務。對於需要持續運行或計算密集型的任務,使用 Worker Threads 或 子程序 是一個不錯的選擇,這樣可以避免阻塞主程序或渲染程序。

使用 Worker Threads

Worker Threads 是 Node.js 提供的功能,允許你在主程序之外創建新的執行線程來處理計算密集型任務。

const { Worker } = require('worker_threads');

function runService(workerData) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./worker.js', { workerData });
    worker.on('message', resolve);
    worker.on('error', reject);
    worker.on('exit', (code) => {
      if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`));
    });
  });
}

runService('some data')
  .then(result => console.log(result))
  .catch(err => console.error(err));

記憶體管理與優化

Electron 基於 Chromium,這意味著每個渲染程序都是一個獨立的 Chromium 實例,會佔用相當大的記憶體。以下是一些減少記憶體消耗的方式:

關閉不需要的視窗或程序

當視窗不再使用時,應該及時關閉並釋放其佔用的資源。同樣,如果有長時間不使用的程序,也應考慮將其暫停或釋放資源。

// Example: Closing unused windows
if (someWindow) {
  someWindow.close();
  someWindow = null;
}

垃圾回收(GC)與記憶體洩漏

確保應用中沒有記憶體洩漏。使用 Chrome DevTools 的 Memory 面板可以幫助檢查記憶體使用情況,確保對象正確釋放且沒有不必要的長期佔用。

// Example: Ensure event listeners are removed to avoid memory leaks
someWindow.removeAllListeners('close');
  1. 使用性能監測工具

有效的性能優化需要持續的監測和分析。以下是一些常見的性能監控工具,幫助開發者發現瓶頸:

Chrome DevTools

Chrome DevTools 是 Electron 應用的主要性能分析工具。你可以通過 DevTools 的 Performance 和 Memory 面板來檢查應用的運行性能和記憶體佔用情況。

•	Performance 面板:可以幫助分析 CPU 使用情況,找出阻塞主線程的操作。
•	Memory 面板:幫助檢查記憶體洩漏情況,確保不必要的物件及時被垃圾回收。

Electron Profiler

Electron 內置的 profiler 可以用來檢查應用的性能問題。你可以使用 --enable-logging 參數啟動 Electron,並且通過 DevTools 來查看性能數據。

electron --enable-logging

Third-party Performance Tools

你也可以使用第三方工具如 Spectron 來自動化性能測試,或使用 Autotest、Nightwatch.js 來進行性能監測和應用自動化測試。

總結

性能優化是 Electron 應用開發中的關鍵一環,特別是在應用規模增長後,優化啟動時間、有效管理程序、減少記憶體消耗等都對應用的流暢運行至關重要。通過以上策略和工具,你可以顯著提升 Electron 應用的效能,為用戶提供更佳的體驗。

無論是通過懶載入優化啟動時間,還是利用 Worker Threads 減少主程序的負載,這些最佳實踐將幫助你克服性能瓶頸,讓你的 Electron 應用在大型桌面應用中脫穎而出。


上一篇
本地存儲數據:使用 Electron Store
下一篇
Electron:便利性與資源佔用之間的平衡
系列文
從 0 到 1:30 篇文章帶你玩轉 Electron 與 React30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言