To duże pytanie, które wymaga długiej odpowiedzi, aby było kompletne, dlatego omówię tylko podzbiór najważniejszych różnic. Przepraszamy, że to wciąż długa odpowiedź.
Jak są podobne?
Masz całkowitą rację, mówiąc:
W przypadku podstawowych przykładów wydają się podobne
Obie struktury rozwiązują ten sam podstawowy problem: zapewnienie wygodnego interfejsu API do budowania serwerów HTTP w węźle. Oznacza to, że jest to wygodniejsze niż używanie http
samego modułu natywnego niższego poziomu . http
Moduł może zrobić wszystko, co chcemy, ale jest to uciążliwe do zastosowań pisać.
Aby to osiągnąć, obaj używają koncepcji, które od dawna są obecne w strukturach internetowych wysokiego poziomu: routing, moduły obsługi, wtyczki, moduły uwierzytelniające. Może nie zawsze miały te same nazwy, ale są z grubsza równoważne.
Większość podstawowych przykładów wygląda mniej więcej tak:
- Utwórz trasę
- Uruchom funkcję, gdy żądana jest trasa, przygotowując odpowiedź
- Odpowiedz na żądanie
Wyrazić:
app.get('/', function (req, res) {
getSomeValue(function (obj) {
res.json({an: 'object'});
});
});
hapi:
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
getSomeValue(function (obj) {
reply(obj);
});
}
});
Różnica nie jest tutaj przełomowa, prawda? Po co więc wybierać jedną z nich?
Czym się różnią?
Prosta odpowiedź brzmi: hapi to o wiele więcej i robi o wiele więcej po wyjęciu z pudełka. To może nie być jasne, jeśli spojrzysz na prosty przykład z góry. W rzeczywistości jest to zamierzone. Proste przypadki są proste. Przyjrzyjmy się więc niektórym z dużych różnic:
Filozofia
Express ma być bardzo minimalny. Dając ci małe API z niewielkim odkurzaniem http
, nadal jesteś sam, jeśli chodzi o dodawanie dodatkowych funkcji. Jeśli chcesz odczytać treść przychodzącego żądania (dość powszechne zadanie), musisz zainstalować osobny moduł . Jeśli spodziewasz się wysłania różnych typów zawartości do tej trasy, musisz również sprawdzić Content-type
nagłówek, aby sprawdzić, który to jest i odpowiednio go przeanalizować (na przykład dane formularza, JSON lub wiele części), często używając oddzielnych modułów .
hapi ma bogaty zestaw funkcji, często ujawnianych za pomocą opcji konfiguracyjnych, zamiast wymagać pisania kodu. Na przykład, jeśli chcemy się upewnić, że treść żądania (ładunek) jest w pełni wczytywana do pamięci i odpowiednio analizowana (automatycznie na podstawie typu zawartości) przed uruchomieniem procedury obsługi, jest to tylko prosta opcja :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
cechy
Wystarczy porównać dokumentację API w obu projektach, aby przekonać się, że hapi oferuje większy zestaw funkcji.
hapi zawiera niektóre z następujących wbudowanych funkcji, których Express nie ma (o ile wiem):
Rozszerzalność i modułowość
hapi i Express podchodzą do rozszerzalności w zupełnie inny sposób. Dzięki Express masz funkcje oprogramowania pośredniego . Funkcje oprogramowania pośredniego są podobne do filtrów, które układasz w stos i wszystkie żądania przechodzą przez nie przed trafieniem do programu obsługi.
hapi ma cykl życia żądania i oferuje punkty rozszerzeń , które są porównywalne z funkcjami oprogramowania pośredniego, ale istnieją kilka zdefiniowanych punktów w cyklu życia żądania.
Jednym z powodów, dla których Walmart stworzył hapi i przestał używać Express, była frustracja z powodu tego, jak trudno było podzielić aplikację Express na oddzielne części i pozwolić, aby różni członkowie zespołu bezpiecznie pracowali nad swoim fragmentem. Z tego powodu stworzyli system wtyczek w hapi.
Wtyczka jest jak podaplikacja, możesz zrobić wszystko, co możesz w aplikacji hapi, dodawać trasy, punkty rozszerzeń itp. We wtyczce masz pewność, że nie psujesz innej części aplikacji, ponieważ kolejność rejestracje tras nie mają znaczenia i nie można tworzyć tras kolidujących. Następnie możesz połączyć te wtyczki na serwerze i wdrożyć go.
Ekosystem
Ponieważ Express daje tak niewiele po wyjęciu z pudełka, musisz wyglądać na zewnątrz, gdy chcesz coś dodać do swojego projektu. Często podczas pracy z hapi funkcja, której potrzebujesz, jest albo wbudowana, albo istnieje moduł utworzony przez podstawowy zespół.
Minimalne brzmi świetnie. Ale jeśli tworzysz poważną aplikację produkcyjną, prawdopodobnie będziesz potrzebować wszystkich tych rzeczy.
Bezpieczeństwo
hapi został zaprojektowany przez zespół Walmart do obsługi ruchu w Czarny piątek, więc bezpieczeństwo i stabilność zawsze były głównym problemem. Z tego powodu framework robi wiele dodatkowych rzeczy, takich jak ograniczanie rozmiaru przychodzącego ładunku, aby zapobiec wyczerpaniu pamięci procesu. Ma również opcje dotyczące takich rzeczy, jak maksymalne opóźnienie pętli zdarzeń, maksymalna używana pamięć RSS i maksymalny rozmiar sterty v8, po przekroczeniu którego serwer odpowie z limitem czasu 503 zamiast po prostu się zawiesić.
Podsumowanie
Oceń ich obu samodzielnie. Pomyśl o swoich potrzebach i o tym, która z nich jest odpowiedzią na Twoje największe obawy. Zanurz się w dwóch społecznościach (IRC, Gitter, Github), zobacz, które wolisz. Nie wierz mi na słowo. I miłego hakowania!
ZRZECZENIE SIĘ: Jestem stronniczy jako autor książki o hapi, a powyższe jest w dużej mierze moją osobistą opinią.