Это большой вопрос, и для его полного ответа требуется длинный ответ, поэтому я остановлюсь только на некоторых наиболее важных различиях. Извините, что это все еще длинный ответ.
Чем они похожи?
Вы абсолютно правы, когда говорите:
Для базовых примеров они кажутся похожими
Обе структуры решают одну и ту же основную проблему: предоставление удобного API для построения HTTP-серверов в node. Другими словами, это удобнее, чем использовать только собственный http
модуль нижнего уровня . http
Модуль может сделать все , что мы хотим , но это утомительно для приложений записи с.
Для этого они оба используют концепции, которые уже давно используются в веб-фреймворках высокого уровня: маршрутизация, обработчики, плагины, модули аутентификации. Возможно, у них не всегда были одинаковые имена, но они примерно эквивалентны.
Большинство базовых примеров выглядят примерно так:
- Создать маршрут
- Запустить функцию при запросе маршрута, подготовив ответ
- Ответить на запрос
Экспресс:
app.get('/', function (req, res) {
getSomeValue(function (obj) {
res.json({an: 'object'});
});
});
хапи:
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
getSomeValue(function (obj) {
reply(obj);
});
}
});
Разница здесь не новаторская, правда? Так зачем выбирать одно вместо другого?
Насколько они разные?
Простой ответ - hapi - это намного больше, и он делает намного больше из коробки. Это может быть неясно, если вы просто посмотрите на простой пример сверху. На самом деле это сделано намеренно. Простые случаи остаются простыми. Итак, давайте рассмотрим некоторые из основных различий:
философия
Экспресс задуман как минимум. Предоставляя вам небольшой API с тонкой пылью поверх http
, вы по-прежнему сами по себе с точки зрения добавления дополнительных функций. Если вы хотите прочитать тело входящего запроса (довольно частая задача), вам необходимо установить отдельный модуль . Если вы ожидаете, что по этому маршруту будут отправлены различные типы контента, вам также необходимо проверить Content-type
заголовок, чтобы проверить, что это за заголовок, и проанализировать его соответствующим образом (например, данные формы или JSON или составные части), часто с использованием отдельных модулей. ,
hapi имеет богатый набор функций, который часто предоставляется через параметры конфигурации, а не требует написания кода. Например, если мы хотим убедиться, что тело запроса (полезная нагрузка) полностью считывается в память и должным образом анализируется (автоматически в зависимости от типа содержимого) перед запуском обработчика, это просто вариант :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
Характеристики
Вам нужно только сравнить документацию по API для обоих проектов, чтобы увидеть, что hapi предлагает больший набор функций.
hapi включает в себя некоторые из следующих встроенных функций, которых нет в Express (насколько мне известно):
Расширяемость и модульность
hapi и Express по-разному относятся к расширяемости. С Express у вас есть функции промежуточного программного обеспечения . Функции промежуточного программного обеспечения похожи на фильтры, которые вы складываете, и все запросы проходят через них, прежде чем попадут в ваш обработчик.
hapi имеет жизненный цикл запроса и предлагает точки расширения , которые сравнимы с функциями промежуточного программного обеспечения, но существуют несколько определенных точек в жизненном цикле запроса.
Одной из причин, по которой Walmart построил hapi и прекратил использовать Express, было разочарование тем, насколько сложно было разделить приложение Express на отдельные части и заставить разных членов команды безопасно работать над их фрагментом. По этой причине они создали систему плагинов в hapi.
Плагин похож на суб-приложение, вы можете делать все, что можете в приложении hapi, добавлять маршруты, точки расширения и т. Д. В плагине вы можете быть уверены, что не нарушаете другую часть приложения, потому что порядок регистрация маршрутов не имеет значения, и вы не можете создавать конфликтующие маршруты. Затем вы можете объединить эти плагины в сервер и развернуть его.
экосистема
Поскольку Express дает вам так мало из коробки, вам нужно смотреть вовне, когда вам нужно что-то добавить в свой проект. Часто при работе с hapi функция, которая вам нужна, либо встроена, либо есть модуль, созданный основной командой.
Минимум звучит отлично. Но если вы создаете серьезное производственное приложение, скорее всего, в конечном итоге все это вам понадобится.
Безопасность
hapi был разработан командой Walmart для управления трафиком в Черную пятницу, поэтому безопасность и стабильность всегда были главной заботой. По этой причине фреймворк выполняет множество дополнительных функций, таких как ограничение размера входящей полезной нагрузки, чтобы предотвратить исчерпание памяти вашего процесса. Он также имеет параметры для таких вещей, как максимальная задержка цикла событий, максимальная используемая память RSS и максимальный размер кучи v8, после которых ваш сервер будет отвечать тайм-аутом 503, а не просто сбой.
Резюме
Оцените их обоих самостоятельно. Подумайте о своих потребностях и о том, какой из двух вопросов решает ваши самые большие проблемы. Окунитесь в два сообщества (IRC, Gitter, Github), посмотрите, какое вы предпочитаете. Не верьте мне на слово. И счастливого взлома!
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: как автор книги о хапи я пристрастен, и вышесказанное в значительной степени является моим личным мнением.