Tauri 2 упаковывает HTML, CSS и JavaScript в настольное окно, а системную часть собирает через Rust. Создадим vanilla-проект, добавим список заметок в localStorage и запустим его командой tauri dev. Вы увидите границу между frontend и src-tauri, а также поймёте, почему веб-код не получает системные права автоматически.
Новичок ожидает, что Tauri является заменой браузеру одной кнопкой. На деле проект состоит из веб-интерфейса, нативной оболочки, конфигурации и набора разрешений. В этой статье вы соберёте отдельное desktop-окно с локальным списком заметок. Финальный результат можно проверить без догадок: заметка сохраняется после перезапуска приложения, пустая строка отклоняется, а npm run tauri dev открывает нативное окно.
Vanilla HTML, CSS и JavaScript рисуют форму и список.
src-tauri содержит Rust-проект и конфигурацию нативного окна.
Системные возможности подключаются явно, а не доступны всему JavaScript.
Из чего состоит проект Tauri 2
create-tauri-app создаёт frontend и каталог src-tauri. Во время разработки Vite обслуживает страницу, а Tauri открывает её в системном WebView. Production build включает собранные web-assets в нативное приложение. Для Tauri 2 держите этапы раздельно: ввод, проверка, основное действие и вывод. Такой маршрут позволяет остановиться в конкретной точке, увидеть фактические данные и исправить одну причину вместо случайной перестановки строк.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Scaffold | create-tauri-app создаёт два слоя | Есть src и src-tauri |
| Dev | Vite запускает frontend | Страница доступна по devUrl |
| Window | Tauri открывает системный WebView | Интерфейс живёт в отдельном окне |
| Build | Web-assets и Rust собираются вместе | Получен пакет платформы |
JavaScript отвечает за экран, а Tauri управляет окном, упаковкой и разрешённым мостом к системе. У Tauri 2 каждый этап оставляет наблюдаемый след, поэтому следующий шаг начинается только после проверки предыдущего.

От входных данных до видимого результата. Frontend и native layer проверяются отдельно
Пишем интерфейс заметок на 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 специально ограничен одним пользовательским сценарием, чтобы назначение каждой строки оставалось видимым.

Что отличает устойчивый проект от случайного запуска. 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 нельзя менять без причины после выпуска. Автообновление и подпись пакета являются отдельными задачами и требуют ключей, которые не лежат в репозитории.
Проверяем сохранение и сборку
Создайте заметку, закройте окно и запустите приложение снова. Удалите одну запись и повторите запуск. Добавьте счётчик notes.length и кнопку очистки с подтверждением. Затем откройте frontend через обычный npm run dev и убедитесь, что базовая логика работает без нативной оболочки. После этого выполните npm run tauri build и найдите артефакт своей платформы. Не публикуйте неподписанный installer как готовый продукт.
- Запустите приложение в отдельном окне.
- Добавьте две заметки.
- Перезапустите и проверьте сохранение.
- Удалите одну запись.
- Проверьте frontend в браузере.
- Соберите локальный 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.
| Шаг | Что разобрать | Мини-проверка |
|---|---|---|
| 1 | DOM и формы | Добавить заметку |
| 2 | Массивы | Удалить запись по id |
| 3 | localStorage | Восстановить список |
| 4 | Проект Vite | Собрать frontend |
| 5 | Tauri capabilities | Объяснить минимальные права |
Когда frontend работает в браузере, ошибки нативной сборки легче отделить от ошибок интерфейса. Финальная проверка для Tauri 2: закрыть статью, объяснить путь данных и добавить одну функцию без копирования готового блока.
Сверьте Rust и системные build tools для своей ОС.
Web-код и нативная оболочка решают разные задачи.
Выдавайте только конкретные разрешения и не исполняйте пользовательскую строку.
Production package требует подписи и проверки на целевой ОС.
Что получится в итоге

Обычный 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, затем измените одно правило и восстановите ключевой файл без копирования.
JavaScript и формы закрепите в курсе JavaScript, HTML в курсе HTML, CSS в курсе CSS.
Возьмите интерфейс из todo-листа, добавьте типы по первому проекту TypeScript и сравните установку с PWA на JavaScript.