Как известно, оливье быть, а раст лучший язык программирования. К сожалению, нанести вред проекту, людям, гретте тумберг легко - тупо не используя лучший язык программирования. Пожалуй, для тривиальной логики можно и без раста, или скажем, вы избрали путь html разработчика, хотя в последнем случае раст все равно найдет вас (в виде красной таблетки) в веб ассембли. Допустим, в проекте вокеры, темплейты, строгое "нет" реакту, манифесты, API для хранения данных в браузере, которое предоставляет доступ к виртуальной файловой системе, частной для источника страницы, и раст. Собрал для вас практики и ошибки, создавая проект, который с удовольствием использую вместо гугл шитс.
Allora:
Используя тип String в расте 60kb+ к продакшн билду -- юзайте плиз JsValue или JsString. Там много вопросов к размеру сборки, нижу будет еще инфа.
Семантика перемещения (move semantics) раста неприятно удивляет ошибкой "null pass to rust" в джаваскрипте. В js все обьекты передаются по ссылке (наследие явы), и не ожидаешь, что обьект будет не валиден после передачи в функцию веб ассембли.
Сериализация/десериализация обьектов в расте (serde json) 20kb+ к билду -- лучше без.
Без сериализации будут вопросы о сохранении, например, вектора строк -- что делать с разделителем и т.д.
К сожалению, нужно будет дебажить ошибки вида Uncaught Error: recursive use of an object detected which would lead to unsafe aliasing in rust -- разные ментальные модели раста и тайпскрипта всему виной.
Философское - в доступе к данным есть задачи записи и чтения, и как ни странно, обе операции не обязательно должны быть симметричными. Пользователь хочет видеть всю инфу сразу на экране телефона, что соответствует чтению коллекции структур, но также пользователь меняет лишь одно поле одной структуры в единицу времени (например, двигая слайдер в UI).
Что если чтение одной структурки из коллекции завершится неудачей и что если чтение поля структурки завершится ошибкой. Как обычно, нет универсального ответа и все зависит от требований пользовательского интерфейса.
Семантика перемещения (move semantics) очень хороша в расте, особенно это заметно в async/await примерах, где вам нужно уговорить компилятор.
Все знают, но хочется повторить: в расте прекрасное тестирование из коробки.
Для no_std (потому что хочется уменьшить размер билда) нужен внешний аллокатор (TalckWasm ок), но к сожалению, запрещено использовать HashMap и HashSet, но к счастью, прекрасно работают BTreeMap и BTreeSet. Итераторы хорошо работают в no_std.
К сожалению, в расте немного разный апи для доступа к файловой системе из вокера в сравнении с доступом из основого потока.
Раст хорош для слоя данных, за отрисовку и эвенты используем тайпскрипт.
Можно без реакта, если не боимся разделения компонента и листенера. Cтоит отметить, что в реакте мы (обычно) платим за связку дополнительным состоянием (например, вообразите, пожалуйста, имплементацию списка песен и попап).
В html темплайтах используем соглашения об именовании - префикс для css классов совпадает (почти) с id темплайта.
Размер сборки тайпскрипта 10кб -- это когда без внешних зависимостей.
В ts классы с конструктором/деструктором (искуственным) сильно помогают для подписки/отписки листенеров. Да и для очистки прочих ресурсов тоже хороши.
Все в курсе, но на всякий случай -- веб может нативное приложение для ios и android, нужен manifest.json.
css можно на модули без внешних инструментов.
Желательно быстрая первичная отрисовка без wasm, из-за размера билда.
Это удобно, обернуть postMessage и onmessage для общения с вокером в промиз.
Для сервера статики скорее всего ваш знакомый разработчик посоветует питон либо ноду. Соглашаться не стоит быстро -- если выбор был бы между (корректно работающим) с++ сервером и нодой, многие выбрали бы c++. Раст лучше чем c++, то есть для статики выбираем rust (например, actix_web, хотя и их полно сейчас).
Деплоймент:
Используем vds машинку за 200-300 рублей в месяц.
Для доступа к файловой системе, к сожалению, нужен доступ по https -- как вариант, покупаем доменное имя у известного dns провайдера и мапим апишник vds сервера на ваше доменное имя.
Hастраиваем ротацию логов доступа к серверу и желательно минимальный firewall на вашей машинке.
Всякое:
Прямые и обратные операции держим вместе -- например, если хотим положить какие-либо параметры в GET урла, желательно иметь также функцию по извлечению параметров из урла.
Три фазы хорошего рендеринга (отрисовки): 1) медленный рендеринг, 2) рендеринг с анимацией, 3) отрисовка за два прохода - последняя фаза предполагает отрисовку из быстрого хранилища (например localStorage) и далее (те же данные) из медленого (например, origin private file system.
IOS (даже в хроме) только через вокеры для доступа к origin private file system.
Хорошая команда для проверки зависимостей cargo tree -e features.
В завершении об архитектуре проекта: 1) сервер статики, 2) wasm сборка - шарится между страничками, 3) для каждой странички отдельная сборка из файлов тайпскрипта (esbuild норм сборщик), 4) скрипты для версионирования статики - борьба с кешом, 5) ручка health check - сервер статики должен быть чуть-чуть умнее обычного, 6) makefile - все должно быть довольно прямолинейно.
Приблизительно 750 файлов пользователь открывает, заходя на главную страничку. Отрисовка на мобилках такого количества файлов происходит с небольшим лагом, поэтому нужно быстрое хранилище (например localStorage, который позволителен на 10Мb и переодически самоочищается :) и дублирующее ее медленное хранилище. Добавляя тонкости вокеров, и другие нюансы -- раст и, главное, компилятор раста -- прекрасный выбор от бесчисленных багов и глупых решений.
P.S.: размер билда (wasm) в итоге 96kb, после gzip 45kb
Комментарии (27)

anonymous
02.01.2026 17:30
xyli0o Автор
02.01.2026 17:30Кажется, тут нужно пояснить: ява и js - два разных языка, хотя к оригинальности имен имеются вопросики. Ходят слухи, что javascript написали за две недели "на коленке", если так, скорее всего было влияние какого-то сильного предшественника. Если посмотреть на так называемую стандартную библиотеку js, мы найдем очень похожие идеи и интерфейсы из явы. Соответсвенно, cемантика передачи по ссылке (by ref) само собой адаптирована и в новом языке (того времени).

bolk
02.01.2026 17:30Влияния всяких предшественников там было много, но Джава там просматривается менее всего. Язык должен был называться LiveScript (и это значение до сих пор можно использовать в атрибуте language тега script), но в последний момент для хайпа дали имя JavaScript, потому что Java тогда сильно набирала популярность.

linux-over
02.01.2026 17:30а раст лучший язык программирования
исключений нет
памятью управлять не умеет (постоянно требует у программиста информации об этом)
нормальной асинхронщины нет
и как это можно называть лучшим языком программирования?

black_warlock_iv
02.01.2026 17:30Исключения не нужны (даже вредны), если есть алгебраические типы данных с вспомогательным сахаром.
Не знаю какой такой информации он у вас требует, у меня пока ничего не требовал.
Асинхронщина нормальная. Есть несколько специфических приколов, а где их нет?

linux-over
02.01.2026 17:30математика и растущий из неё функциональный анализ — устарели с появлением второго языка моделирования мира — мутабельного императивного программирования.
поскольку все процессы в мире мутабельны (начиная с коллапса волновой функции), то наиболее адекватное моделирование получается в императивной мутабельной парадигме.
А потому все попытки продвигать функциональное программирование, все попытки запрещать исключения — ретроградство и луддизм

black_warlock_iv
02.01.2026 17:30Не стоит ссылаться на квантовую механику, если не разбираешься в этом. Особенно если собеседник разбирается. Коллапс волновой функции — это вообще не процесс. Процессы происходят во времени и пространстве, коллапс же не таков.
Вообще представление о мире как о чём-то существующем в данный момент и меняющемся с течением времени, наталкивается на серьёзные трудности из-за теории относительности. Вот почему в современной философии популярен этернализм, согласно которому Вселенная существует как нечто неизменное, зафиксированное и включающее прошлое и будущее на равных правах.
Но всё это на самом деле имеет мало отношения к программированию. У программирования свои законы. А исключения кстати есть даже в Хаскелл, так что связь с функциональным программированием тут весьма косвенная.
Практика показывает, что исключения неудобны что в функциональном программировании, что в императивном. Они не отражаются в типах, из-за чего компилятор не помогает их правильно обрабатывать. Они имеют громоздкий синтаксис. У них крайне ограничена выразительность (например, вы не можете иметь коллекцию исключений).

linux-over
02.01.2026 17:30Практика показывает, что исключения неудобны что в функциональном программировании, что в императивном
нет
практика такого не показывает

stranger_shaman
02.01.2026 17:30Какая я то героическая история, как на ровном месте, из ничего, создать себе проблем, и героически же с ними бороться. Вместо того чтобы использовать более подходящие и проверенные инструменты.

Android1983
02.01.2026 17:30Ну так прежде чем хаять Rust создайте что-то своё лучшее. Если сравнивать C\C++ то Rust куда лучше.
Sad_Bro
Make web great again!
xyli0o Автор
точно :)