Co To jest Node.js? [zamknięte]

Nie do końca rozumiem jaki węzeł.js to wszystko. Może dlatego, że jestem głównie webowym programistą aplikacji biznesowych. Co to jest i jaki jest jego pożytek?

Jak na razie rozumiem, że:

  1. model programowania jest sterowany zdarzeniami, szczególnie sposób, w jaki obsługujeI/O .
  2. używa JavaScript , a parser to V8.
  3. można go łatwo wykorzystać do tworzenia aplikacji serwerowych.

Are my rozumienie poprawne? Jeśli tak, to jakie są korzyści z evented I / O, czy to tylko bardziej dla rzeczy współbieżnych? Również kierunek węzła.js, aby stać się frameworkiem, opartym na JavaScript (opartym na V8) modelu programowania?

Author: Peter Mortensen, 2009-12-11

10 answers

Myślę, że zalety to:

  1. Tworzenie stron internetowych w dynamicznym języku (JavaScript) na niewiarygodnie szybkiej maszynie wirtualnej (V8). Jest znacznie szybszy niż Ruby, Python czy Perl.

  2. Możliwość obsługi tysięcy jednoczesnych połączeń przy minimalnym obciążeniu na jednym procesie.

  3. JavaScript jest idealny dla pętli zdarzeń z obiektami funkcyjnymi pierwszej klasy i zamknięciami. Ludzie już wiedzą, jak go używać w ten sposób, gdy użyli go w przeglądarce, aby odpowiedzieć do zdarzeń inicjowanych przez użytkownika.

  4. Wiele osób zna już JavaScript, nawet osoby, które nie twierdzą, że są programistami. Jest to prawdopodobnie najpopularniejszy język programowania.

  5. Korzystanie z JavaScript na serwerze WWW, a także przeglądarki zmniejsza niedopasowanie impedancji między dwoma środowiskami programistycznymi, które mogą komunikować struktury danych za pomocą JSON, które działają tak samo po obu stronach równania. Zduplikowany kod weryfikacyjny formularza może być współdzielony pomiędzy serwerem i klienta itp.

 213
Author: postfuturist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-23 18:31:23

Używam Node.js w pracy, i uważają, że jest bardzo potężny. Zmuszony wybrać jedno słowo do opisania węzła.js, powiedziałbym "interesujący" (co nie jest czysto pozytywnym przymiotnikiem). Społeczność jest prężnie rozwijająca się. JavaScript, pomimo swoich dziwnych cech, może być świetnym językiem do kodowania. Będziesz codziennie zastanawiać się nad własnym rozumieniem "najlepszych praktyk" i wzorców dobrze ustrukturyzowanego kodu. Do węzła płynie ogromna energia idei.js teraz, a praca w nim naraża Cię na wszystkie to myślenie-wielkie podnoszenie ciężarów psychicznych.

Węzeł.js w produkcji jest zdecydowanie możliwe, ale daleko od wdrożenia" pod klucz " pozornie obiecanego przez dokumentację. Z Węzłem.js v0. 6.x, "klaster" został zintegrowany z platformą, zapewniając jeden z podstawowych elementów składowych, ale moja " produkcja.skrypt js to nadal ~150 linijek logiki do obsługi takich rzeczy jak tworzenie katalogu dziennika, recykling martwych pracowników itp. Dla "poważnej" usługi produkcyjnej, trzeba również być przygotowany do dławienia przychodzących połączeń i robienia wszystkich rzeczy, które Apache robi dla PHP . Aby być uczciwym, Ruby on Rails ma ten dokładny problem. Rozwiązuje się to za pomocą dwóch uzupełniających się mechanizmów: 1) umieszczanie Ruby na Rails/Node.js za dedykowanym serwerem (napisanym w C i przetestowanym do piekła i z powrotem) jak Nginx (lub Apache / Lighttd). Serwer może efektywnie obsługiwać statyczną zawartość, logować dostęp, przepisywać adresy URL, terminować SSL , egzekwuj reguły dostępu i zarządzaj wieloma podusługami. W przypadku żądań, które trafiają w rzeczywistą usługę węzła, serwer internetowy przetwarza żądanie. 2) Korzystanie z frameworka typu Unicorn, który będzie zarządzał procesami workera, poddawał je cyklicznemu recyklingowi itp. Jeszcze nie znalazłem węzła.js serwujący framework, który wydaje się w pełni upieczony; może istnieje, ale jeszcze go nie znalazłem i nadal używam ~150 linii w mojej ręcznie zwijanej " produkcji.js".

Czytanie frameworków typu Express sprawia, że wygląda na to, że standardową praktyką jest serwowanie wszystkiego przez jeden węzeł typu jack-of-all-trades.serwis js ... "app.użycie (wym.static(__dirname + '/public'))". W przypadku usług o niższym obciążeniu i rozwoju jest to prawdopodobnie w porządku. Ale jak tylko spróbujesz załadować swój serwis i uruchomić go 24 godziny na dobę, 7 dni w tygodniu, szybko odkryjesz motywacje, które zmuszają duże witryny do posiadania dobrze upieczonego, utwardzonego kodu C, takiego jak Nginx fronting ich witryny i obsługi wszystkich statycznych żądań treści (...dopóki nie skonfigurujesz CDN , Jak Amazon CloudFront)). W pewnym sensie humorystycznym i bezczelnie negatywnym podejściu do tego, Zobacz ten facet.

Węzeł.js Znajduje również coraz więcej zastosowań poza serwisem. Nawet jeśli używasz czegoś innego do serwowania treści internetowych, nadal możesz używać węzła.js jako narzędzie do budowania, za pomocą modułów npm do organizowania kodu, Browserify do łączenia go w jeden zasób, a uglify-js do minifikacji go do wdrożenia. Do radzenia sobie z Internetem, JavaScript jest idealnym dopasowaniem impedancji i często sprawia, że jest to najłatwiejsza droga ataku. Na przykład, jeśli chcesz przepełnić kilka ładunków odpowiedzi JSON, powinieneś użyć mojego modułu underscore-CLI, pasa narzędziowego strukturyzowanych danych.

Plusy / Minusy:

  • Pro: dla faceta od serwerów pisanie JavaScript w backendzie było "lekiem bramy" do nauki nowoczesnych wzorców interfejsu użytkownika. Już nie boję się pisać kod klienta.
  • Pro: zachęca do właściwego sprawdzania błędów (err jest zwracany przez praktycznie wszystkie wywołania zwrotne, dokuczając programiście, aby to obsłużył; również asynchroniczne.js i inne biblioteki radzą sobie z paradygmatem "fail if any of these subtasks fails" znacznie lepiej niż typowy kod synchroniczny)
  • Pro: niektóre interesujące i zwykle trudne zadania stają się trywialne - jak uzyskanie statusu zadań w locie, komunikacja między pracownikami lub udostępnianie stanu pamięci podręcznej [52]}
  • Pro: ogromna społeczność i wiele świetnych bibliotek opartych na solidnym menedżerze pakietów (npm)
  • Con: JavaScript nie ma standardowej biblioteki. Jesteś tak przyzwyczajony do importowania funkcjonalności, że dziwnie się czujesz, gdy używasz JSON.parse lub inna metoda wbudowana, która nie wymaga dodawania modułu npm. Oznacza to, że istnieje pięć wersji wszystkiego. Nawet moduły zawarte w węźle.js "core" ma jeszcze pięć wariantów, jeśli nie będziesz zadowolony z domyślnej implementacji. Prowadzi to do szybkiej ewolucji, ale także jakiś poziom zamieszania.

Kontra prosty model jednego procesu na żądanie ( Lampa):

  • Pro: skalowalny do tysięcy aktywnych połączeń. Bardzo szybki i bardzo wydajny. W przypadku flot internetowych może to oznaczać 10-krotne zmniejszenie liczby wymaganych pól w porównaniu z PHP lub Ruby [52]}
  • Pro: pisanie równoległych wzorców jest łatwe. Wyobraź sobie, że musisz pobrać trzy (lub N) obiekty BLOB z Memcached . Zrób to w PHP ... czy ty właśnie napisałeś kod the fetches the pierwsza plama, potem druga, potem trzecia? Wow, to powoli. Istnieje specjalny moduł PECL , aby naprawić ten konkretny problem dla Memcached, ale co, jeśli chcesz pobrać niektóre dane Memcached równolegle z zapytaniem bazy danych? W Węźle.js, ponieważ paradygmat jest asynchroniczny, posiadanie żądania internetowego do wielu rzeczy jednocześnie jest bardzo naturalne.
  • Con: Kod asynchroniczny jest zasadniczo bardziej złożony niż kod synchroniczny, a krzywa uczenia się z góry może być trudna dla deweloperzy bez solidnego zrozumienia, co tak naprawdę oznacza wykonywanie współbieżne. Mimo to jest to znacznie mniej trudne niż pisanie jakiegokolwiek wielowątkowego kodu z blokowaniem.
  • Con: jeśli żądanie wymagające dużej mocy obliczeniowej działa na przykład przez 100 ms, wstrzyma przetwarzanie innych żądań, które są obsługiwane w tym samym węźle.proces js ... AKA, kooperacja-wielozadaniowość . Można to złagodzić za pomocą wzorca Web Workers (spinning off podproces do radzenia sobie z kosztowne zadanie). Alternatywnie można użyć dużej liczby węzłów.pracownicy js i tylko Niech każdy z nich obsługuje jedno żądanie jednocześnie (nadal dość wydajny, ponieważ nie ma recyklingu procesu).
  • Con: Uruchamianie systemu produkcyjnego jest znacznie bardziej skomplikowane niż CGI model jak Apache + PHP, Perl, Ruby , itd. Nieobsługiwane wyjątki obniżą cały proces, wymagając logiki do ponownego uruchomienia nieudanych pracowników (zobacz klaster). Moduły z wadliwym kodem natywnym mogą mocno zawiesić proces. Za każdym razem, gdy pracownik umiera, wszelkie żądania, które obsługiwał, są odrzucane, więc jeden wadliwy interfejs API może łatwo obniżyć usługę dla innych spójnych interfejsów API.

Kontra napisanie "prawdziwej" usługi w Javie / C # / C (C? naprawdę?)

  • Pro: Robienie asynchronicznego w Node.js jest łatwiejszy niż robienie bezpieczeństwa wątków gdziekolwiek indziej i prawdopodobnie zapewnia większe korzyści. Węzeł.js jest zdecydowanie najmniej bolesnym paradygmatem asynchronicznym, w jakim kiedykolwiek pracowałem. Przy dobrych bibliotekach jest to tylko nieco trudniejsze niż pisanie kodu synchronicznego.
  • Pro: Brak błędów wielowątkowości / blokowania. To prawda, że inwestujesz z góry w pisanie bardziej szczegółowego kodu, który wyraża prawidłowy asynchroniczny przepływ pracy bez operacji blokowania. I trzeba napisać kilka testów i uruchomić (jest to język skryptowy, a nazwy zmiennych fat fingering są przechwytywane tylko w czasie testów jednostkowych). Ale, gdy już go uruchomisz, powierzchnia dla heisenbugs -- dziwne problemy, które przejawiają się tylko raz na milion przejazdów, że powierzchnia jest znacznie znacznie niższa. Węzeł pisania podatków.kod js jest mocno załadowany do fazy kodowania. Wtedy masz tendencję do kończenia ze stabilnym kodem.
  • Pro: JavaScript jest znacznie lżejszy do wyrażania funkcjonalności. Trudno to udowodnić słowami, ale JSON , dynamiczne pisanie, notacja lambda, dziedziczenie prototypów, lekkie Moduły, cokolwiek ... po prostu zajmuje mniej kodu do wyraź te same pomysły.
  • Con: może naprawdę lubisz usługi kodowania w Javie?

Dla innego spojrzenia na JavaScript i węzeł.js, zobacz od Javy do węzła.js, post na blogu o wrażeniach i doświadczeniach programisty Java learning Node.js.


Moduły Rozważając node, pamiętaj, że wybrane przez Ciebie biblioteki JavaScript będą definiować Twoje doświadczenie. Większość ludzi używa co najmniej dwóch, an asynchronous pattern helper (Step, Futures, Async) oraz moduł JavaScript sugar (Underscore.js ).

Helper / JavaScript Sugar:

  • podkreślenie.js - Użyj tego. Zrób to. To sprawia, że Twój kod jest ładny i czytelny z takimi rzeczami jak _.isString (), oraz _.isArray (). Nie jestem pewien, jak można inaczej napisać bezpieczny kod. Ponadto, aby uzyskać ulepszony wiersz poleceń-fu, sprawdź mój własny Underscore-CLI .

Wzór Asynchroniczny Moduły:

  • Krok - bardzo elegancki sposób wyrażania kombinacji działań szeregowych i równoległych. Moje osobiste rekomendacje. Zobacz mój post Jak wygląda Kod kroku.
  • Futures - znacznie bardziej elastyczny (czy to naprawdę dobrze?) sposób wyrażania zamówienia poprzez wymagania. Może wyrażać rzeczy takie jak "start a, b, c równolegle. Kiedy A i B skończą, zacznij od AB. Kiedy A i C skończą, zacznij AC."Taka elastyczność wymaga większej staranności, aby uniknąć błędy w przepływie pracy (takie jak nigdy nie wywoływanie połączenia zwrotnego lub wywoływanie go wiele razy). Zobacz post Raynosa na temat wykorzystania kontraktów futures (to jest post, który sprawił, że "dostałem" kontrakty futures).
  • Async - bardziej tradycyjna biblioteka z jedną metodą dla każdego wzorca. Zacząłem od tego przed moim religijnym nawróceniem na krok, a następnie zdałem sobie sprawę, że wszystkie wzorce w Asynchronice mogą być wyrażone w kroku za pomocą jednego bardziej czytelnego paradygmatu.
  • TameJS - napisane przez OKCupid, to prekompilator, który dodaje nowy język "oczekujący" na eleganckie pisanie szeregowych i równoległych obiegów pracy. Wzór wygląda niesamowicie, ale wymaga wstępnej kompilacji. Wciąż się zastanawiam nad tym.
  • StreamlineJS - konkurent do TameJS. Skłaniam się ku oswojeniu, ale sam się zdecyduj.

Lub aby przeczytać wszystko o bibliotekach asynchronicznych, zobacz ten panel-Wywiad z autorami.

Www Framework: {]}

  • Express świetny Framework Ruby on Rails - esk do organizowania stron www. Używa JADE jako silnika szablonów XML / HTML, co sprawia, że budowanie HTML jest znacznie mniej bolesne, a nawet prawie eleganckie.
  • JQuery nie jest technicznie modułem węzłowym, jednak szybko staje się de facto standardem dla interfejsu użytkownika po stronie klienta. jQuery udostępnia selektory podobne do CSS do "odpytywania" zestawów elementów DOM, na których można następnie operować (programy obsługi zestawów, właściwości, style itp.). W tym samym duchu, Twitter Bootstrap CSS framework, kręgosłup.js dla wzorca MVC i Browserify.js , aby połączyć wszystkie pliki JavaScript w jeden plik. Wszystkie te moduły stają się de facto standardami, więc powinieneś przynajmniej je sprawdzić, jeśli o nich nie słyszałeś.

Testowanie:

  • JSHint - należy użyć; nie używałem tego na początku, co teraz wydaje się niezrozumiałe. JSLint dodaje kilka podstawowych weryfikacji, które otrzymujesz za pomocą skompilowanego języka, takiego jak Java. Niedopasowany nawias, niezgłoszone zmienne, typy o wielu kształtach i rozmiarach. Możesz także włączyć różne formy tego, co nazywam "trybem analnym", w którym sprawdzasz styl białych spacji i tym podobne, co jest w porządku, jeśli to twoja filiżanka herbaty-ale prawdziwa wartość pochodzi z natychmiastowego uzyskania informacji zwrotnej na temat dokładnego numeru linii, w którym zapomniałeś zamknięcia")"... bez konieczności uruchamiania kodu i uderzania w linię obrażeń. "JSHint" jest bardziej konfigurowalnym wariantem Douglasa Crockforda's Jslinta.
  • Mocha konkurent ślubów, które zaczynam preferować. Oba frameworki dobrze radzą sobie z podstawami, ale złożone wzory są łatwiejsze do wyrażenia w Mocha.
  • Ślubowanie jest naprawdę eleganckie. I wypisuje piękny raport (--spec) pokazujący, które przypadki testowe przeszły / nie przeszły. Poświęć 30 minut na naukę, a możesz tworzyć podstawowe testy dla Twoje Moduły przy minimalnym wysiłku.
  • Zombie - Bezgłowe testowanie HTML i JavaScript przy użyciu JSDom jako wirtualnej "przeglądarki". Bardzo potężna rzecz. Połącz go z Replay , aby uzyskać błyskawiczne deterministyczne testy kodu w przeglądarce.
  • komentarz do jak" myśleć " o testach:
    • testowanie nie jest opcjonalne. W przypadku dynamicznego języka, takiego jak JavaScript, istnieje bardzo kilka statycznych sprawdzeń. Na przykład, przekazywanie dwóch parametrów do metoda, która oczekuje 4, nie pęknie, dopóki kod nie zostanie wykonany. Dość niski pasek do tworzenia błędów w JavaScript. Podstawowe testy są niezbędne do uzupełnienia luki weryfikacyjnej w skompilowanych językach.
    • zapomnij o walidacji, po prostu wykonaj kod. Dla każdej metody, moim pierwszym przypadkiem walidacji jest "nic nie pęka", i to jest przypadek, który uruchamia się najczęściej. Udowodnienie, że Twój kod działa bez rzucania łapie 80% błędów i zrobi tak wiele, aby zwiększyć pewność kodu, że będziesz znajdź sobie powrót i dodanie dopracowanych przypadków walidacji, które pominąłeś.
    • zacznij od małego i przełamaj barierę inercyjną. Wszyscy jesteśmy leniwi i spragnieni czasu, a testowanie łatwo postrzegać jako"dodatkową pracę". Więc zacznij od małego. Napisz przypadek testowy 0-załaduj swój moduł i zgłoś sukces. Jeśli zmusisz się do tego, to bariera bezwładnościowa do testowania zostanie złamana. To
    • teraz Rozwiń swoje testy za pomocą kodu. Nie daj się zastraszyć, jak wyglądałby" poprawny " test end-to-end z makietami serwerów i tym podobne. Kod zaczyna się prosty i ewoluuje do obsługi nowych przypadków; testy również powinny. Jak dodać nowe przypadki i nową złożoność do swojej kod, dodaj przypadki testowe, aby wykonać nowy kod. Gdy znajdziesz błędy, dodaj weryfikacje i / lub nowe przypadki, aby pokryć wadliwy kod. Kiedy debugujesz i tracisz zaufanie do kawałka kodu, wróć i dodaj testy, aby udowodnić, że robi to, co myślisz, że jest. Przechwytywanie ciągów przykładowych danych (z innych usług, które wywołujesz, stron internetowych, które zeskrobujesz, cokolwiek) i przesyłanie ich do kodu parsującego. Kilka przypadków tutaj, ulepszona Walidacja tam, a skończysz z wysoce niezawodnym kod.

Sprawdź również oficjalną listę zalecanego węzła.Moduły js. Jednak GitHub ' s Node Modules Wiki jest znacznie bardziej kompletna i dobrym zasobem.


aby zrozumieć węzeł, warto rozważyć kilka kluczowych wyborów projektowych:

Węzeł.js jest oparte na zdarzeniach i asynchroniczne / nieblokujące . Zdarzenia, np. przychodzące połączenie HTTP odpali Funkcja 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ę i węzeł.js wraca spać. Jak tylko coś się stanie, jak połączenie z bazą danych jest ustanowiony lub zewnętrzny serwer reaguje z treścią, funkcje callback ogień, i więcej kod JavaScript wykonuje, potencjalnie startuje jeszcze więcej zadania asynchroniczne (np. zapytanie do bazy danych). W ten sposób węzeł.js z radością przeplata działania dla wielu równoległych przepływów pracy, uruchamiając dowolne działania, które zostaną odblokowane w dowolnym momencie. Dlatego Node.js świetnie radzi sobie z zarządzaniem tysiącami jednoczesnych połączeń.

dlaczego nie użyć po prostu jednego procesu / wątku na połączenie, jak wszyscy inni? W Węźle.js, nowe połączenie to tylko bardzo mały przydział sterty. Nowy proces wymaga znacznie więcej pamięci, megabajt na niektórych platformach. Ale rzeczywisty koszt to narzut związany z przełączaniem kontekstu. Gdy masz 10^6 wątków jądra, jądro musi wykonać wiele pracy zastanawiając się, kto powinien wykonać następny. Wiele pracy włożyliśmy w zbudowanie schedulera o(1) dla Linuksa, ale w końcu posiadanie pojedynczego procesu sterowanego zdarzeniami jest o wiele bardziej wydajne niż 10^6 procesów konkurujących o Czas procesora. Również w warunkach przeciążenia model wieloprocesowy zachowuje się bardzo słabo, szczególnie SSHD (czyli nie można nawet zalogować się do skrzynki, aby dowiedzieć się, jak to jest naprawdę popieprzone).

Węzeł.js to pojedynczy gwint i blokada wolna. Węzeł.js, jako bardzo celowy wybór projektu ma tylko jeden wątek na proces. Z tego powodu dostęp do danych przez wiele wątków jest zasadniczo niemożliwy. W związku z tym nie są potrzebne żadne zamki. Nici są twarde. Naprawdę mocno. Jeśli Nie wierzysz w to, nie zrobiłeś wystarczająco dużo wątkowego programowania. Poprawne zablokowanie jest trudne i skutkuje błędami, które naprawdę trudno wyśledzić. Eliminacja blokad i wielowątkowość sprawia, że jedna z najgorszych klas błędów po prostu odchodzi. Może to być największa zaleta node.

ale jak mogę skorzystać z mojego 16 core box?

Dwa sposoby:

  1. do dużych, ciężkich zadań obliczeniowych, takich jak kodowanie obrazu, węzeł.js może odpalić procesy potomne lub wysyłanie wiadomości do dodatkowych procesów roboczych. W tym projekcie masz jeden wątek zarządzający przepływem zdarzeń i N procesów wykonujących ciężkie zadania obliczeniowe i żujących pozostałe 15 procesorów.
  2. aby skalować przepustowość w usłudze webservice, należy uruchomić wiele węzłów.serwery js na jednym pudełku, Po jednym na rdzeń, za pomocą klastra (z węzłem.js v0. 6.x, powiązany tutaj oficjalny moduł "klastra" zastępuje wersję learnboost, która ma inne API). Tych lokalnych węzłów.js serwery mogą następnie konkurować na gnieździe, aby zaakceptować nowe połączenia, równoważąc obciążenie między nimi. Po zaakceptowaniu połączenia staje się ono ściśle związane z pojedynczym z tych wspólnych procesów. Teoretycznie brzmi to źle, ale w praktyce działa całkiem dobrze i pozwala uniknąć bólu głowy pisania kodu bezpiecznego dla wątku. Oznacza to również, że węzeł.js uzyskuje doskonałe powinowactwo do pamięci podręcznej procesora, efektywniej wykorzystując przepustowość pamięci.

węzeł.js pozwala zrobić naprawdę potężne rzeczy bez potu. Załóżmy, że masz węzeł.program js, który wykonuje różne zadania, nasłuchuje na porcie TCP dla poleceń, koduje niektóre obrazy, cokolwiek. Za pomocą pięciu linii kodu można dodać do portalu zarządzania WWW opartego na HTTP, który pokazuje aktualny stan aktywnych zadań. To jest łatwe do zrobienia:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

Teraz możesz nacisnąć adres URL i sprawdzić status uruchomionego procesu. Dodaj kilka przycisków i masz "portal zarządzania". Jeśli masz bieganie Skrypt Perl / Python / Ruby, samo "wrzucenie portalu zarządzania" nie jest do końca proste.

ale czy JavaScript nie jest powolny / zły / zły / spawn-of-the-devil? JavaScript ma jakieś dziwne dziwactwa, ale z "dobrymi częściami" jest tam bardzo potężny język, a w każdym razie JavaScript jest językiem klienta (przeglądarki). JavaScript jest tutaj, aby zatrzymać; inne języki są kierowane do niego jako IL, a światowej klasy talenty rywalizują o produkcję najbardziej zaawansowanych Silniki JavaScript. Ze względu na rolę JavaScript w przeglądarce, ogromna ilość wysiłku inżynieryjnego jest rzucana na tworzenie JavaScript blazing szybko. V8 to najnowszy i najlepszy silnik javascript, przynajmniej w tym miesiącu. Zdmuchuje inne języki skryptowe zarówno pod względem wydajności, jak i stabilności (patrząc na Ciebie, Ruby). I tylko będzie lepiej z ogromnymi zespołami pracującymi nad tym problemem w Microsoft, Google i Mozilla, konkurując o najlepszy silnik JavaScript (Nie jest to już "interpreter" JavaScript, jak wszystkie nowoczesne silniki robią Tony JIT kompilacji pod maską z interpretacją tylko jako alternatywa dla kodu execute-once). Tak, wszyscy chcielibyśmy móc naprawić kilka dziwniejszych opcji języka JavaScript, ale naprawdę nie jest tak źle. A język jest tak cholernie elastyczny, że naprawdę nie kodujesz JavaScript, tylko kodujesz Step lub jQuery - bardziej niż jakikolwiek inny język, w JavaScript biblioteki definiują doświadczenie. Do budowy aplikacje internetowe, i tak trzeba znać JavaScript, więc kodowanie z nim na serwerze ma swego rodzaju synergię umiejętności. To sprawiło, że nie bałem się pisać kodu klienta.

Poza tym, jeśli naprawdę nienawidzisz JavaScript, możesz użyć cukru składniowego jak CoffeeScript . Lub cokolwiek innego, co tworzy kod JavaScript, jak Google Web Toolkit (GWT).

mówiąc o JavaScript, co to jest "zamknięcie"? - dość fantazyjny sposób na powiedzenie, że zachowujesz zmienne o zasięgu leksykalnym w łańcuchach połączeń. ;) TAK:

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

Widzisz, jak możesz używać "myData" bez robienia czegokolwiek niewygodnego, jak schowanie go w obiekcie? W przeciwieństwie do Javy, zmienna "myData" nie musi być tylko do odczytu. Ta potężna funkcja języka sprawia, że programowanie asynchroniczne jest znacznie mniej gadatliwe i mniej bolesne.

Pisanie kodu asynchronicznego zawsze będzie bardziej złożone niż pisanie prostego skryptu jednowątkowego, ale z węzłem.js, to nie tak dużo trudniej i masz wiele korzyści oprócz wydajności i skalowalności do tysięcy jednoczesnych połączeń...

 619
Author: Dave Dopson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:24

V8 jest implementacją JavaScript. Pozwala na uruchamianie samodzielnych aplikacji JavaScript (między innymi).

Węzeł.js jest po prostu biblioteką napisaną dla V8, która nie obsługuje We/Wy. ta koncepcja jest nieco trudniejsza do wyjaśnienia i jestem pewien, że ktoś odpowie lepszym wyjaśnieniem niż ja... Chodzi o to, że zamiast robić jakieś wejście lub wyjście i czekać na to, aby się stało, po prostu nie czekać, aż to się skończy. Więc na przykład poproś o ostatni edytowany czas z pliku:

// Pseudo code
stat( 'somefile' )
To może zająć kilka milisekund lub sekundy. Z evented I / o po prostu odpalasz żądanie i zamiast czekać w pobliżu dołączasz wywołanie zwrotne, które zostanie uruchomione po zakończeniu żądania:
// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

To sprawia, że jest bardzo podobny do kodu JavaScript w przeglądarce (na przykład z funkcjonalnością stylu Ajax ).

Aby uzyskać więcej informacji, zapoznaj się z artykułem węzeł.js jest naprawdę ekscytujące co było moim wprowadzeniem do biblioteki / platformy... Uważam, że jest całkiem dobry.

 86
Author: rfunduk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 09:17:21

Węzeł.js jest otwartym narzędziem wiersza poleceń zbudowanym dla kodu JavaScript po stronie serwera. Możesz pobrać tarball , skompilować i zainstalować źródło. Pozwala na uruchamianie programów JavaScript.

JavaScript jest uruchamiany przez V8 , silnik JavaScript opracowany przez Google, który jest używany w Chrome przeglądarki. Używa JavaScript API, aby uzyskać dostęp do sieci i systemu plików.

Jest popularny ze względu na swoją wydajność i możliwość wykonywania równoległych szef.

Rozumienie węzła.js jest najlepszym wyjaśnieniem węzła.js znalazłem do tej pory.

Poniżej kilka dobrych artykułów na ten temat.

 36
Author: Asif Mushtaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 09:23:31

Zamknięcia są sposobem wykonania kodu w kontekście, w którym został utworzony.

Dla concurency oznacza to, że możesz zdefiniować zmienne, a następnie zainicjować niezablokowaną funkcję I/O i wysłać jej anonimową funkcję do wywołania zwrotnego.

Gdy zadanie zostanie zakończone, funkcja callback zostanie wykonana w kontekście ze zmiennymi, jest to zamknięcie.

Powodem, dla którego zamknięcia są tak dobre do pisania aplikacji z nieblokującymi I / O, jest to, że jest bardzo łatwe zarządzanie kontekstem funkcji wykonujących się asynchronicznie.

 13
Author: Fire Crow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 09:21:43

Dwa dobre przykłady dotyczą zarządzania szablonami i używania z nimi progresywnych ulepszeń. Wystarczy kilka lekkich fragmentów kodu JavaScript, aby działał idealnie.

Gorąco polecam obejrzenie i przeczytanie tych artykułów:

Wybierz dowolny język i spróbuj zapamiętać, jak będziesz zarządzać szablonami plików HTML i co musisz zrobić, aby zaktualizować pojedyncza nazwa klasy CSS w strukturze DOM (na przykład użytkownik kliknął na element menu i chcesz, aby był oznaczony jako "wybrany" i zaktualizował zawartość strony).

Z Węzłem.js jest to tak proste, jak robienie tego w kodzie JavaScript po stronie klienta. Pobierz węzeł DOM i zastosuj do niego klasę CSS. Pobierz swój węzeł DOM i innerHTML swoją zawartość (będziesz potrzebował dodatkowego kodu JavaScript, aby to zrobić. Przeczytaj artykuł, aby dowiedzieć się więcej).

Kolejnym dobrym przykładem jest że możesz sprawić, że Twoja strona internetowa będzie kompatybilna zarówno z włączonym, jak i wyłączonym JavaScript za pomocą tego samego kawałka kodu. Wyobraź sobie, że masz wybór daty dokonany w JavaScript, który pozwoliłby użytkownikom wybrać dowolną datę za pomocą kalendarza. Możesz napisać (lub użyć) ten sam fragment kodu JavaScript, aby działał z włączonym lub wyłączonym JavaScript.

 8
Author: Renato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 09:26:20

Istnieje bardzo dobra analogia do fast foodów, która najlepiej wyjaśnia model węzła oparty na zdarzeniach.js, zobacz cały artykuł, węzeł.js, gabinety lekarskie i restauracje typu Fast Food – zrozumienie programowania opartego na zdarzeniach

Oto podsumowanie:

Jeśli fast food joint podążał za tradycyjnym modelem opartym na wątkach, zamawiałeś Jedzenie i czekałeś w kolejce, aż je otrzymasz. Osoba stojąca za tobą nie byłaby w stanie zamówić, dopóki twoje zamówienie nie zostanie wykonane. W model sterowany zdarzeniami, zamawiasz jedzenie, a następnie wysiadasz z kolejki, aby czekać. Wszyscy inni mogą zamówić.

Node.js jest oparty na zdarzeniach, ale większość serwerów internetowych opiera się na wątkach.York wyjaśnia, jak Node.js działa:

  • Używasz przeglądarki internetowej, aby złożyć wniosek o " / o nas.html " na Węzeł.js web server.

  • Węzeł.js server przyjmuje twoje żądanie i wywołuje funkcję do pobrania ten plik z dysku.

  • Podczas gdy węzeł.serwer js czeka na pobranie pliku, to usługi kolejne żądanie internetowe.

  • Po pobraniu pliku istnieje funkcja callback, która jest wstawiony do węzła.kolejki serwerów js.

  • Węzeł.js server wykonuje tę funkcję, która w tym przypadku render the " / about.html " strony i wysłać go z powrotem do przeglądarki internetowej."

 7
Author: adeleinr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 10:13:55

Cóż, rozumiem, że

  • celem Node jest zapewnienie łatwego sposobu do budowania skalowalnych programów sieciowych.
  • Node jest podobny pod względem konstrukcyjnym do systemów takich jak Event Machine Ruby czy Twisted Pythona.
  • Evented I / O for V8 javascript.

Dla mnie oznacza to, że miałeś rację we wszystkich trzech założeniach. Biblioteka wygląda obiecująco!

 6
Author: nes1983,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-10 23:17:25

Również, nie zapomnij wspomnieć, że Google V8 jest bardzo szybki. W rzeczywistości konwertuje kod JavaScript na kod maszynowy z dopasowaną wydajnością skompilowanego pliku binarnego. Więc wraz z innymi wspaniałymi rzeczami, jest szalenie szybki.

 6
Author: Quinton Pike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 10:11:54

Q: model programowania jest sterowany zdarzeniami, szczególnie sposób, w jaki obsługuje I / O .

Zgadza się. 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 węzła.js rozpocznie przetwarzanie następnego żądania. Martwi się tylko o żądanie wejścia / wyjścia, 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 prośby). Do programisty należy wybór pomiędzy asynchronicznym (wywołania zwrotne) lub synchronicznym (oczekiwanie).

Q: używa JavaScript, a parserem jest V8.

Tak

Q: może być łatwo używany do tworzenia aplikacji serwerowych.

Tak, chociaż trzeba by ręcznie kodować sporo JavaScript. Może lepiej spojrzeć na framework, taki jak http://www.easynodejs.com / - który zawiera pełną dokumentację online i przykładową aplikację.

 3
Author: Charles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 10:22:09