Подтвердить что ты не робот

Как Express и hapi сравниваются друг с другом?

С точки зрения дизайна и разработки веб-приложений, как Express и Hapi сравниваются друг с другом? Для базовых примеров они кажутся похожими, однако мне интересно узнать больше о ключевых различиях в общей структуре приложения.

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

Существует также статья о выборе Hapi (over Express) для разработки нового сайта npmjs.com, в этой статье говорится, что "система плагина Hapis означает, что мы можем изолировать различные грани и сервисы приложения таким образом, чтобы в будущем использовать микросервисы. С другой стороны, Express требует немного большей конфигурации для получения той же функциональности" , что это означает?

4b9b3361

Ответ 1

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

Как они похожи?

Вы абсолютно правы, когда говорите:

Для базовых примеров они кажутся похожими

Оба фреймворка решают одну и ту же основную проблему: предоставление удобного 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 вы используете middleware. Функции промежуточного программного обеспечения являются похожими на фильтры, которые вы складываете, и все запросы проходят через них, прежде чем удалять обработчик.

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

Одна из причин, по которой Walmart построила hapi и перестала использовать Express, была расстроена тем, как трудно было разбить приложение Express на отдельные части, и у разных членов команды безопасно работать на их куске. По этой причине они создали плагиновую систему в hapi.

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

экосистема

Потому что Express дает вам так мало из коробки, вам нужно смотреть снаружи, когда вам нужно что-то добавить в свой проект. Во многих случаях, когда вы работаете с hapi, вам нужна либо встроенная функция, либо модуль, созданный основной командой.

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

Безопасность

hapi была разработана командой Walmart для запуска трафика в Black Friday, поэтому безопасность и стабильность всегда были главной проблемой. По этой причине структура делает много вещей, таких как ограничение размера входящей полезной нагрузки, чтобы предотвратить исчерпание вашей памяти процесса. У него также есть опции для таких вещей, как максимальная задержка цикла событий, максимальная используемая память RSS и максимальный размер кучи v8, за которым ваш сервер будет отвечать на 503 тайм-аута, а не просто сбой.

Резюме

Оцените их обоих. Подумайте о ваших потребностях, и какой из двух адресов вы больше всего беспокоитесь. Окунитесь в две общины (IRC, Gitter, Github), посмотрите, что вы предпочитаете. Не просто смирись с моим словом. И счастливый взлом!


ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я предвзято отношусь к автору книги о hapi, и это в значительной степени мое личное мнение.

Ответ 2

Моя организация собирается с Хапи. Вот почему нам это нравится.

Хапи:

  • Поддержан крупным корпусом. Это означает, что поддержка сообщества будет сильной, и там для вас в будущих выпусках. Легко найти страстных людей Хапи, и есть хорошие учебные пособия (хотя и не такие многочисленные и растягивающиеся, как учебники ExpressJs). На момент публикации npm и Walmart используйте Hapi.
  • Это может облегчить работу распределенных команд, работающих с различными компонентами бэкэнд-услуг, без необходимости иметь полное знание остальной поверхности API (архитектура плагинов Hapi является олицетворением этого качества).
  • Предположим, что фреймворк делает то, что предполагается использовать в рамках структуры: конфигурирование. После этого структура должна быть невидимой и позволить разработчикам сосредоточить свою настоящую творческую энергию на построении бизнес-логики. После использования Hapi в течение года я определенно чувствую, что Хапи это выполняет. Я... чувствую себя счастливым!

Если вы хотите услышать прямо из Eran Hammer (Hapi lead)

За последние четыре года hapi стал основой выбора для многих проектов, больших или малых. Что делает хапи уникальным, так это его способность масштабироваться до больших развертываний и больших команд. По мере роста проекта, его сложность - сложность проектирования и сложность процесса. архитектура hapis и философия обрабатывают повышенную сложность без необходимости постоянно реорганизовывать код [читать дальше]

Начало работы с Hapi будет не так просто, как ExpressJs, потому что у Хапи нет такой же "звездной силы"... но как только вы почувствуете себя комфортно, вы получите МНОГО пробега. Взял меня около ~ 2 месяцев как новый хакер, который безответственно использовал ExpressJs в течение нескольких лет. Если вы опытный сторонний разработчик, вы будете знать, как читать документы, и вы, вероятно, даже не заметите этого.

Области документации Hapi могут улучшиться:

  • как аутентифицировать пользователей и создавать сеансы
  • обработка запросов Cross-Origin-Requests (CORS)
  • Загрузка файлов (multipart, chunked)

Я думаю, что аутентификация была бы самой сложной частью этого, потому что вам нужно решить, какую бы стратегию использовать для использования (Basic Authentication, Cookies, JWT Tokens, OAuth). Хотя технически это не проблема Хапи, так что пейзаж сеансов/аутентификации настолько фрагментирован... но я бы хотел, чтобы они предоставили для этого несколько рук. Это значительно увеличило бы счастье разработчиков.

Остальные два на самом деле не так сложны, документы могут быть написаны немного лучше.

Ответ 3

Краткие сведения о Hapi или почему Hapi JS?

Hapi ориентирован на конфигурирование. В него встроена аутентификация и авторизация. Он был выпущен в проверенной атмосфере и доказал свою эффективность. Все модули имеют 100% тестовое покрытие. Он регистрирует наивысший уровень абстракции от ядра HTTP. Легко компасируется. через архитектуру плагина

Hapi - лучший выбор в плане производительности. Hapi использует другой механизм маршрутизации, который может выполнять более быстрый поиск и учитывать порядок регистрации. Тем не менее, он довольно ограничен по сравнению с Express. А благодаря системе плагинов Hapi можно изолировать различные аспекты и сервисы, которые могут помочь приложению во многих отношениях в будущем.

использование

Хапи является наиболее предпочтительной платформой по сравнению с Express. Хапи используется в основном для крупных корпоративных приложений.

Вот несколько причин, по которым разработчики не выбирают Express при создании корпоративных приложений:

Маршруты сложнее составить в Express

Middleware мешает большую часть времени; каждый раз, когда вы определяете маршруты, вы должны написать как можно больше номеров кодов.

Хапи был бы лучшим выбором для разработчика, желающего создать RESTful API. Hapi имеет микросервисную архитектуру, и также возможно передавать управление от одного обработчика к другому на основе определенных параметров. С плагином Hapi вы можете наслаждаться более высоким уровнем абстракции вокруг HTTP, потому что вы можете разделить бизнес-логику на части, которыми легко управлять.

Еще одно огромное преимущество Hapi заключается в том, что он предоставляет подробные сообщения об ошибках при неправильной настройке. Hapi также позволяет вам настроить размер загружаемого файла по умолчанию. Если максимальный размер загрузки ограничен, вы можете отправить пользователю сообщение об ошибке, сообщающее, что размер файла слишком велик. Это защитит ваш сервер от сбоев, поскольку при загрузке файлов больше не будет пытаться буферизовать весь файл.

  1. Все, чего вы можете добиться с помощью экспресс-экспрессии, также легко достигается с помощью hapi.js.

  2. Hapi.js очень стильный и очень хорошо организовывает код. Если вы увидите, как он выполняет маршрутизацию и помещает основную логику в контроллеры, вам непременно понравится.

  3. Hapi.js официально предоставляет несколько плагинов исключительно для диапазонов hapi.js: от аутентификации на основе токенов до управления сеансами и многих других, на которые распространяется реклама. Это не означает, что традиционный npm не может быть использован, все они поддерживаются hapi.js

  4. Если вы кодируете в hapi.js, код будет очень удобен в обслуживании.

Ответ 4

Еще один момент, который нужно добавить: Hapi начал поддерживать вызовы http2 начиная с версии 16 (если я не ошибаюсь). Тем не менее, express пока не поддерживает модуль http2 напрямую до Express 4. Хотя они выпустили эту функцию в альфа-версии Express 5.