ФронтендJavaScriptHTML / CSSДругой язык

Как сделать настольное приложение на JavaScript через Tauri 2

Создаём Tauri 2 приложение на vanilla JavaScript, сохраняем список заметок, запускаем отдельное окно и разбираем связь web-интерфейса с Rust-оболочкой.

Кодик

Автор

7 мин чтения

Tauri 2 упаковывает HTML, CSS и JavaScript в настольное окно, а системную часть собирает через Rust. Создадим vanilla-проект, добавим список заметок в localStorage и запустим его командой tauri dev. Вы увидите границу между frontend и src-tauri, а также поймёте, почему веб-код не получает системные права автоматически.

Новичок ожидает, что Tauri является заменой браузеру одной кнопкой. На деле проект состоит из веб-интерфейса, нативной оболочки, конфигурации и набора разрешений. В этой статье вы соберёте отдельное desktop-окно с локальным списком заметок. Финальный результат можно проверить без догадок: заметка сохраняется после перезапуска приложения, пустая строка отклоняется, а npm run tauri dev открывает нативное окно.

1Frontend

Vanilla HTML, CSS и JavaScript рисуют форму и список.

2Shell

src-tauri содержит Rust-проект и конфигурацию нативного окна.

3Permissions

Системные возможности подключаются явно, а не доступны всему JavaScript.

Из чего состоит проект Tauri 2

create-tauri-app создаёт frontend и каталог src-tauri. Во время разработки Vite обслуживает страницу, а Tauri открывает её в системном WebView. Production build включает собранные web-assets в нативное приложение. Для Tauri 2 держите этапы раздельно: ввод, проверка, основное действие и вывод. Такой маршрут позволяет остановиться в конкретной точке, увидеть фактические данные и исправить одну причину вместо случайной перестановки строк.

ЭтапДействиеПроверяемый результат
Scaffoldcreate-tauri-app создаёт два слояЕсть src и src-tauri
DevVite запускает frontendСтраница доступна по devUrl
WindowTauri открывает системный WebViewИнтерфейс живёт в отдельном окне
BuildWeb-assets и Rust собираются вместеПолучен пакет платформы

JavaScript отвечает за экран, а Tauri управляет окном, упаковкой и разрешённым мостом к системе. У Tauri 2 каждый этап оставляет наблюдаемый след, поэтому следующий шаг начинается только после проверки предыдущего.

Два слоя Tauri-приложения
От входных данных до видимого результата. Frontend и native layer проверяются отдельно

Установите prerequisites именно для своей ОС. Node.js недостаточно: Tauri 2 требует Rust и системные инструменты сборки. На Windows это Microsoft C++ Build Tools и WebView2, на macOS Xcode Command Line Tools.

Пишем интерфейс заметок на JavaScript

Проверьте prerequisites в официальной документации. Затем выполните npm create tauri-app@latest, выберите TypeScript / JavaScript, npm, Vanilla и JavaScript. Перейдите в каталог, выполните npm install и npm run tauri dev. Первый запуск дольше обычного Vite, потому что Cargo собирает Rust-зависимости.

const form = document.querySelector("#note-form");
const input = document.querySelector("#note-text");
const list = document.querySelector("#notes");

let notes = JSON.parse(localStorage.getItem("notes") ?? "[]");

function save() {
  localStorage.setItem("notes", JSON.stringify(notes));
}

function render() {
  list.replaceChildren();
  for (const note of notes) {
    const item = document.createElement("li");
    item.textContent = note.text;

    const remove = document.createElement("button");
    remove.type = "button";
    remove.textContent = "Delete";
    remove.addEventListener("click", () => {
      notes = notes.filter((entry) => entry.id !== note.id);
      save();
      render();
    });

    item.append(remove);
    list.append(item);
  }
}

form.addEventListener("submit", (event) => {
  event.preventDefault();
  const text = input.value.trim();
  if (!text) return;
  notes.push({ id: crypto.randomUUID(), text });
  input.value = "";
  save();
  render();
});

render();
Что должно произойти после запуска
  • Форма добавляет заметку без перезагрузки окна.
  • Пустая строка не попадает в список.
  • Delete удаляет запись по стабильному id.
  • localStorage восстанавливает данные после нового запуска.

В первом проекте не нужен системный plugin: browser-compatible localStorage позволяет сначала проверить интерфейс и состояние. Пример Tauri 2 специально ограничен одним пользовательским сценарием, чтобы назначение каждой строки оставалось видимым.

Веб-страница и безопасная desktop-оболочка
Что отличает устойчивый проект от случайного запуска. Permissions добавляются только по задаче

Как web-код оказывается в настольном окне

Tauri не поставляет Chromium целиком, а использует системный WebView, поэтому вид и поддержка деталей зависят от платформы. Rust-процесс управляет окном и IPC. Когда JavaScript вызывает Tauri command или plugin, запрос проходит через разрешённый мост. Capabilities ограничивают доступ окон к командам. Это безопаснее широкого системного API, но только если разрешения остаются минимальными. localStorage привязан к приложению и профилю WebView, однако для важных данных лучше использовать официальный Store или SQL plugin с продуманной миграцией.

ЧастьЗа что отвечаетЧто проверить
srcХранит web-интерфейсРаботает и в обычном Vite
src-tauriХранит Rust и Tauri configИдентификатор приложения уникален
WebViewРисует HTML/CSS/JSИнтерфейс проверен на ОС
CapabilitiesОграничивают командыНет лишних разрешений
BuildСоздаёт нативный пакетFrontend собран до Rust

Размер приложения обычно меньше Electron-проекта, потому что WebView приходит с системой, но это не бесплатное преимущество: разные ОС используют разные движки. Для filesystem, dialog и shell подключайте официальные plugins и выдавайте узкие scopes. Не вызывайте произвольную shell-команду из пользовательского ввода. Идентификатор bundle нельзя менять без причины после выпуска. Автообновление и подпись пакета являются отдельными задачами и требуют ключей, которые не лежат в репозитории.

Не давайте frontend больше системных прав, чем нужно. Если приложению достаточно localStorage, не подключайте filesystem и shell. Каждый plugin расширяет поверхность атаки и набор платформенных проверок.

Проверяем сохранение и сборку

Создайте заметку, закройте окно и запустите приложение снова. Удалите одну запись и повторите запуск. Добавьте счётчик notes.length и кнопку очистки с подтверждением. Затем откройте frontend через обычный npm run dev и убедитесь, что базовая логика работает без нативной оболочки. После этого выполните npm run tauri build и найдите артефакт своей платформы. Не публикуйте неподписанный installer как готовый продукт.

Проверка своими руками
  1. Запустите приложение в отдельном окне.
  2. Добавьте две заметки.
  3. Перезапустите и проверьте сохранение.
  4. Удалите одну запись.
  5. Проверьте frontend в браузере.
  6. Соберите локальный production package.
Готово, если выполняются все пункты
  • Dev-окно открывается.
  • State сохраняется.
  • Пустой ввод отклоняется.
  • Системные права не добавлены.

Хороший первый Tauri-проект доказывает упаковку и жизненный цикл, а не собирает все системные plugins сразу. После этой проверки измените одно правило Tauri 2 и заранее запишите ожидаемый результат. Так копирование превращается в понимание.

Четыре проверки первой сборки
Четыре проверки перед следующим шагом. Dev и production являются разными этапами

Когда Tauri подходит, а когда усложняет проект

Следующим шагом перенесите данные в Store plugin, если нужен более явный файл и миграции. Для диалогов и filesystem добавляйте один официальный plugin за раз и читайте permissions. Проверьте приложение на каждой целевой ОС, потому что WebView различается. Подпись Windows и macOS, installer, обновления и иконки планируются до релиза. Если приложение является обычной страницей без системных функций, PWA может оказаться дешевле в поддержке.

Как изучить тему в Кодике

Сначала закрепите DOM, события, массивы и localStorage, затем изучайте нативный мост Tauri. В Кодике сначала восстановите чистую логику без фреймворка, затем верните библиотеку и интерфейс Tauri 2.

ШагЧто разобратьМини-проверка
1DOM и формыДобавить заметку
2МассивыУдалить запись по id
3localStorageВосстановить список
4Проект ViteСобрать frontend
5Tauri capabilitiesОбъяснить минимальные права

Когда frontend работает в браузере, ошибки нативной сборки легче отделить от ошибок интерфейса. Финальная проверка для Tauri 2: закрыть статью, объяснить путь данных и добавить одну функцию без копирования готового блока.

Не установлены prerequisites

Сверьте Rust и системные build tools для своей ОС.

Путают src и src-tauri

Web-код и нативная оболочка решают разные задачи.

Подключают shell без scope

Выдавайте только конкретные разрешения и не исполняйте пользовательскую строку.

Считают dev build релизом

Production package требует подписи и проверки на целевой ОС.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальному руководству Tauri 2 Create a Project. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: Как сделать настольное приложение на JavaScript через Tauri 2
Обычный JavaScript-интерфейс открывается как настольное приложение, хранит заметки и остаётся без лишних системных разрешений.

Короткие ответы
Нужен ли Rust для Tauri 2?

Да, нативная часть Tauri 2 собирается Rust toolchain, даже если интерфейс написан на JavaScript.

Чем src отличается от src-tauri?

src хранит web-интерфейс, а src-tauri содержит нативный проект, конфигурацию и capabilities.

Почему Tauri использует capabilities?

Capabilities ограничивают, какие системные команды доступны конкретному окну приложения.

Как понять, что учебный проект Tauri 2 действительно работает?

Проверьте основной сценарий Tauri 2, неверный ввод, повторный запуск и один граничный случай. Затем объясните путь данных своими словами.

Можно ли начать с готового кода Tauri 2 из статьи?

Да. Сначала добейтесь результата Tauri 2, затем измените одно правило и восстановите ключевой файл без копирования.

Упакуйте знакомый web-проект, не переписывая всё сразу

JavaScript и формы закрепите в курсе JavaScript, HTML в курсе HTML, CSS в курсе CSS.

Возьмите интерфейс из todo-листа, добавьте типы по первому проекту TypeScript и сравните установку с PWA на JavaScript.