Electron и Svelte

Введение в Electron

Electron — это фреймворк с открытым исходным кодом, который позволяет создавать кросс-платформенные настольные приложения с использованием веб-технологий, таких как HTML, CSS и JavaScript. Он основан на Chromium и Node.js, что позволяет разработчикам использовать одну кодовую базу для разработки приложений, работающих на Windows, macOS и Linux.

Основное преимущество Electron заключается в его способности объединять веб- и десктоп-приложения, предоставляя возможность создавать приложения с нативным интерфейсом и доступом к файловой системе и API операционной системы.

Svelte в контексте Electron

Svelte — это современный фреймворк для создания пользовательских интерфейсов, который отличается от других фреймворков, таких как React или Vue, тем, что выполняет компиляцию на этапе сборки, а не в браузере. Это означает, что Svelte генерирует оптимизированный JavaScript-код, который не требует использования виртуального DOM, что делает приложения более быстрыми и легкими.

Использование Svelte в связке с Electron открывает возможности для создания высокопроизводительных и легковесных настольных приложений. Svelte обеспечивает минимальный объем JavaScript-кода, что важно для приложений с ограниченными ресурсами, в отличие от традиционных фреймворков, которые добавляют значительный объем кода.

Структура приложения с использованием Electron и Svelte

Приложение на базе Electron и Svelte обычно состоит из двух основных частей: процесса рендеринга и главного процесса.

  • Главный процесс управляет жизненным циклом приложения, работает с API операционной системы и инициализирует окна.
  • Процесс рендеринга отвечает за отображение пользовательского интерфейса. Это веб-страница, которая обычно загружается в окно Chromium. В данном случае процесс рендеринга использует Svelte для создания UI.

Создание проекта с использованием Svelte и Electron

Для создания приложения на Electron с Svelte необходимо выполнить несколько шагов.

  1. Инициализация проекта

    Для начала создается новый проект с использованием npm или yarn. В корне проекта выполняются следующие команды:

    mkdir my-electron-app
    cd my-electron-app
    npm init -y

    Затем устанавливается Electron и Svelte:

    npm install --save-dev electron svelte
  2. Настройка Svelte

    Чтобы интегрировать Svelte в проект, создается структура каталогов:

    src/
      ├── main.js       # Главный процесс
      ├── renderer.js   # Процесс рендеринга
      ├── App.svelte    # Компонент Svelte

    В src/main.js инициализируется главный процесс:

    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('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) {
          createWindow();
        }
      });
    });
    
    app.on('window-all-closed', () => {
      if (process.platform !== 'darwin') {
        app.quit();
      }
    });
  3. Настройка сборки

    Для того чтобы Svelte-компоненты компилировались и интегрировались с Electron, необходимо настроить сборку с помощью инструмента, например, rollup или webpack.

    Пример конфигурации для rollup:

    npm install --save-dev rollup rollup-plugin-svelte rollup-plugin-node-resolve rollup-plugin-commonjs

    Конфигурация rollup.config.js:

    import svelte from 'rollup-plugin-svelte';
    import resolve from '@rollup/plugin-node-resolve';
    import commonjs from '@rollup/plugin-commonjs';
    
    export default {
      input: 'src/renderer.js',
      output: {
        file: 'public/bundle.js',
        format: 'iife',
        name: 'app'
      },
      plugins: [
        svelte(),
        resolve(),
        commonjs()
      ]
    };

    В src/renderer.js подключается и монтируется компонент Svelte:

    import App from './App.svelte';
    
    const app = new App({
      target: document.body
    });
  4. Сборка и запуск приложения

    После того как все файлы настроены, проект можно собрать и запустить:

    rollup -c
    electron .

Взаимодействие процесса рендеринга с основным процессом

Одной из ключевых особенностей приложения на Electron является взаимодействие между процессами рендеринга и главным процессом. Для этого используется механизм IPC (Inter-Process Communication). Electron предоставляет два основных способа для общения между процессами: ipcRenderer и ipcMain.

  • ipcRenderer используется в процессе рендеринга (то есть в Svelte-компонентах) для отправки сообщений главному процессу.
  • ipcMain используется в главном процессе для получения и обработки этих сообщений.

Пример кода для взаимодействия между процессами:

В главном процессе (src/main.js):

const { ipcMain } = require('electron');

ipcMain.on('get-message', (event, arg) => {
  console.log(arg); // Получаем сообщение
  event.reply('message-reply', 'Ответ от главного процесса');
});

В процессе рендеринга (src/renderer.js):

const { ipcRenderer } = require('electron');

ipcRenderer.send('get-message', 'Привет, главный процесс!');
ipcRenderer.on('message-reply', (event, arg) => {
  console.log(arg); // Ответ от главного процесса
});

Плюсы использования Svelte в Electron

  1. Меньший размер бандла: Благодаря тому, что Svelte выполняет компиляцию на этапе сборки, итоговый JavaScript-файл оказывается значительно меньше по сравнению с другими фреймворками, такими как React или Vue. Это особенно важно для настольных приложений, где размер приложения напрямую влияет на его производительность.

  2. Отсутствие виртуального DOM: В отличие от React, Svelte не использует виртуальный DOM, что улучшает производительность и снижает требования к памяти.

  3. Упрощение кода: Svelte позволяет писать компоненты с минимальным количеством кода, что повышает производительность разработки и упрощает поддержку приложения.

  4. Гибкость в дизайне: Использование Svelte позволяет легко адаптировать приложение под различные платформы и экраны, благодаря реактивности и гибкости компонентов.

Заключение

Использование Svelte с Electron позволяет создать мощные и эффективные настольные приложения, которые используют преимущества обоих инструментов. Svelte дает минимальную нагрузку на производительность благодаря компиляции в чистый JavaScript, а Electron предоставляет мощные возможности для взаимодействия с операционной системой. Эта связка идеально подходит для создания кросс-платформенных приложений с современными и отзывчивыми пользовательскими интерфейсами.