H3 vs Express: что выбрать для разработки
За последнее время появилось очень много разных HTTP-фреймворков для Node.js, которые хотят подвинуть Express с поприща популярного веб-фреймворка. Сегодня мы рассмотрим один из таких инструментов – H3, и сравним с полюбившимся всем старичком 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 находится в аргументах req
, res
и 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 мы не отказываемся, ведь есть уже сотни тысяч проектов, написанные на нем.
Оставьте комментарий