Це велике питання і вимагає, щоб довга відповідь була повною, тому я просто вирішу підмножину найважливіших відмінностей. Вибачте, що це все ще тривала відповідь.
Чим вони схожі?
Ти абсолютно прав, коли кажеш:
Для основних прикладів вони здаються схожими
Обидва рамки вирішують одну і ту ж основну проблему: Надання зручного API для побудови HTTP-серверів у вузлі. Тобто, зручніше, ніж використання лише рідного 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);
});
}
});
Різниця тут не зовсім новаторська? То чому б обирати одне над іншим?
Чим вони відрізняються?
Проста відповідь: хапі - це набагато більше, і це робить набагато більше поза коробкою. Це може бути не зрозуміло, коли ви просто дивитесь на простий приклад зверху. Насправді це навмисно. Прості справи зберігаються простими. Тож давайте вивчимо деякі великі відмінності:
Філософія
Експрес призначений бути дуже мінімальним. Надаючи вам невеликий 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 була розроблена командою в Walmart для управління трафіком Чорної п’ятниці, тому безпека та стабільність завжди були головним питанням. З цієї причини рамка робить багато чого іншого, наприклад обмеження розміру вхідної корисної навантаження, щоб запобігти виснаженню пам’яті вашого процесу. Він також має такі параметри, як максимальна затримка циклу подій, максимальна використовувана пам'ять RSS та максимальний розмір купи v8, поза яким ваш сервер реагуватиме на час очікування 503, а не просто на збої.
Підсумок
Оцініть їх обох самостійно. Подумайте про свої потреби та про те, яке з двох вирішує Ваші найбільші проблеми. Пориньте у дві спільноти (IRC, Gitter, Github), подивіться, що вам більше подобається. Не прийміть мого слова. І щасливе хакерство!
ВІДПОВІДАЛЬНІСТЬ: Я упереджений як автор книги про хапі, і вищезгадане - це в основному моя особиста думка.