Leptos
JavaScript тяжёлый. Вот с чего всё началось.
Перед разработкой я искал экстремально быстрый стек. Не просто быстрый. Молниеносный. Чтобы работало на слабом мобильном интернете. На любом смартфоне. Даже на старом. Даже когда сеть еле дышит.
И вот тут я упёрся в JavaScript. Он весит. Каждый сайт таскает сотни килобайт кода, который нужен, чтобы кнопка нажалась. Пока этот код загрузится, пока распарсится, пока выполнится, ты уже ушёл. А на слабом интернете это не секунды. Это десятки секунд. Белый экран. Ты ждёшь. Бесит.
Я хотел публичную часть вообще без JS. Чтобы читатель получал HTML и всё. Никаких скриптов. Никаких библиотек. Никаких фреймворков, которые надо грузить, чтобы просто прочитать текст.
И я её сделал. На Leptos.
Но сначала про то, что такое SPA.
SPA
Single Page Application. Одностраничное приложение.
Обычный сайт работает так: жмёшь на ссылку, сервер отдаёт новую страницу. Белый экран на секунду. Потом контент. Потом ещё раз. И ещё.
SPA иначе. Одна страница загружается один раз. Дальше всё в браузере. Жмёшь на ссылку, JavaScript сам подменяет контент. Без перезагрузки. Плавно. Как приложение.
Но есть нюанс. Если JavaScript не загрузился или сломался, ты видишь пустой экран. Ничего. Ноль. И поисковики такое не любят. Google заходит, а там пустота. Тяжёлый код, который ещё и всё ломает, если не догрузился.
Вот в чём беда SPA. Быстро, но хрупко. И тяжело.
Мне SPA норма
Скажу честно. Для меня SPA это не проблема. Наоборот.
Я часто сижу в админке. Пишу посты, правлю, загружаю картинки. Каждое действие это клик. Если бы каждый клик грузил страницу заново, я бы взвыл. Тыкаешь кнопку, ждёшь. Тыкаешь другую, ждёшь. Муторно.
А в SPA всё летает. Нажал, отреагировало. Мгновенно. Открыл редактор, он тут же. Переключил настройки, они уже. Никаких перезагрузок. Никаких белых экранов. Только работа.
И у меня же PWA. Это прогрессивное веб-приложение. Значит, админка один раз загрузилась, и всё. Дальше она живёт на телефоне как приложение. Иконка на домашнем экране. Открываешь, работает без интернета. Не надо ничего качать повторно.
Вот почему SPA для меня норма. Я его один раз загрузил и забыл. И теперь каждый мой тык отзывается сразу. Это не про красоту, это про то, что я работаю, а не жду.
Но это в админке. А публичная часть другое дело. Её читают люди. С телефонов. С плохим интернетом. Им SPA не нужен. Им нужен HTML, который открылся сразу.
Что такое Leptos
Leptos это фреймворк на Rust. Делает две вещи одновременно. Это его главная фишка.
Публичная часть блога рендерится на сервере. Сервер собирает готовый HTML и отдаёт браузеру. Как обычный сайт. JavaScript не нужен вообще. Читается сразу. Поисковики довольны. Никаких белых экранов. Никаких сотен килобайт, которые надо скачать.
Админка работает иначе. Грузится в браузер как приложение на WebAssembly. Это формат, в который компилируется Rust. Браузер его понимает. Дальше всё летает. Нажал кнопку, мгновенно. Открыл редактор, сразу. Никаких перезагрузок.
Одна кодовая база. Два режима. Публичная часть без JS. Админка как SPA.
Почему это круто
Обычно так: либо серверный сайт, надёжный, но медленный при переходах. Либо SPA, быстрый, но тяжёлый и невидимый для поисковиков.
Leptos берёт лучшее от обоих. Первая загрузка быстрая, потому что HTML уже готов. Дальше интерактив, потому что WASM подхватывает. И всё это без JavaScript-жира, который тянет React.
React таскает 40 килобайт кода просто чтобы работать. Leptos компилируется в компактный WASM. Меньше, легче, быстрее.
И это не виртуальный DOM, как в React. Там движок сравнивает старое дерево с новым и перерисовывает. Долго. Тяжело. Leptos работает через сигналы. Такие штуки, которые знают, что изменилось, и трогают только это. Точечно. Не трогая всё остальное.
Как это повлияло на стек
Сильно. Очень.
Во-первых, одна кодовая база. Не пишу отдельно бэкенд и фронтенд. Всё на Rust. Сервер и браузер. Одни и те же функции, одни и те же типы. Не надо синхронизировать API.
Во-вторых, серверные функции. Штука, которая позволяет вызвать функцию на сервере прямо из браузера. Без ручного fetch. Без JSON. Просто вызываешь, и оно работает. Leptos сам генерирует мост между клиентом и сервером.
В-третьих, публичная часть без JavaScript. Совсем. Читатель заходит, получает HTML. Текст, картинки, ссылки. Всё. Если JavaScript отключён, ничего не сломается. Админка требует JS, но это нормально. Админка для меня, не для читателя.
Сложности
Их много. Врать не буду.
Leptos это самая сложная часть стека. Пока не разберёшься, всё падает. Ругается на сигналы. Требует явно указывать, что живёт на сервере, а что в браузере. Заставляет помнить, что на клиенте нет стандартной библиотеки. Каждый раз напоминает, что ты не в обычном Rust.
Иногда кажется, что он издевается. Пишешь одно, а он говорит: «Нет, не так». Правишь, а он: «Всё ещё не так». И так по кругу.
Но AI справляется. Я объясняю, что хочу. Он пишет. Проверяю. Когда ломается, копирую ошибку и отправляю ему. Он правит. Медленно, но работает.
Итог
Leptos это не замена JavaScript. Это другое. Способ писать веб без него. Совсем без него. Или почти без него.
Публичная часть без JS. Админка на WASM. Одна кодовая база. Один язык. Один компилятор, который ловит ошибки.
Я искал скорость. Не абстрактную, а конкретную. Чтобы на слабом интернете, на старом смартфоне, в метро, где связь еле тянет, блог открывался мгновенно. Leptos дал мне это.
И бонусом SPA в админке. Который мне нужен, потому что я там живу. Один раз загрузил, дальше летает. PWA на телефоне. Иконка на домашнем экране. Работает без интернета.
Вот почему Leptos. Не потому что модно. Потому что он решает мою проблему.