TechNT
Trang chủ Blog Web / App Development Hướng dẫn xây dựng ứng dụng Desktop với Electron

Hướng dẫn xây dựng ứng dụng Desktop với Electron

Với Electron, bạn có thể tạo ứng dụng chạy trên Windows, macOS, và Linux chỉ với một mã nguồn duy nhất. Các ứng dụng nổi tiếng như Visual Studio Code, Slack, và Discord đều được xây dựng bằng Electron, chứng minh sức mạnh và tính linh hoạt của nó. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn từng bước để xây dựng một ứng dụng desktop cơ bản với Electron, từ thiết lập môi trường phát triển đến đóng gói và phân phối ứng dụng.

Mục lục

Đang tải mục lục...

Electron là gì?

Electron, ban đầu được phát triển bởi GitHub cho trình chỉnh sửa mã Atom, là một framework cho phép tạo ứng dụng desktop sử dụng công nghệ web. Nó tích hợp Chromium (động cơ trình duyệt của Google Chrome) để hiển thị giao diện người dùng và Node.js để xử lý logic phía sau, bao gồm truy cập các API native như hệ thống tệp hoặc thông báo. Điều này giúp các nhà phát triển web dễ dàng chuyển sang phát triển desktop mà không cần học các ngôn ngữ native như C++ hay Objective-C.

Electron hoạt động dựa trên hai loại quy trình chính:

  • Quy trình chính (Main Process): Chạy tệp JavaScript chính (thường là main.js), quản lý vòng đời ứng dụng, tạo cửa sổ, và tương tác với hệ thống.
  • Quy trình giao diện (Renderer Process): Chạy trong mỗi cửa sổ ứng dụng, hiển thị nội dung web bằng HTML, CSS, và JavaScript.

Tại sao nên sử dụng Electron?

Electron mang lại nhiều lợi ích cho các nhà phát triển, đặc biệt là những người đã quen thuộc với công nghệ web. Dưới đây là một số lý do chính.

Lợi íchMô tả 
Đa nền tảng Viết mã một lần, triển khai trên Windows, macOS, và Linux, giảm thời gian và chi phí phát triển.
Công nghệ web quen thuộc Sử dụng HTML, CSS, JavaScript, và các framework như React hoặc Vue để xây dựng giao diện.
Truy cập API native Tích hợp Node.js cho phép sử dụng các module native như truy cập tệp, thông báo, hoặc khay hệ thống.
Cộng đồng lớn Electron có cộng đồng phát triển mạnh mẽ, với nhiều tài liệu, thư viện, và công cụ hỗ trợ như Electron Forge.

Tuy nhiên, Electron cũng nhận một số ý kiến trái chiều. Một số nhà phát triển cho rằng ứng dụng Electron có thể tiêu tốn nhiều tài nguyên CPU và bộ nhớ, đặc biệt với các chương trình đơn giản. Tuy nhiên, với các kỹ thuật tối ưu hóa phù hợp, bạn có thể giảm thiểu vấn đề này.

Thiết lập môi trường phát triển

Để bắt đầu, bạn cần chuẩn bị môi trường phát triển với các công cụ cần thiết.

Yêu cầu

  • Node.js: Tải và cài đặt phiên bản LTS mới nhất từ Node.js. Kiểm tra cài đặt bằng lệnh:
  • node -v
    npm -v

Tạo dự án mới

  1. Tạo một thư mục mới cho dự án và di chuyển vào đó:
  2. mkdir my-electron-app
    cd my-electron-app
  3. Khởi tạo dự án npm:
  4. npm init -y
  5. Điều này tạo tệp package.json với các thiết lập mặc định.
  6. Cài đặt Electron làm phụ thuộc phát triển:
  7. npm install --save-dev electron
  8. Thêm lệnh khởi động vào package.json:
  9. "scripts": {
      "start": "electron ."
    }

Tạo ứng dụng Electron cơ bản

Bây giờ, chúng ta sẽ tạo một ứng dụng đơn giản hiển thị "Hello World!" cùng với thông tin phiên bản của Node.js, Chromium, và Electron.

Bước 1: Tạo tệp chính (main.js)

Tệp main.js là điểm bắt đầu của quy trình chính, chịu trách nhiệm tạo cửa sổ ứng dụng.

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

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  });
  win.loadFile('index.html');
}

app.whenReady().then(createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});
  • Giải thích:
    • BrowserWindow tạo một cửa sổ với kích thước 800x600 pixel. 
  • webPreferences: { nodeIntegration: true } cho phép renderer process truy cập Node.js (lưu ý: cần tắt trong ứng dụng thực tế để tăng bảo mật). 
  • win.loadFile('index.html') tải tệp HTML vào cửa sổ. 
  • Sự kiện window-all-closed đảm bảo ứng dụng thoát khi tất cả cửa sổ đóng (trừ macOS). 
  • Sự kiện activate xử lý hành vi mở lại cửa sổ trên macOS.

Bước 2: Tạo giao diện (index.html)

Tạo tệp index.html trong thư mục gốc để hiển thị giao diện:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello World!</title>
</head>
<body>
  <h1>Hello World!</h1>
  <p>Chúng ta đang sử dụng Node.js <span id="node-version"></span>,
  Chromium <span id="chrome-version"></span>,
  và Electron <span id="electron-version"></span>.</p>
  <script>
    const { versions } = require('process');
    document.getElementById('node-version').textContent = versions.node;
    document.getElementById('chrome-version').textContent = versions.chrome;
    document.getElementById('electron-version').textContent = versions.electron;
  </script>
</body>
</html>
  • Giải thích:
    • Tệp HTML hiển thị tiêu đề "Hello World!" và các thẻ <span> để hiển thị phiên bản. 
  • Mã JavaScript trong thẻ <script> truy cập đối tượng process.versions để lấy thông tin phiên bản.

Bước 3: Chạy ứng dụng

Chạy lệnh sau để khởi động ứng dụng:

npm start

Một cửa sổ sẽ mở ra, hiển thị "Hello World!" cùng với các phiên bản của Node.js, Chromium, và Electron.

Hiểu về quy trình chính và giao diện

Hiểu rõ sự khác biệt giữa quy trình chính và quy trình giao diện là rất quan trọng khi phát triển ứng dụng Electron.

Quy trìnhMô tảChức năng chính 
Quy trình chính Chạy tệp main.js, hoạt động trong môi trường Node.js. Tạo và quản lý cửa sổ, xử lý vòng đời ứng dụng, tương tác với API native (menu, khay hệ thống, hộp thoại).
Quy trình giao diện Chạy trong mỗi cửa sổ, hiển thị nội dung web. Xử lý giao diện người dùng bằng HTML, CSS, JavaScript, tuân theo tiêu chuẩn web.

Giao tiếp giữa hai quy trình được thực hiện thông qua module IPC (Inter-Process Communication) của Electron, cho phép gửi và nhận thông điệp.

Thêm tính năng vào ứng dụng

Để làm cho ứng dụng thú vị hơn, bạn có thể thêm các tính năng như menu, biểu tượng khay hệ thống, hoặc tích hợp với các module Node.js.

Thêm menu

Để thêm menu vào ứng dụng:

  1. Trong main.js, nhập module Menu:
  2. const { Menu } = require('electron');
  3. Tạo mẫu menu và thiết lập:
  4. const template = [
      {
        label: 'Tệp',
        submenu: [
          { role: 'quit', label: 'Thoát' }
        ]
      },
      {
        label: 'Chỉnh sửa',
        submenu: [
          { role: 'undo', label: 'Hoàn tác' },
          { role: 'redo', label: 'Làm lại' },
          { type: 'separator' },
          { role: 'cut', label: 'Cắt' },
          { role: 'copy', label: 'Sao chép' },
          { role: 'paste', label: 'Dán' }
        ]
      }
    ];
    const menu = Menu.buildFromTemplate(template);
    Menu.setApplicationMenu(menu);

Menu này sẽ xuất hiện ở đầu ứng dụng, cung cấp các tùy chọn như thoát, hoàn tác, hoặc sao chép.

Đóng gói và phân phối ứng dụng

Để chia sẻ ứng dụng với người dùng, bạn cần đóng gói nó thành tệp thực thi. Công cụ được đề xuất là Electron Forge.

Các bước đóng gói

  1. Cài đặt Electron Forge:
  2. npm install --save-dev @electron-forge/cli
  3. Khởi tạo Electron Forge:
  4. npx electron-forge init
  5. Đóng gói ứng dụng:
  6. npx electron-forge make

Lệnh này tạo các gói phân phối trong thư mục out, phù hợp với hệ điều hành của bạn (Windows, macOS, hoặc Linux).

Tự động cập nhật

Electron cung cấp module autoUpdater để xử lý cập nhật tự động. Bạn có thể sử dụng dịch vụ như update.electronjs.org cho các ứng dụng công khai hoặc thiết lập máy chủ cập nhật riêng. Ví dụ, để sử dụng update-electron-app:

npm install update-electron-app

Thêm vào main.js:

require('update-electron-app')();

Điều này đảm bảo ứng dụng kiểm tra và tải xuống các bản cập nhật tự động.

Sử dụng React với Electron

Nhiều nhà phát triển kết hợp Electron với React để tận dụng kiến trúc dựa trên component và hệ sinh thái phong phú của React. Dưới đây là cách thiết lập nhanh:

Sử dụng Electron Forge với React

  1. Cài đặt Electron Forge:
  2. npm install --save-dev @electron-forge/cli
  3. Tạo dự án với mẫu React:
  4. npx create-electron-app my-electron-react-app --template=webpack-react

Lệnh này thiết lập một dự án Electron với React và Webpack được cấu hình sẵn. Bạn có thể bắt đầu viết các component React ngay lập tức.

Lợi ích của React

  • Tái sử dụng component: Dễ dàng xây dựng giao diện phức tạp.
  • Hiệu suất: React tối ưu hóa việc render giao diện.
  • Cộng đồng lớn: Nhiều thư viện và công cụ hỗ trợ.

Để tìm hiểu thêm, hãy xem hướng dẫn của Electron Forge.

Tối ưu hóa hiệu suất và bảo mật

Hiệu suất

Electron đôi khi bị chỉ trích vì sử dụng nhiều tài nguyên. Dưới đây là một số cách tối ưu hóa:

  • Viết mã JavaScript hiệu quả: Tránh các tính năng chậm như vòng lặp forEach hoặc cấu trúc dữ liệu không tối ưu.
  • Sử dụng WebAssembly: Chuyển các tác vụ nặng sang WebAssembly để tăng tốc độ, như trong ví dụ về ứng dụng máy tính (DEV Community).
  • Giảm thời gian khởi động: Hạn chế các lệnh require() đồng bộ để cải thiện tốc độ khởi động (Nearform).

Bảo mật

Bảo mật là yếu tố quan trọng khi phát triển ứng dụng Electron. Một số thực tiễn tốt nhất bao gồm:

  • Sử dụng phiên bản mới nhất: Luôn cập nhật Electron để vá các lỗ hổng bảo mật.
  • Kích hoạt Context Isolation: Ngăn chặn mã không đáng tin cậy truy cập các API nhạy cảm (Electron Docs).
  • Xác định Content Security Policy (CSP): Hạn chế tài nguyên tải từ các nguồn không an toàn (MDN).

Sử dụng công cụ như Electronegativity để kiểm tra cấu hình bảo mật của ứng dụng.

Câu hỏi thường gặp (FAQ)

  1. Electron có phù hợp cho ứng dụng nhỏ không?
    Electron phù hợp cho cả ứng dụng lớn và nhỏ, nhưng cần tối ưu hóa để tránh tiêu tốn tài nguyên.
  2. Tôi có cần biết lập trình native để dùng Electron không?
    Không, bạn chỉ cần biết HTML, CSS, và JavaScript.
  3. Làm thế nào để tích hợp React với Electron?
    Sử dụng Electron Forge với mẫu React hoặc tích hợp create-react-app với Electron.
  4. Ứng dụng Electron có thể tự động cập nhật không?
    Có, sử dụng module autoUpdater hoặc dịch vụ như update.electronjs.org.
  5. Electron có an toàn không?
    Electron an toàn nếu bạn tuân theo các thực tiễn bảo mật như context isolation và CSP.
  6. Tôi có thể sử dụng framework nào khác ngoài React?
    Có, Electron hỗ trợ Vue, Angular, hoặc thậm chí không cần framework.
  7. Làm thế nào để giảm kích thước ứng dụng Electron?
    Loại bỏ các tệp source map không cần thiết và sử dụng Electron Forge để tối ưu hóa (Medium).

Kết luận

Electron là một công cụ tuyệt vời để xây dựng ứng dụng desktop đa nền tảng, đặc biệt dành cho các nhà phát triển web. Bằng cách làm theo các bước trong bài viết này, bạn có thể tạo một ứng dụng cơ bản, thêm các tính năng như menu hoặc tích hợp React, và đóng gói để phân phối. Để nâng cao ứng dụng, hãy khám phá các tài liệu chính thức của Electron và các nguồn tài nguyên cộng đồng.

Cập nhật lần cuối: 14:08 18/05/2025

TechNT

I'm Developer