Выбор между Electron и Tauri редко решается техникой: чаще его решают состав команды и терпимость пользователей к размеру установщика. Electron кладёт рядом с программой собственный Chromium и Node.js, Tauri берёт системный движок окна и добавляет тонкую нативную обвязку на Rust. Маркетинг обещает приложения в единицы мегабайт, но живой проект живёт в сборках, замерах и графике релизов. Ниже разбор того, что каждая технология реально кладёт на диск, сколько памяти держит в простое и как быстро команда доводит проект от шаблона до релиза, с примерами кода и командами для самостоятельных замеров.
Что на самом деле попадает в дистрибутив Electron и Tauri
Electron вырос из оболочки редактора Atom: GitHub показал редактор в 2014 году вместе с оболочкой Atom Shell, которую в 2016-м переименовали в Electron. Технология поставляет с каждой программой копию движка Chromium и рантайма Node.js, поэтому даже пустое окно весит десятки мегабайт в архиве и заметно больше сотни мегабайт на диске после установки. Каждый мажорный релиз Electron поднимает версию Chromium на одну мажорную ступень: Electron 33 из октября 2024 года приехал с Chromium 130 и Node.js 20.18, Electron 34 из января 2025-го получил Chromium 132. Проект официально поддерживает три последние мажорные версии, более старые сборки остаются со старым Chromium и всеми его накопленными уязвимостями.
Tauri пошёл от обратного. Версия 1.0 вышла в июне 2022 года, стабильный Tauri 2.0 объявлен 2 октября 2024 года, вместе с ним фреймворк пришёл и на мобильные платформы. Собственного движка у приложения нет: на Windows работает WebView2, на macOS и iOS системный WKWebView, на Linux WebKitGTK. Нативная часть собирается компилятором Rust, поэтому простое приложение собирается в единицы мегабайт. Windows 11 и обновлённая Windows 10 уже содержат WebView2, движок обновляется по Evergreen-каналу отдельно от программ. Хрестоматийная пара примеров: файловый менеджер Spacedrive собран на Tauri, а VS Code, Slack и Obsidian работают на Electron, и их установщики честно показывают цену этого пути.
Значит ли это, что Tauri легче в десятки раз? В пустом шаблоне да, в живом проекте нет. Electron не зависит от системы и везёт всё с собой, Tauri зависит от того, какой движок система предоставит и насколько свежим он окажется.
Замеры потребления памяти на пустом окне и на реальном проекте
Электронное приложение всегда держит минимум три процесса: главный процесс на Node.js, процесс отрисовки с Chromium и отдельный графический процесс. Пустое окно на рядовом ноутбуке обычно съедает 150-250 МБ оперативной памяти суммарно по процессам. Тот же интерфейс на Tauri под Windows использует процесс приложения и системный процесс WebView2, замеры чаще показывают 60-120 МБ, то есть в два-три раза меньше. Проверить цифры на своей машине можно встроенными утилитами, без сторонних программ:
tasklist /FI "IMAGENAME eq myapp.exe" /FO LIST
ps -C myapp -o pid,rss,comm
Вторая команда печатает колонку RSS в килобайтах, первая показывает память процессов Windows с фильтром по имени. Считать нужно сумму по всем процессам приложения, у Tauri вместе с процессами msedgewebview2.exe, иначе сравнение обманывает.
Дальше начинается честная часть. Разница в простое не равна разнице под нагрузкой. Таблица на 50 тысяч строк, карта или холст для рисования грузят движок одинаково: отрисовку выполняет всё тот же Chromium или WebKit, и экономия Tauri остаётся только на базовой обвязке. Зато каждое новое окно Electron создаёт отдельный процесс отрисовки с собственной копией движка, а окно Tauri обходится заметно дешевле. На Linux картина портится: WebKitGTK у дистрибутивов разного возраста ведёт себя по-разному, и отрыв по памяти сокращается. Правило замера одно: мерить свой проект на целевой машине пользователя, а не пустой шаблон на компьютере разработчика.
Скорость разработки от установки шаблона до первого работающего окна
Electron выигрывает старт с отрывом. Генератор Electron Forge создаёт проект одной командой, фронтенд живёт с горячей перезагрузкой через Vite и обновляется за доли секунды, изменения главного процесса требуют перезапуска на пару секунд. Вся команда говорит на JavaScript или TypeScript, нативный код не нужен в принципе. Первая рабочая сборка появляется в день старта.
Tauri стартует дольше. Шаблон тоже создаётся одной командой, но машине нужен инструментарий Rust: установка через rustup занимает время и несколько гигабайт диска под кэш компилятора. Первая холодная сборка нетривиального проекта идёт минуты, каждая правка нативного кода запускает пересборку, инкрементальная занимает десятки секунд. Фронтенд живёт так же быстро, потому что Vite обслуживает его одинаково в обоих случаях.
Команды для старта выглядят так:
npm init electron-app@latest my-app
npm create tauri-app@latest
npm run tauri dev
Финальную сборку Tauri запускает команда npm run tauri build, готовые пакеты ложатся в каталог target внутри src-tauri: установщик NSIS, образ AppImage и пакет dmg для macOS собираются рядом за один прогон.
Главная плата за лёгкость Tauri написана не в документации, а в требованиях к команде: бэкенд пишется на Rust. Проверка заимствований, Result и Option, async на tokio вместо привычных промисов. JS-команда без опыта получает месяцы притирки, и на коротком проекте это дороже лишних мегабайт в установщике. Команда с Rust-инженером снимает барьер и получает быстрый нативный слой без обёрток вокруг Node. Electron позволяет годами держать весь стек на одном языке, и для продукта с горизонтом в полгода это часто весит больше, чем память пользователя.
Межпроцессное взаимодействие Electron и Tauri в живом коде
Обе технологии прячут системный слой за межпроцессным мостом, но мосты устроены по-разному. Electron общается через каналы ipcMain и ipcRenderer, Tauri объявляет команды на Rust и вызывает их из JavaScript функцией invoke. Данные в обоих случаях сериализуются, поэтому многомегабайтные структуры выгодно резать на части или писать напрямую на диск.
Electron начиная с версии 12 включает изоляцию контекста по умолчанию, поэтому безопасный мост строится в preload-скрипте:
const { contextBridge, ipcRenderer } = require("electron");
contextBridge.exposeInMainWorld("api", {
saveReport: (data) => ipcRenderer.invoke("save-report", data),
});
Главный процесс регистрирует обработчик и создаёт окно:
const { app, BrowserWindow, ipcMain } = require("electron");
const fs = require("node:fs/promises");
ipcMain.handle("save-report", async (event, data) => {
await fs.writeFile("report.json", JSON.stringify(data, null, 2));
return { ok: true };
});
app.whenReady().then(() => {
const win = new BrowserWindow({ width: 1280, height: 800 });
win.loadFile("index.html");
});
В Tauri то же самое выглядит как команда на Rust с честной обработкой ошибки:
#[tauri::command]
fn save_report(name: String, rows: Vec<Row>) -> Result<(), String> {
let path = format!("{name}.json");
std::fs::write(&path, serde_json::to_string(&rows).unwrap())
.map_err(|e| e.to_string())
}
// регистрация команды при запуске приложения
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![save_report])
.run(tauri::generate_context!())
.expect("ошибка запуска");
Вызов со стороны интерфейса занимает одну строку:
await invoke("save_report", { name, rows });
Права команд в Tauri описаны декларативно: в каталоге src-tauri лежит файл capabilities/default.json, в котором перечислены разрешения вроде "core:default" или доступа к диалогам и файлам. В Electron доверенная зона ограничена ручным списком каналов и строгим CSP в разметке. Оба подхода рабочие, но Tauri подталкивает к минимальным правам с первого дня, и это заметно упрощает аудит безопасности.
Одинаковый Chromium против трёх разных системных движков
Предсказуемость отрисовки редко попадает в сравнительные таблицы, а зря. Electron ставит одну и ту же сборку Chromium на Windows, macOS и Linux: если интерфейс работает у разработчика, он работает одинаково у всех. Tauri проверяет код в трёх движках: WebView2 наследует поведение Chromium, WKWebView на macOS повторяет логику Safari, WebKitGTK зависит от возраста дистрибутива. Свежие свойства CSS на старом WebKitGTK могут отсутствовать, скроллбары и шрифты различаются, баг отрисовки всплывает только у части аудитории.
Инструменты разработчика достраивают картину. Полный комплект Chromium DevTools доступен в Electron всегда и везде. В Tauri эти инструменты работают в отладочных сборках, для релизных их включают флагом devtools в Cargo.toml и пересобирают бандл. Обновление движка тоже лежит на разных плечах: Electron меняет Chromium только со своим мажорным релизом, Tauri на Windows получает свежий WebView2 от Microsoft без единой правки кода, на macOS и Linux движок обновляет система. Свежесть достаётся бесплатно, но совместимость становится чужой ответственностью: крупное обновление системы может изменить поведение интерфейса, и релизные тесты закрывают такой риск хуже, чем собственный зафиксированный Chromium.
Обновления и долгая жизнь релизов на обеих платформах
Экономика обновлений часто перевешивает экономику первого релиза. Пользователь Electron качает полный установщик с каждым обновлением: десятки мегабайт минимум, независимо от того, поправили одну строку или переписали половину приложения. electron-updater из комплекта electron-builder умеет дифференциальные обновления через blockmap для NSIS и AppImage, но дельта при серьёзных правках всё равно измеряется десятками мегабайт. Tauri идёт проще: плагин обновлений скачивает новую сборку целиком, но сборка весит единицы мегабайт, а подпись проверяется встроенным ключом. Обновить маленькую утилиту мегабайтным пакетом проще, чем раздавать десятки мегабайт на каждую мелкую правку.
Срок жизни релизов различается той же логикой. Chromium получает заплатки безопасности каждую неделю, Electron подтягивает их в свои три поддерживаемые ветки, и приложение едет на свежем движке только пока команда выпускает мажорные обновления. Tauri-приложение зависит от системного движка, патчи приходят от поставщика системы, разработчик может вообще не следить за движком. Обратная сторона: если поставщик системы меняет поведение, приложение меняется без согласия разработчика, и регрессионные тесты интерфейса становятся обязательным ритуалом.
Реальный выбор технологии под конкретный тип приложения
Electron силён там, где интерфейс тяжёлый и веб-нативный: редакторы кода, мессенджеры, клиенты панелей управления с богатыми таблицами. Экосистема npm, одинаковость отрисовки, доступ к Node API и полный набор DevTools делают его безопасным выбором по умолчанию для команды веб-разработчиков. Потолок технологии показал VS Code, и потолок этот высокий. Tauri силён там, где ценится незаметность: утилита в трее, конвертер файлов, клиент локального сервиса, инструмент, который запускается на старых машинах и обновляется без паузы. Нативная логика на Rust разгоняет разбор файлов, шифрование и работу с оборудованием сильнее любых обёрток вокруг Node.
Решение обычно сходится к трём пунктам:
- если в команде нет Rust, а релиз нужен через месяц, Electron сокращает путь на месяцы и дороже обходится пользователю сотнями мегабайт;
- если приложение маленькое, живёт в фоне и обновляется часто, Tauri экономит память и трафик уже с первого релиза;
- если нативный слой уже написан на Rust, Tauri снимает лишние обёртки и ускоряет критичные пути почти бесплатно.
Красивые сравнительные таблицы врут по умолчанию, потому что меряют пустой шаблон, а не живой проект. На коротком горизонте Electron покупает команде скорость и предсказуемость за место на диске и память, Tauri покупает лёгкость и дешёвые обновления за время на Rust и кросс-движковую проверку. Замерьте свой интерфейс на целевой машине, взвесьте состав команды, посмотрите график релизов на год вперёд. Тогда выбор занимает один вечер, и сделанный выбор не рассыпается на первом крупном обновлении системы.