Electron-приложение состоит из двух ключевых контекстов выполнения: main process и renderer process. Каждый из них требует отдельного подхода к сборке, поскольку отличается средой исполнения:
Parcel учитывает эту архитектуру через систему targets, позволяющую описывать несколько выходных сборок в рамках одного проекта.
Parcel v2 вводит концепцию мульти-таргетной сборки, где каждый target описывает отдельный бандл с собственными параметрами окружения.
Для Electron используются специализированные типы таргетов:
electron-mainelectron-rendererКаждый из них задаёт корректные условия трансформации кода, включая:
__dirname, process,
require{
"name": "electron-app",
"main": "dist/main.js",
"targets": {
"main": {
"context": "electron-main",
"distDir": "dist/main"
},
"renderer": {
"context": "electron-renderer",
"distDir": "dist/renderer"
}
}
}
Parcel автоматически разделяет граф зависимостей на две независимые сборки, избегая смешивания Node и browser API.
Main process представляет собой точку входа приложения, отвечающую за:
BrowserWindow)Parcel при сборке electron-main:
require() и динамические
импорты__dirname без разрушения контекстаelectron
пакет)Renderer-таргет ориентирован на UI-часть приложения, где выполняется React, Vue, Svelte или vanilla DOM.
Parcel для electron-renderer:
Preload-слой является мостом между main и renderer процессами. Он выполняется в изолированной среде с доступом к ограниченному Node API.
Parcel не выделяет отдельный тип таргета, но позволяет описывать preload как самостоятельную точку входа:
{
"targets": {
"preload": {
"context": "electron-main",
"distDir": "dist/preload"
}
}
}
contextBridgeТипичная структура Electron-проекта с Parcel:
src/
main/
index.js
renderer/
index.html
app.js
preload/
index.js
Parcel автоматически строит граф зависимостей отдельно для каждой точки входа, если они определены через targets.
Parcel обеспечивает горячую перезагрузку для renderer-части и частично для main процесса.
Main процесс требует перезапуска Electron при изменениях. Обычно используется связка:
Принцип работы:
Parcel не управляет жизненным циклом Electron, но обеспечивает корректную выдачу артефактов:
package.json → mainloadFile или
loadURLwebPreferences.preloadconst { app, BrowserWindow } = require('electron');
function createWindow() {
const win = new BrowserWindow({
webPreferences: {
preload: __dirname + '/. ./preload/index.js',
contextIsolation: true
}
});
win.loadFile(__dirname + '/. ./renderer/index.html');
}
app.whenReady().then(createWindow);
Parcel отвечает только за бандлинг, но не за упаковку приложения. В production пайплайне обычно разделяются этапы:
Parcel обеспечивает:
Parcel в Electron-режиме учитывает специфику окружения:
electron как external
dependencyElectron часто использует native addons (.node файлы).
Parcel:
Типичная проблема — попытка бандлинга нативного модуля в renderer, что приводит к runtime error. Решение — объявление external зависимостей.
Попытка использовать DOM API в main процессе или Node API в renderer приводит к ошибкам выполнения.
Отсутствие разделения electron-main и
electron-renderer приводит к:
Прямой доступ renderer к Node.js API нарушает модель безопасности Electron.
Parcel формирует три независимых графа:
Связь между ними осуществляется только через Electron IPC, а не через импорт модулей.
Parcel не вмешивается в IPC-модель, но поддерживает её структуру через корректный бандлинг:
ipcMain в mainipcRenderer в rendererParcel поддерживает code splitting, что особенно важно в Electron UI:
Каждый chunk загружается Chromium-движком независимо.
Parcel применяет:
В Electron-проектах это особенно заметно при больших renderer-приложениях с UI-фреймворками.
Ключевая модель Parcel в Electron:
Нарушение границ приводит к деградации архитектуры и усложнению сопровождения кода.