logo
Web
Максим Колмогоров
Максим Колмогоров
VK

Что такое ElysiaJS и мнение после года использования

Вот и прошел год как наш автор начал использовать ElysiaJS в связке с Bun в самых разных проектах. Это было очень интересно и познавательно, были как радости, так и разочарования, но забежим вперед и ответим - результатом довольны все: автор (как программист) и клиенты.

Что такое ElysiaJS и мнение после года использования

Дисклеймер

Хотелось бы сказать что за год было реализовано миллиард проектов на ElysiaJS, но это не так. Год - это совокупное время работы с ElysiaJS, и он наступает в этом месяце. За это время было реализовано три проекта в стол и три коммерческих (два самим автором, один под руководством автора). Также, один из трех последних даже вправе считаться довольно нагруженным, ведь работает в популярной сфере в крупном курортном городе России. Вот исходя из такого опыта данная статья будет написана.

Некоторые ссылки могут не открываться без VPN.

Что такое Bun: кратко и по делу

Bun - это такая же среда выполнения JavaScript как Node.js и Deno. Bun имеет свой собственный быстрый менеджер пакетов (bun install *название_пакета*) и поддержку почти всех пакетов из npm. Внутри Bun есть все что есть и в Node.js: файловое API, поддержка веб-сокетов и многое другое, если надо почитайте на сайте самого Bun, а то статья не про это. 

Самое главное на что нужно обратить внимание это скорость. Bun написан на языке Zig, который является низкоуровневым и имеет инструменты для ручного управления памятью. Также, для исполнения JavaScript он использует не V8 как Node.js, а JavaScriptCore. Это уже штука, которую использует Safari. Она может и не сильно быстрее V8, но с памятью работает более эффективно. 

Поэтому, на данный момент это один из самых быстрых фреймворков по скорости обработки запросов. Стоит лишь посмотреть бенчмарки и удивиться хорошим результатам. А вот и еще одни бенчмарки. Думаем двух ссылок будет достаточно, всех кого заинтересовало смогут взять это на вооружение и почитать в других источниках данную информацию более детально.

Даже знакомые программисты автора, пишущие сервера на Go и Kotlin, были удивлены такими хорошими показателями. Так что, Bun реально интересная штука за которой хочется следить.

Сложности перехода с Node.js на Bun

Выделили в отдельный абзац так как хотелось бы это проговорить отдельно. Программисты, которые занимаются разработкой бизнес-логики на сервере (создают контроллеры, фасады и сервисы), чаще всего даже не замечают переход с Node.js на Bun. Лишь более опытные разработчики могут столкнуться с “трудностями” при переходе потому что начинают копаться сразу в более сложных штуках: кластеры, файловое API, криптография. Но это все преодолимые трудности в рамках разумного.

Что такое ElysiaJS

ElysiaJS - это быстрый веб-фреймворк, с помощью которого можно создавать сервера. Быстрый благодаря Bun и некоторым архитектурным решениям самих инженеров ElysiaJS (об этом чуть позже). Короче говоря, это как Express и H3, но очень поверхностно. Прям совсем. На первый взгляд все тоже самое, но когда начинаешь зарываться… понимаешь что кроличья нора очень глубока.

Установка Bun и Hello World приложение на ElysiaJS

Для начала давайте отталкиваться с самых основ: посмотрим как устанавливается Bun и ElysiaJS. Чтобы установить Bun на компьютер воспользуйтесь одной из следующих команд:

Для MacOS и Linux:

curl -fsSL https://bun.sh/install | bash

Для Windows:

powershell -c "irm bun.sh/install.ps1 | iex"

Теперь давайте посмотрим как создается стартовый ElysiaJS проект. Для этого используем команду:

bun create elysia hi-elysia

После перейдем в папку с проектом:

cd hi-elysia

И установим все зависимости в стиле JavaScript (прямо как npm install):

bun install

Вот теперь можно запустить сервер:

bun dev

Пока все очень похоже на Express и H3 (не считая Bun). Если перейдем в src/index.ts , то тоже не увидим ничего особенного, все как будто тоже самое.

Но мы-то уже знаем самое главное отличие - ElysiaJS очень быстрый серверный фреймворк. Это достигнуто благодаря двум вещам: Bun и особая архитектура самого фреймворка. Про Bun мы поговорили выше, а вот “особая архитектура” это - функциональный минимализм и компонентный подход. Все это вместе обеспечивает минимальные производственные расходы при работе с написанным программистом кодом.

Функциональный минимализм

В ElysiaJS не так много функций, это чем-то напоминает H3, только вот тут прослоек от "принятия" запроса и до передачи его в код программиста еще меньше. Это идеальный инструмент чтобы на его базе построить что-то большое. Хотя, сами разработчики ElysiaJS понимают, что чего-то кому-то будет не хватать, и поэтому они заранее сделали много разных пакетов, которые легко встраиваются в любой проект в виде плагинов и добавляют новые фичи. Об этом поговорим в самом конце (с примерами). 

Компонентный подход

Авторы ElysiaJS создали архитектуру, позволяющую бекенд разбивать на компоненты. Все является компонентом, каждый экземпляр Elysia является компонентом. Компонент - это плагин, который может подключаться к другим экземплярам Elysia. Программист сам определяет назначение для компонента: маршрутизатор, store state, сервис, фасад или что-то еще. Вот пример:

Это настолько ключевая вещь в данном фреймворке, что авторы даже выпустили страницу с гайдланом по разработке. По мнению автора этой статьи весь фреймворк похож на одну сплошную реализацию паттерна декоратор, видимо поэтому инженеры ElysiaJS хотят чтобы Вы работали в определенном ключе (но они не заставляют, а просто настоятельно рекомендуют, ведь иначе будут проблемы). 

Кто работал с Express и H3 привык создавать контроллеры и сервисы как свои классы, а тут нам очень настоятельно предлагают использовать экземпляры Elysia как контроллеры, да и даже в некоторых случаях сервисы.

Из-за того что ElysiaJS спроектирована совсем по другому, она хочет чтобы мы работали не совсем так как привыкли. Все это вызывает одну проблему: если с Express на H3 переезжать было совсем не больно, просто непривычно, то прыгнув с Express на ElysiaJS можно испытать жжение в пятой точке от очень непривычных вещей и кучи новых фич.

Поэтому, большое приложение на ElysiaJS выглядит как куча созданных экземпляров Elysia (компонентов), которые импортируются друг в друга и набивают самый главный экземпляр всеми своими изменениями. И нет это не осуждение, это даже удобно и выглядит прилично:

Пример компоновки маршрутов в ElysiaJS

Просто есть один подводный камень. Разбивка со скриншота по факту вынужденная мера (хотя автору нравится). Не даром ведь авторы ElysiaJS настоятельно рекомендуют прочитать их гайдлайн.

Видите ли, все (на данный момент) удобные в использовании функции обработчики внутри ElysiaJS при добавлении их к главному экземпляру (не важно на каком этапе и в каком месте) влияют на весь проект. Иными словами, если где-то в каком-то контроллере Вы использовали метод .derive() по его назначению, то после добавления этого контроллера в главный экземпляр сервера данный derive может отработать в таком месте, где Вы вообще этого не ожидаете. Ну, если не поняли, то скажем по другому: он может повлиять на другой контроллер на другом маршруте (в определенных обстоятельствах).

Чтобы этого избежать есть два пути: первый - внутри ElysiaJS есть механизмы сокрытия обработчиков от других экземпляров; второй - просто распихать все по группам. Это не указано явно в документации, но свои обработчики (указанные внутри группы) они никуда выше не передают, даже если их явно об этом попросить.

Ну и автор этой статьи немного помучался с обработчиком onError. Пока автор не объявил данный обработчик в самом начале “главного” экземпляра Elysia (с которого уже сам сервер запускается), он отказывался корректно выводить ошибки полученные внутри дочерних экземпляров. Хотя в документации на этот счет ничего нет, лишь один пример установки обработчика и все. 

Типы данных

ElysiaJS спроектирована так, что когда Вы объявляете контроллер, можно еще заполнить опциональные пропсы body и response:

Во-первых, теперь у Вас в подсветки от TypeScript будут отображаться корректные типы для того же body:

Реализации экземпляра Elysia как контроллера
Пример реализации контроллера как экземпляра Elysia.

Во-вторых, это включает внутреннюю проверку на соответствие заданным входным и выходным типам для метода в контроллере. Проще говоря, если данные не будут соответствовать заданным критериям, запрос упадет с ошибкой. И да, Вы увидите целый перечень в чем/где возникли проблемы, какое поле не соответствует нужным критериям.

Скриншот из Postman
Скриншот из Postman. Естественно, изначально данные приходят в другом виде, тут они уже красиво обработаны для отображения.

Функция t это алиас для библиотеки typebox, которая интегрирована в ElysiaJS. Поэтому, если любите обмазывать все объекты по DTO, то для Вас это прямо идеальный инструмент, с помощью которого можно следить за чистотой данных в объектах (ну и DTO реализовать).

Ну и как приятный бонус, если Вы все качественно заполнили, можно с помощью нехитрых манипуляций активировать генерацию документации:

Пример Swagger из ElysiaJS

Получается неплохой такой бонус.

И еще немного

В целом обо всех основных вещах мы уже рассказали, давайте еще перечислим парочку интересных фич из ElysiaJS.

Поддержка статики - здесь есть свой готовый плагин для работы со статическими файлами. 

Поддержка HTML и JSX - есть плагин с помощью которого можно генерировать HTML из JSX и отправлять полученный контент в клиент.

CORS - многие не любят проблемы CORS, тут это решается одним плагином, прямо как в Express.

P.S: Даже для H3 еще пару месяцев назад ничего такого не было.

Cron - тут есть плагин, установив который, можно работать с Cron прямо из ElysiaJS.

И это далеко не все, более детально можно ознакомиться тут.

***

Давайте подведем итоги. В целом, преодолев боль перехода с H3 на ElysiaJS, автор начал получать удовольствие от работы с этим фреймворком. Благодаря связи с typebox под капотом очень удобно работать используя паттерн DTO, каждый запрос и ответ постоянно проверяется и это потрясающе. Особенно в рамках TypeScript, который сам по себе является просто “навесом” над JavaScript и реальной типовой безопасности не дает.

А генерация документации “в один клик” это вообще как бальзам на душу. Можно спокойно передавать документацию в другие отделы: фронтендерам и мобильным разработчикам. Наверное… это единственные две вещи которые реально удерживают автора в этой экосистеме до сих пор.

За все время использования каких-то проблем не было обнаружено, все работало стабильно с технической части.

Самая главная мысль, наверно, в том, что в классических проектах в рамках веба сложно раскрыть скоростной потенциал Bun и ElysiaJS, поэтому прирост скорости в 5 из 6 проектах мы не замечаем. Просто потому что сайты на Node.js и так работают быстро. Если Вам надо обогнать какой-нибудь Laravel или Bitrix, то хватит и H3. Лучше всего ElysiaJS и Bun показали себя в рамках микросервиса, который выполнял роль прослойки между двумя изолированными сервисами. Данные он передавал максимально оперативно и задержка была минимальная. Поэтому, все выглядит так, как будто ElysiaJS нужна в узких кейсах. Хотя факт, каких-то штрафов за использование этих инструментов Вы все равно не получаете, поэтому отговаривать от его использования смысла не видим, сами же используем. Так что, если интересно пощупать - трогайте и даже смело тащите в коммерческие проекты, проблем не будет. 

Разработка сайта
Получите персональную стоимость на разработку сайта сегодня
Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь c политикой конфиденциальности

Оставьте комментарий

Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь c политикой конфиденциальности

Нет комментариев