I nie do końca to, czego node.js chodzi. Może dlatego, że jestem głównie programistą aplikacji biznesowych. Co to jest i do czego służy?
Jak dotąd rozumiem, że:
- Model programowania jest sterowany zdarzeniami, zwłaszcza sposób, w jaki obsługuje I / O .
- Używa JavaScript, a parser to V8 .
- Można go łatwo wykorzystać do tworzenia współbieżnych aplikacji serwerowych.
Czy moje ustalenia są prawidłowe? Jeśli tak, to jakie są zalety zdarzeń we / wy, czy to coś więcej w przypadku współbieżności? Ponadto, czy Node.js ma stać się ramowym modelem programowania opartym na JavaScript (V8)?
źródło
Używam Node.js w pracy i uważam, że jest bardzo wydajny. Zmuszony do wybrania jednego słowa do opisania Node.js, powiedziałbym „interesujący” (co nie jest czysto pozytywnym przymiotnikiem). Społeczność tętni życiem i rośnie. JavaScript, pomimo jego dziwactw, może być świetnym językiem do kodowania. Codziennie będziesz przemyślał własne rozumienie „najlepszych praktyk” i wzorców dobrze ustrukturyzowanego kodu. Node.js napływa teraz ogromna energia pomysłów, a praca w nim naraża cię na całe to myślenie - wielkie mentalne podnoszenie ciężarów.
Produkcja Node.js jest zdecydowanie możliwa, ale daleko od wdrożenia „pod klucz”, które wydaje się obiecane w dokumentacji. W Node.js v0.6.x „klaster” został zintegrowany z platformą, zapewniając jeden z podstawowych elementów składowych, ale mój skrypt „production.js” ma nadal ~ 150 linii logiki do obsługi takich rzeczy, jak tworzenie dziennika katalog, recykling martwych pracowników itp. Aby „poważna” usługa produkcyjna musiała być również przygotowana do ograniczania połączeń przychodzących i robienia wszystkiego, co Apache robi dla PHP . Szczerze mówiąc, Ruby on Rails ma dokładnie ten problem. Rozwiązuje się to za pomocą dwóch uzupełniających się mechanizmów: 1) Umieszczenie Ruby na szynach / węźle.Apache / Lighttd ). Serwer WWW może skutecznie obsługiwać zawartość statyczną, rejestrować dostęp, przepisywać adresy URL, przerywać SSL , egzekwować reguły dostępu i zarządzać wieloma pod-usługami. W przypadku żądań, które trafiły do faktycznej usługi węzła, serwer proxy przekazuje żądanie przez. 2) Używając frameworka takiego jak Unicorn, który będzie zarządzał procesami roboczymi, okresowo je przetwarzał itd. Jeszcze nie znalazłem frameworka obsługującego Node.js, który wydaje się być całkowicie upieczony; może istnieć, ale jeszcze go nie znalazłem i nadal używam ~ 150 wierszy w ręcznie zwiniętym pliku „production.js”.
Czytanie frameworków, takich jak Express , wydaje się, że standardową praktyką jest po prostu obsługiwanie wszystkiego za pośrednictwem jednej usługi Node.js typu jack-of-all-trade ... „app.use (express.static (__ dirname + '/ public'))” . W przypadku usług i rozwoju o niskim obciążeniu prawdopodobnie nie jest to w porządku. Ale gdy tylko spróbujesz obciążyć swoją usługę dużym nakładem czasu i uruchamiać ją 24 godziny na dobę, 7 dni w tygodniu, szybko odkryjesz motywacje, które popychają duże witryny do posiadania dobrze upieczonego, utwardzonego kodu C, takiego jak Nginx, umieszczającego swoją stronę i obsługującego wszystkie żądań zawartości statycznej (... dopóki nie skonfigurujesz sieci CDN , takiej jak Amazon CloudFront )). Dla nieco humorystycznego i bezwstydnie negatywnego podejścia do tego zobacz tego faceta .
Node.js znajduje również coraz więcej zastosowań innych niż usługi. Nawet jeśli używasz czegoś innego do udostępniania treści internetowych, możesz nadal używać Node.js jako narzędzia do kompilacji, używając modułów npm do organizowania kodu, Browserify, aby połączyć go w pojedynczy zasób i uglify-js, aby zminimalizować go do wdrożenia . JavaScript do komunikacji z Internetem jest idealnym dopasowaniem impedancji i często czyni go najłatwiejszą drogą ataku. Na przykład, jeśli chcesz przeszukiwać wiele ładunków odpowiedzi JSON , powinieneś użyć mojego modułu podkreślenia CLI , paska narzędzi danych strukturalnych.
Za I przeciw:
W porównaniu z prostym modelem jednoprocesowym na żądanie ( LAMP ):
W przeciwieństwie do pisania „prawdziwej” usługi w Javie / C # / C (C? Naprawdę?)
Aby uzyskać inne spojrzenie na JavaScript i Node.js, sprawdź From Java to Node.js , post na blogu na temat wrażeń i doświadczeń programisty Java na temat uczenia się Node.js.
Moduły Rozważając węzeł, pamiętaj, że wybór bibliotek JavaScript DEFINICUJE twoje wrażenia. Większość ludzi używa co najmniej dwóch, pomocnika asynchronicznego wzorca (Step, Futures, Async) i modułu cukru JavaScript ( Underscore.js ).
Cukier pomocnika / JavaScript:
Moduły wzorców asynchronicznych:
Lub, aby przeczytać wszystko o bibliotekach asynchronicznych, zobacz ten wywiad panelowy z autorami.
Framework sieciowy:
Testowanie:
Sprawdź także oficjalną listę zalecanych modułów Node.js. Jednak Wiki Node Modules GitHub jest znacznie bardziej kompletna i stanowi dobry zasób.
Aby zrozumieć Węzeł, warto rozważyć kilka kluczowych opcji projektowania:
Node.js jest OPARTY NA ZDARZENIACH i ASYNCHRONICZNY / NIE BLOKUJĄCY. Zdarzenia, takie jak przychodzące połączenie HTTP, uruchamiają funkcję JavaScript, która wykonuje trochę pracy i uruchamia inne asynchroniczne zadania, takie jak łączenie się z bazą danych lub pobieranie zawartości z innego serwera. Po uruchomieniu tych zadań funkcja zdarzenia kończy się, a Node.js wraca do trybu uśpienia. Gdy tylko wydarzy się coś innego, na przykład nawiązywane połączenie z bazą danych lub serwer zewnętrzny odpowiadający treścią, uruchamiane są funkcje wywołania zwrotnego i wykonuje się więcej kodu JavaScript, potencjalnie uruchamiając jeszcze więcej zadań asynchronicznych (takich jak zapytanie do bazy danych). W ten sposób Node.js z radością przeplata działania dla wielu równoległych przepływów pracy, uruchamiając wszelkie działania, które są odblokowane w dowolnym momencie. Dlatego Node.js wykonuje tak świetną robotę, zarządzając tysiącami jednoczesnych połączeń.
Dlaczego nie użyć jednego procesu / wątku na połączenie, jak wszyscy inni?W Node.js nowe połączenie jest tylko bardzo małą alokacją sterty. Przyspieszenie nowego procesu wymaga znacznie więcej pamięci, megabajt na niektórych platformach. Ale rzeczywisty koszt to narzut związany z przełączaniem kontekstu. Kiedy masz 10 ^ 6 wątków jądra, jądro musi wykonać wiele pracy, zastanawiając się, kto powinien wykonać następny. Sporo pracy poświęcono na zbudowanie harmonogramu O (1) dla Linuksa, ale ostatecznie o wiele bardziej efektywne jest posiadanie jednego procesu sterowanego zdarzeniem niż 10 ^ 6 procesów rywalizujących o czas procesora. Ponadto, w warunkach przeciążenia, model wieloprocesowy zachowuje się bardzo słabo, głodując krytyczne usługi administracji i zarządzania, szczególnie SSHD (co oznacza, że nie możesz nawet zalogować się do skrzynki, aby dowiedzieć się, jak naprawdę jest przykręcony).
Node.js jest POJEDYNCZY GWINTOWANY i BEZPŁATNY . Node.js, jako bardzo przemyślany wybór projektu, ma tylko jeden wątek na proces. Z tego powodu dostęp do danych jednocześnie przez wiele wątków jest zasadniczo niemożliwy. Dlatego nie są potrzebne żadne blokady. Wątki są trudne. Naprawdę bardzo ciężko. Jeśli w to nie wierzysz, nie wykonałeś wystarczająco dużo programowania wątkowego. Prawidłowe zablokowanie jest trudne i powoduje błędy, które są naprawdę trudne do wyśledzenia. Wyeliminowanie blokad i wielowątkowości sprawia, że jedna z najgorszych klas błędów po prostu odchodzi. To może być największa zaleta węzła.
Ale jak mogę skorzystać z mojego 16-rdzeniowego urządzenia?
Dwie drogi:
Node.js pozwala robić naprawdę potężne rzeczy bez zerwania. Załóżmy, że masz program Node.js, który wykonuje różne zadania, nasłuchujepoleceń na porcie TCP i koduje niektóre obrazy. Za pomocą pięciu wierszy kodu możesz dodać portal zarządzania oparty na HTTP, który pokazuje aktualny stan aktywnych zadań. ŁATWO jest zrobić:
Teraz możesz kliknąć adres URL i sprawdzić status swojego uruchomionego procesu. Dodaj kilka przycisków, a otrzymasz „portal zarządzania”. Jeśli masz działający skrypt Perl / Python / Ruby, samo „wrzucenie portalu zarządzania” nie jest do końca proste.
Ale czy JavaScript nie jest wolny / zły / zły / spawn-of-the-devil? JavaScript ma pewne dziwne dziwactwa, ale z „dobrymi stronami” jest tam bardzo mocny język, aw każdym razie JavaScript jest językiem na kliencie (przeglądarce). JavaScript zostanie tutaj; inne języki celują w to jako IL, a światowej klasy talent konkuruje o produkcję najbardziej zaawansowanych silników JavaScript. Ze względu na rolę JavaScriptu w przeglądarce włożono ogromny wysiłek inżynieryjny w szybkie przyspieszenie JavaScript. V8to najnowszy i największy silnik javascript, przynajmniej na ten miesiąc. Zdmuchuje inne języki skryptowe zarówno pod względem wydajności ORAZ stabilności (patrząc na ciebie, Ruby). I tylko poprawi się to dzięki ogromnym zespołom pracującym nad tym problemem w Microsoft, Google i Mozilli, konkurujących o zbudowanie najlepszego silnika JavaScript (To już nie jest „interpreter” JavaScript, ponieważ wszystkie nowoczesne silniki robią mnóstwo JITkompilacja pod maską z interpretacją tylko jako rezerwowy kod dla kodu jednorazowego wykonania). Tak, wszyscy chcielibyśmy naprawić kilka dziwniejszych wyborów językowych JavaScript, ale tak naprawdę nie jest tak źle. A język jest tak elastyczny, że tak naprawdę nie kodujesz JavaScript, kodujesz Step lub jQuery - bardziej niż jakikolwiek inny język, w JavaScript biblioteki definiują to doświadczenie. Aby budować aplikacje internetowe, i tak musisz znać JavaScript, więc kodowanie go na serwerze ma pewnego rodzaju synergię umiejętności. Sprawiło, że nie boję się pisać kodu klienta.
Poza tym, jeśli NAPRAWDĘ nienawidzisz JavaScript, możesz użyć cukru syntaktycznego, takiego jak CoffeeScript . Lub cokolwiek innego, co tworzy kod JavaScript, na przykład Google Web Toolkit (GWT).
Mówiąc o JavaScript, co to jest „zamknięcie”? - Właściwie fantazyjny sposób powiedzenia, że zachowuje się zmienne o zasięgu leksykalnym w łańcuchach połączeń. ;) Lubię to:
Widzisz, jak możesz po prostu użyć „myData” bez robienia czegokolwiek niewygodnego, jak wbicie go do obiektu? I inaczej niż w Javie, zmienna „myData” nie musi być tylko do odczytu. Ta potężna funkcja języka sprawia, że programowanie asynchroniczne jest znacznie mniej szczegółowe i mniej bolesne.
Pisanie kodu asynchronicznego zawsze będzie bardziej skomplikowane niż pisanie prostego skryptu jednowątkowego, ale w Node.js nie jest to dużo trudniejsze i zyskujesz wiele korzyści oprócz wydajności i skalowalności dla tysięcy jednoczesnych połączeń. ..
źródło
V8 to implementacja JavaScript. Pozwala uruchamiać niezależne aplikacje JavaScript (między innymi).
Node.js jest po prostu biblioteką napisaną dla V8, która wykonuje zdarzenia I / O. Ta koncepcja jest nieco trudniejsza do wyjaśnienia i jestem pewien, że ktoś odpowie lepiej, niż ja ... Istotą jest to, że zamiast robić jakieś dane wejściowe lub wyjściowe i czekać, aż to się stanie, po prostu nie czekaj do końca. Na przykład zapytaj o czas ostatniej edycji pliku:
Może to potrwać kilka milisekund lub może potrwać kilka sekund. Za pomocą zdarzeń I / O po prostu odpalasz żądanie i zamiast czekać, dołączasz oddzwanianie, które uruchamia się po zakończeniu żądania:
To sprawia, że przypomina kod JavaScript w przeglądarce (na przykład z funkcjonalnością stylu Ajax ).
Aby uzyskać więcej informacji, zapoznaj się z artykułem Node.js jest naprawdę ekscytujący, co stanowiło moje wprowadzenie do biblioteki / platformy ... Uważam, że jest całkiem niezły.
źródło
Node.js to narzędzie wiersza polecenia typu open source zbudowane dla kodu JavaScript po stronie serwera. Możesz pobrać tarball , skompilować i zainstalować źródło. Pozwala uruchamiać programy JavaScript.
JavaScript jest wykonywany przez V8 , silnik JavaScript opracowany przez Google, który jest używany w przeglądarce Chrome . Używa JavaScript API, aby uzyskać dostęp do sieci i systemu plików.
Jest popularny ze względu na swoją wydajność i zdolność do wykonywania operacji równoległych.
Poniżej kilka dobrych artykułów na ten temat.
źródło
Zamknięcia są sposobem na wykonanie kodu w kontekście, w którym został utworzony.
Dla pewności oznacza to, że możesz zdefiniować zmienne, a następnie zainicjować nieblokującą funkcję We / Wy i wysłać jej anonimową funkcję dla jej wywołania zwrotnego.
Po zakończeniu zadania funkcja wywołania zwrotnego zostanie wykonana w kontekście zmiennych, jest to zakończenie.
Powodem, dla którego zamknięcia są tak dobre do pisania aplikacji z nieblokującymi wejściami / wyjściami, jest to, że bardzo łatwo jest zarządzać kontekstem funkcji wykonujących asynchronicznie.
źródło
Dwa dobre przykłady dotyczą sposobu zarządzania szablonami i korzystania z progresywnych ulepszeń. Potrzebujesz tylko kilku lekkich fragmentów kodu JavaScript, aby działał idealnie.
Zdecydowanie zalecamy obejrzenie i przeczytanie tych artykułów:
Wybierz dowolny język i spróbuj zapamiętać, w jaki sposób zarządzasz szablonami plików HTML i co musiałeś zrobić, aby zaktualizować pojedynczą nazwę klasy CSS w strukturze DOM (na przykład użytkownik kliknął element menu i chcesz, aby był on oznaczony jako „wybrano” i zaktualizuj zawartość strony).
W Node.js jest to tak proste, jak w kodzie JavaScript po stronie klienta. Pobierz węzeł DOM i zastosuj do tego klasę CSS. Zdobądź swój węzeł DOM i innerHTML treść (aby to zrobić, potrzebujesz dodatkowego kodu JavaScript. Przeczytaj artykuł, aby dowiedzieć się więcej).
Innym dobrym przykładem jest to, że możesz dostosować swoją stronę internetową do włączonej lub wyłączonej obsługi JavaScript za pomocą tego samego fragmentu kodu. Wyobraź sobie, że masz wybraną datę w JavaScript, która pozwoliłaby twoim użytkownikom wybrać dowolną datę za pomocą kalendarza. Możesz napisać (lub użyć) ten sam fragment kodu JavaScript, aby włączyć lub wyłączyć JavaScript.
źródło
Istnieje bardzo dobra analogia miejsca typu fast food, która najlepiej wyjaśnia model Node.js sterowany zdarzeniami, zobacz pełny artykuł, Node.js, gabinety lekarskie i restauracje fast food - Zrozumienie programowania sterowanego zdarzeniami
Oto podsumowanie:
Node.js jest sterowany zdarzeniami, ale większość serwerów WWW jest oparta na wątkach. York wyjaśnia, jak działa Node.js:
Korzystasz z przeglądarki internetowej, aby poprosić o plik „/about.html” na serwerze internetowym Node.js.
Serwer Node.js przyjmuje żądanie i wywołuje funkcję pobierania tego pliku z dysku.
Podczas gdy serwer Node.js czeka na pobranie pliku, obsługuje następne żądanie sieciowe.
Po pobraniu pliku do kolejki serwerów Node.js wstawiana jest funkcja zwrotna.
Serwer Node.js wykonuje tę funkcję, która w tym przypadku wyrenderowałaby stronę „/about.html” i odesłała ją z powrotem do przeglądarki internetowej. ”
źródło
Cóż, rozumiem to
Dla mnie oznacza to, że miałeś rację we wszystkich trzech założeniach. Biblioteka z pewnością wygląda obiecująco!
źródło
Nie zapomnij też wspomnieć, że Google V8 jest BARDZO szybki. W rzeczywistości konwertuje kod JavaScript na kod maszynowy o dopasowanej wydajności skompilowanego pliku binarnego. Tak więc, wraz ze wszystkimi innymi świetnymi rzeczami, jest NIESAMOWICIE szybki.
źródło
Q: Model programowanie sterowane zdarzeniami, zwłaszcza sposób, w jaki obsługuje I / O .
Poprawny. Używa wywołań zwrotnych, więc każde żądanie dostępu do systemu plików spowoduje wysłanie żądania do systemu plików, a następnie Node.js rozpocznie przetwarzanie następnego żądania. Będzie martwił się tylko żądaniem We / Wy, gdy otrzyma odpowiedź z systemu plików, w którym to czasie uruchomi kod wywołania zwrotnego. Możliwe jest jednak wykonywanie synchronicznych żądań We / Wy (czyli blokowanie żądań). Deweloper może wybrać między trybem asynchronicznym (wywołania zwrotne) lub synchronicznym (oczekiwanie).
P: Używa JavaScript, a parser to V8.
tak
P: Można go łatwo wykorzystać do tworzenia współbieżnych aplikacji serwerowych.
Tak, chociaż będziesz musiał ręcznie napisać sporo kodu JavaScript. Lepiej byłoby przyjrzeć się ramom, takim jak http://www.easynodejs.com/ - która zawiera pełną dokumentację online i przykładową aplikację.
źródło