logo
Web
Максим Колмогоров
Максим Колмогоров
Блог Фомина Максима

H3 vs Express: что выбрать для разработки

За последнее время появилось очень много разных HTTP-фреймворков для Node.js, которые хотят подвинуть Express с поприща популярного веб-фреймворка. Сегодня мы рассмотрим один из таких инструментов – H3, и сравним с полюбившимся всем старичком Express.

H3 vs Express: что выбрать для разработки

Буквально небольшое введение, вдруг кто-то чего-то не знает или вовсе забыл.

Что такое Express

Express - это фреймворк для разработки веб-серверов, который появился в 2010 году. Вот уже на протяжении нескольких лет Express является стандартом разработки серверов на Node.js. 

Что такое H3

H3 - это еще один фреймворк для разработки веб-серверов, появившийся в ноябре 2020 года. В данный момент самый популярный фреймворк из группы новых фреймворков.

За короткое время появилось сразу несколько новых фреймворков: Hono, Hattip, ElysiaJS и H3. И последний, пока что, самый популярный из них.

H3 vs Express: какие отличия

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

“Hello World” приложение

Представим, что Node.js у нас установлен, проекты на нужных фреймворках инициализировали и все пакеты мы тоже уже установили. Поэтому сразу перейдем к сути.

“Hello World” проект на Express выглядит как-то так:

А на H3 примерно так:

На первый взгляд отличий почти и нет. Но если всматриваться, то увидим что аргументов req и res в H3 нет, вместо этого там только один аргумент event. Если что, req и res в H3 тоже есть, просто внутри event.node (event.node.req и event.node.res). Плюс сам сервер в H3 мы запускаем через стандартный функционал Node.js - createServer.

Пакеты

Для Express можно найти очень много готовых пакетов в NPM. За целый десяток лет сообщество наплодило просто тонну всего. С H3 ситуация совсем другая, на момент написания этой статьи много чего просто нет: готовых CORS обработчиков, готовых хранилищ для сессий, файловых модулей по типу Multer. Все это надо писать самостоятельно.

Да, все это можно сделать и довольно быстро, просто в первый раз вся эта необходимая рутина заберет много времени. А ведь иногда свободного времени просто нет.

Работа со статикой

В Express есть свой модуль express.static('folderName') для работы со статическими файлами. А вот с H3 не все так просто. По умолчанию в H3 нет своего модуля для работы со статикой, поэтому даже разработчики рекомендуют установить пакет serve-static. Но H3 может быть запущен через вспомогательный пакет listhen, в котором данный функционал есть.

Listhen

Вспомогательный пакет для H3, который предоставляет дополнительные плюшки для разработчиков: поддержка TypeScript из коробки, готовый dev-сервер, работа со статикой, быстрый запуск одной командой и так далее.

Подходы к разработке

Оба инструмента очень гибкие, Вы можете разложить в своем проекте любую современную архитектуру и применить любой подход. Главное, чтобы личной фантазии и навыков хватило. 

Существенное отличие между H3 и Express находится в аргументах reqres и event, о которых мы уже написали выше. Также весь Express построен на промежуточных подпрограммах (middleware), поэтому на один маршрут в router можно передать несколько промежуточных callback функций:

И с помощью next() регулировать “маршрут” запроса:

Естественно, в H3 можно сделать также, но по другому, ибо next() там нет. В H3 каждый метод условного контролера должен возвращать defineEventHandler:

Соответственно, если нужно добавить какой-то промежуточный обработчик, это делается просто поверх предыдущего:

И используется где нужно:

Также в Express мы чаще всего указываем какой результат будет возвращен после выполнения через функцию res.send(). Ибо по умолчанию Express возвращает text/html. В H3 достаточно вернуть return и у нас результат автоматически переведется в JSON формат. Другие типы контента уже придется указывать мануально:

Из-за того, что в H3 нужно чуть больше писать кода, потому что тут меньше прослоек, появляется ощущение, что ты более полно контролируешь каждое “дыхание” своего сервера.

Производительность и бенчмарки

Сразу скажем, для определенных моментов Express и H3 могут показывать хороший результат, ибо в целом Node.js позволяет поддерживать и достаточно быстро обрабатывать большое количество подключений. Но в среднем “по палате” разница тут есть и достаточно большая.

Если мы рассмотрим бенчмарки web-фреймворков из репозитория the-benchmarker на GitHub, то увидим что H3, в среднем, быстрее Express в 3 раза. И такой результат показывает ни один единственный бенчмарк. Есть еще и другие, которые фиксирует такой же результат.

Ну и это мы только про Node.js говорим, кроме этого H3 поддерживает Deno и Bun. А Express только Deno. Так что, H3 можно разогнать очень даже до хороших скоростей.

***

Из всего вышесказанного, надеемся, что Вы сделаете какие-нибудь выводы самостоятельно и сами будете ответственны за свой выбор. От себя добавим, что мы сделали выбор в пользу H3 для новых проектов. Во-первых, он быстрее; во-вторых, он кажется намного гибче из-за подхода, в котором у нас есть только базовое ядро, а остальное мы настраиваем сами. Но и от Express мы не отказываемся, ведь есть уже сотни тысяч проектов, написанные на нем.

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

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