Express, Koa, Meteor, Sails.js: cztery ramy apokalipsy
Opublikowany: 2022-03-11JavaScript zdecydowanie stał się jednym z najpopularniejszych języków w ostatnich latach, ze względu na ogromne zapotrzebowanie na aplikacje internetowe. Podczas kodowania dla wielu przeglądarek JavaScript jest prawie jedynym wyborem dla programistów front-end. Można argumentować, że istnieją CoffeeScript, TypeScript lub Dart jako alternatywy. Jednak prawda jest taka, że CoffeeScript jest głównie postrzegany jako cukier składniowy, który ostatecznie sprowadza się do JavaScript. TypeScript to po prostu nadzbiór JavaScript, który zawiera kilka funkcji języka zorientowanego obiektowo, takich jak opcjonalne pisanie statyczne, klasy i interfejsy, i wciąż jest na wczesnym etapie. Dart jest również językiem zorientowanym obiektowo, który ma składnię podobną do C, ale nadal kompiluje się do JavaScript dla popularnych przeglądarek.
Wraz z narodzinami i szybkim rozwojem Node.js, JavaScript nie jest już ograniczony do programowania front-endowego, a programowanie back-endowe nie jest już nauką rakietową dla programistów front-endowych. Ludzie zwykle myślą o JavaScript jako o srebrnej kuli, która pasuje do wszystkich sytuacji: front-end, serwer WWW, aplikacja komputerowa, system wbudowany, bazy danych… lista jest coraz dłuższa. W rzeczywistości, biorąc pod uwagę szerokie grono odbiorców JavaScript, Node.js+MongoDB+AngularJS/React stworzył całkiem sporą liczbę pełnych stosów programistów internetowych. Jednak Node.js został zaprojektowany tak, aby był lekki i zapewnia tylko podstawowe funkcje jako serwer WWW, aby przyspieszyć tworzenie aplikacji internetowych. Jedna z gotowych do użycia platform, które są dostępne jako pakiety npm, byłaby lepszą opcją w prawdziwym świecie.
W tym poście omówimy niektóre z tych dobrze znanych i przetestowanych frameworków Node.js, które uwolniły programistów od konieczności ciągłego wymyślania koła na nowo. Mówiąc dokładniej, w tym artykule przyjrzymy się Express, Koa, Meteor i Sails.js. Zamiast próbować rozgryźć, w jaki sposób każdy z tych frameworków zestawia się ze sobą, zobaczymy kluczowe obszary, w których każdy z tych frameworków wyróżnia się i jak są one odpowiednie dla różnych potrzeb projektowych.
Express: minimalistyczny framework sieciowy
Nie trzeba dodawać, że Express to największa oferta dla biznesu Node.js. Każdy gracz Node.js słyszał o tym i używa go z powiadomieniem lub bez niego. Obecnie jest w czwartej generacji i istnieje wiele frameworków Node.js zbudowanych na jego podstawie lub inspirowanych jego koncepcjami.
Występ
Większość programistów uwielbia Node.js za jego szybkość, a kiedy sprowadza się do wyboru frameworka, perfekcjonista może lekceważyć jakiekolwiek zagrożenie dla wydajności. Express zapewnia cienką warstwę na wierzchu Node.js z funkcjami aplikacji internetowych, takimi jak podstawowy routing, oprogramowanie pośredniczące, silnik szablonów i obsługa plików statycznych, dzięki czemu drastyczna wydajność we/wy Node.js nie jest zagrożona.
Express to minimalny, nieoceniony framework. nie stosuje żadnego z powszechnych wzorców projektowych, takich jak MVC, MVP, MVVM lub cokolwiek, co jest popularne po wyjęciu z pudełka. Dla fanów prostoty jest to duży plus wśród wszystkich innych frameworków, ponieważ możesz budować swoją aplikację zgodnie z własnymi preferencjami i bez zbędnej krzywej uczenia się. Jest to szczególnie korzystne przy tworzeniu nowego osobistego projektu bez obciążenia historycznego, ale wraz ze wzrostem projektu lub zespołu programistycznego brak standaryzacji może prowadzić do dodatkowej pracy w zarządzaniu projektem/kodem, a w najgorszym przypadku może prowadzić do niemożności utrzymania .
Generator
Mimo że framework nie ma opinii, ma generator, który generuje określoną strukturę folderów projektu. Po zainstalowaniu pakietu express-generator npm i utworzeniu szkieletu aplikacji za pomocą polecenia generatora, zostanie utworzony folder aplikacji z przejrzystą hierarchią, który pomoże Ci zorganizować obrazy, statyczny kod JavaScript front-endu, pliki arkuszy stylów i pliki szablonów HTML.
npm install express-generator -g express helloapp
create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts
Oprogramowanie pośredniczące
Oprogramowanie pośredniczące to w zasadzie tylko funkcje, które mają pełny dostęp zarówno do obiektów żądań, jak i odpowiedzi.
Jak sama nazwa wskazuje, oprogramowanie pośredniczące stosuje pewne instrukcje filtrowania przed przekazaniem kontroli do rzeczywistej logiki biznesowej lub następnego poziomu oprogramowania pośredniego. Niektóre typowe zadania, takie jak sprawdzanie stanu logowania użytkownika, sprawdzanie uprawnień użytkownika lub zapobieganie atakom między lokacjami, najlepiej wyodrębnić jako oprogramowanie pośredniczące.
var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);
Aplikacja Express to zasadniczo Node.js z wieloma funkcjami oprogramowania pośredniego, niezależnie od tego, czy chcesz dostosować własne oprogramowanie pośrednie, czy skorzystać z wbudowanego oprogramowania pośredniego w ramach frameworka, Express uczynił ten proces naturalnym i intuicyjnym.
Silnik szablonów
Silniki szablonów umożliwiają programistom osadzanie zmiennych backendu w plikach HTML, a na żądanie plik szablonu zostanie wyrenderowany do zwykłego formatu HTML ze zmiennymi interpolowanymi z ich rzeczywistymi wartościami. Domyślnie generator ekspresów korzysta z silnika szablonów Pug (pierwotnie znanego jako Jade), ale inne opcje, takie jak Mustache i EJS, również bezproblemowo współpracują z Express.
Integracja bazy danych
Jako minimalny framework, Express nie traktuje integracji bazy danych jako wymaganego aspektu w swoim pakiecie, dlatego nie skłania się ku żadnemu specyficznemu wykorzystaniu bazy danych. Przyjmując konkretną technologię przechowywania danych, czy to MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch czy coś innego, jest to tylko kwestia zainstalowania konkretnego pakietu npm jako sterownika bazy danych. Te sterowniki baz danych innych firm nie są zgodne z ujednoliconą składnią podczas wykonywania instrukcji CRUD, co sprawia, że przełączanie baz danych jest dużym problemem i podatne na błędy.
Koa: wykorzystanie funkcji JavaScript nowej generacji
Koa jest rozwijany przez zespół odpowiedzialny za Express, a jego celem jest zminimalizowanie minimalistycznego Expressu poprzez nie łączenie żadnego oprogramowania pośredniczącego w jego rdzeniu. Poza tym, że jest pozbawiony oprogramowania pośredniczącego, Koa wygląda bardzo podobnie do Express, lekki i pozbawiony opinii. Jednak to, co naprawdę wyróżnia Koa, to sposób na całkowite porzucenie oddzwaniania za pomocą funkcji generatora ES6.
Elegancki przepływ sterowania
JavaScript jest asynchronicznym językiem programowania, a przy takim instynkcie samego języka i jednowątkowym, sterowanym zdarzeniami mechanizmie Node.js, wywołanie zwrotne jest wszędzie, stąd słynne piekło wywołań zwrotnych.
Jednym ze sposobów spłaszczenia zagnieżdżania wywołań zwrotnych jest użycie Async.js. Async.js zapewnia techniki mapowania, zrównoleglania, serializacji lub iteracji wielu funkcji bez konieczności osadzania jednej w drugiej, a następnie przekazywania sterowania za pomocą funkcji wywołania zwrotnego, jedno wywołanie zwrotne i jedna funkcja obsługi błędów wystarczą dla większości zgrupowanych funkcji za pomocą metody Async.js. Jednak Async.js nie może całkowicie usunąć wywołań zwrotnych. Podczas pisania kodu Node.js za pomocą Async.js wcięcie kodu nadal ma tendencję do przesuwania się w prawo, ale nie tak głębokie.
Innym czystszym sposobem jest użycie dostępnych wtedy obietnic. Niektóre biblioteki firmy Promise cieszące się reputacją to bluebird i q. W najnowszym wydaniu JavaScript, ES6, Promise został przyjęty jako standaryzacja. Krótko mówiąc, Promise gwarantuje, że funkcje są wykonywane i zwracane w sposób sekwencyjny, łącząc bloki/funkcje implementacyjne z kilkoma funkcjami Promise „wtedy”. Albo „rozwiązujesz” na końcu każdego bloku/funkcji implementacji, aby następna funkcja „następnie” została wykonana, albo „odrzucasz” następną implementację, aby przepływ sterowania przeskakiwał od razu do obsługi błędów. W ten sposób agregujesz wszystkie funkcje obsługi błędów w jednym miejscu i całkowicie pozbędziesz się wywołań zwrotnych.

Teraz ES6 wprowadza na stół zmieniacz gier — ES6 Generator. Pojęcie to jest nowe w JavaScript, ale wcale nie jest nowe w świecie programowania. Generator ES6 jest jak przerwanie w C, zamiast uruchamiać wiersze kodu od góry do dołu, Generator ES6 wprowadza sposób uruchomienia->zatrzymania i uruchomienia czegoś innego->powrotu, aby dokończyć to, co pozostało.
Koa wykorzystuje generatory ES6, aby zapewnić elegancki sposób radzenia sobie z asynchronicznym programowaniem JavaScript, dzięki czemu nie można zobaczyć wywołań zwrotnych w czystej aplikacji Koa. Jednym z typowych przypadków użycia generatora ES6 w Koa jest kaskadowanie oprogramowania pośredniczącego, które umożliwia wykonanie dostosowanego oprogramowania pośredniego jedno po drugim bez żadnych nieprzyjemnych wywołań zwrotnych.
var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);
Nie możemy wyciągać pochopnych wniosków, twierdząc, że ta najnowocześniejsza technika jest lepsza od rozwiązań starej szkoły, takich jak Async.js, Promise czy emiter zdarzeń, ale jedno jest pewne, że przyzwyczajenie się do tej nowej koncepcji zajmuje trochę czasu. Dzięki niekonwencjonalnej sekwencji przepływu sterowania może to utrudnić debugowanie kodu.
Meteor: Framework dla sieci, urządzeń mobilnych i komputerów stacjonarnych
Meteor to wszechstronny framework JavaScript. W odróżnieniu od filozofii upraszczania Express i Koa, idzie w drugą stronę, definiując siebie jako framework z pełnym stosem, pełny pakiet, który obejmuje aplikacje serwerowe, mobilne, komputerowe i internetowe.
Pakiet jeden za wszystkich
Jeśli przyjrzysz się uważnie pod maską, zauważysz, że Meteor to tak naprawdę Node.js+Blaze/AngularJS/React+Cordova+MongoDB. Node.js i MongoDB są odpowiednio odpowiedzialne za logikę biznesową po stronie serwera i przechowywanie danych. Jeden z Blaze, AngularJS lub React zajmuje się interfejsem użytkownika. Cordova, jako najbardziej znane rozwiązanie HTML dla mobilnych aplikacji hybrydowych, łączy strony internetowe z widokami mobilnymi.
Synchronizacja danych
Główny proces udostępniania danych przez backend i front-end wygląda następująco:
- Klient żąda danych lub określonego widoku HTML
- Serwer pobiera dane z bazy danych, miesza dane z widokiem HTML za pomocą jakiegoś silnika szablonów i wysyła je z powrotem do front-endu
- Klient renderuje i pokazuje dane/widok w sposób przyjazny dla użytkownika
Nowoczesna jednostronicowa aplikacja internetowa nieco modyfikuje powyższy proces. Weźmy za przykład AngularJS, który umieszcza szablony HTML jako pliki statyczne wraz z innymi zasobami, takimi jak front-endowe pliki JavaScript, arkusze stylów i obrazy. Następnie AngularJS wypełnia dane w szablonach HTML, prosząc zaplecze o dane przy użyciu Ajax RESTful API. Tak czy inaczej, deweloperzy back-endu są w pełni odpowiedzialni za obsługę żądań zmiany danych z front-endu i zapisywanie zmian w bazie danych.
Jedną z cech wyróżniających Meteor na tle innych frameworków jest mechanizm synchronizacji danych pomiędzy aplikacjami serwerowymi i front-endowymi/mobilnymi. W Meteor klient przechowuje kopię w tle minibazy danych, która jest niewielką częścią replikacji z bazy danych serwera, częścią, która była wcześniej wymagana przez klienta i autoryzowana przez serwer. Gdy klient chce wprowadzić jakiekolwiek zmiany w danych, używa spójnego API bazy danych jako strony serwera do wykonywania instrukcji CRUD, a następnie zmiany danych zostaną automatycznie przesłane na serwer i zapisane w rzeczywistej bazie danych. Za każdym razem, gdy serwer wykryje jakiekolwiek modyfikacje danych, prześle zaktualizowane dane do określonych klientów, którzy subskrybują te dane. Ta dwukierunkowa synchronizacja danych odbywa się automatycznie, bez jakiejkolwiek ręcznej interwencji. Aby stworzyć tę magię, Meteor używa WebSocket do łączenia klienta i serwera pod maską, dzięki czemu wszelkie zmiany danych na jednym końcu zostaną natychmiast odzwierciedlone na drugim.
Narzędzie do automatyzacji kompilacji
Meteor nie tylko zajmuje się aplikacjami serwerowymi i aplikacjami internetowymi, korzystając z narzędzia do budowania Meteor o nazwie Isobuild z pomocą Cordova, biblioteki, która łączy HTML/JavaScript/CSS z natywnymi funkcjami mobilnymi, Meteor sprawia, że budowanie aplikacji na iOS i Androida jest dziecinnie proste. Wygenerowane aplikacje mobilne to aplikacje hybrydowe, które uruchamiają JavaScript lub wyświetlają strony HTML w WebView. To obejście może negatywnie wpłynąć na wrażenia użytkownika w porównaniu z natywnymi aplikacjami mobilnymi, ale dla wielu osób możliwość zarządzania tym wszystkim w ramach tej samej bazy kodu z aplikacjami internetowymi jest dość dużą zaletą i pozwala zaoszczędzić mnóstwo kosztów rozwoju.
Ogólnie rzecz biorąc, Meteor jest wysoce zautomatyzowanym frameworkiem. Ta automatyzacja na wysokim poziomie znacznie ułatwia życie programistom, ale wiąże się z kosztami ograniczeń wydajności i skalowalności. Wraz ze wzrostem bazy użytkowników technika automatycznej synchronizacji danych staje się dławikiem skalowania. Aby osiągnąć taką samą pojemność i wydajność, jak inne ręcznie dostrojone technologie zaplecza, Meteor zwykle zużywa znacznie więcej zasobów sprzętowych serwera i przepustowości. Meteor może więc być świetnym punktem wyjścia i idealnym zestawem narzędzi, jeśli chce się prototypować projekt dla wszystkich głównych platform, ale ostatecznie w pewnym momencie architektura systemu musi zostać przeprojektowana w bardziej profesjonalny sposób, jeśli prototyp stanie się projektem produkcyjnym z wystarczającą ilością baza klientów.
Sails.js: doskonała platforma MVC dla Node.js
Sails.js ma wiele podobieństw z Expressem. Jest to generator projektów, oprogramowanie pośredniczące i silnik szablonów. W rzeczywistości jest oparty na Expressie i kilku funkcjach wyższego poziomu, aby przyspieszyć rozwój.
MVC
Sails.js wykorzystuje wzorzec projektowy Model-View-Controller ze swojego rdzenia. Dla tych, którzy wywodzą się z Ruby on Rails lub Laravel, struktura aplikacji Sails.js będzie zbyt znajoma. Model reprezentuje model danych, który odzwierciedla schemat tabeli/kolekcji bazy danych, Widok to widok HTML z wypełnionymi danymi, Kontroler to miejsce, w którym umieszczasz całą logikę biznesową po stronie serwera i działa jako klej między danymi a widokiem.
Komunikacja w czasie rzeczywistym
W przeciwieństwie do żądania HTTP, w którym klient musi za każdym razem pytać o dane serwera, lub długiego połączenia odpytującego, które ustawia serwer w trybie bezczynności, Socket.io ustanawia dwukierunkową komunikację opartą na zdarzeniach między klientem a serwerem. Sails.js integruje Socket.io i zawiera interfejs API wyższego poziomu abstrakcji, aby zapewnić większą wygodę, dzięki czemu Sails.js jest szczególnie odpowiedni do tworzenia aplikacji do czatu lub gier wieloosobowych.
Baza danych ORM
Pomiędzy logiką backendu a rzeczywistą manipulacją bazą danych istnieje środkowa warstwa ORM o nazwie Waterline. Mówiąc najprościej, to narzędzie ORM zapewnia spójną składnię umożliwiającą dostęp do różnych baz danych bez konieczności martwienia się programistów o różne języki zapytań do baz danych, takie jak SQL vs NoSQL, schemat vs bez schematu i tak dalej.
Sails.js posiada średni stopień automatyzacji. Koncentruje się na logice po stronie serwera i jest gotowy do produkcji, a także zapewnia szybsze tempo rozwoju niż Express bez poświęcania wydajności lub przyszłej skalowalności. W szczególności dla dużej liczby wielbicieli wzorców MVC, Sails.js ma dość płynną krzywą uczenia się.
Zakończyć
Ten artykuł nie przedstawia rankingu różnych frameworków Node.js, a raczej wymienia lśniące punkty każdego frameworka, które wyróżniają się z tłumu, aby pomóc programistom Node.js wybrać najbardziej odpowiedni zestaw narzędzi podczas budowania projektu od podstaw.
Więc jaki jest twój ulubiony framework Node.js do tworzenia stron internetowych? Czy wolisz jakiś framework inny niż ten, który omówiliśmy powyżej? Daj nam znać w sekcji komentarzy poniżej.
- Dlaczego do diabła miałbym używać Node.js? Samouczek dla każdego przypadku
- Kodowanie Cabin Fever: samouczek dotyczący back-endu Node.js
- Budowanie interfejsu API REST Node.js/TypeScript, część 1: Express.js