Co to jest Node.js?


Nie bardzo rozumiem, co to jest

Node.js
http://en.wikipedia.org/wiki/Node.js... Może dlatego, że jestem głównie programistą internetowych aplikacji biznesowych. Co to jest i jaki jest pożytek z tego?
O ile rozumiem, wygląda to tak:

Czy moje rozumienie jest prawidłowe? Jeśli tak, jakie są zalety zdarzonych operacji we/wy - czy jest to po prostu bardziej równoległe? Ponadto, czy kierunek Node.js jest tą samą strukturą, co model programowania oparty na JavaScript (V8)?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Używam Node.js w pracy i uważam, że jest bardzo potężny. Zmuszony do wybrania jednego słowa opisującego Node.js, powiedziałbym „interesujący” (co nie jest przymiotnikiem czysto pozytywnym). Społeczność aktywnie się rozwija i rośnie. JavaScript, pomimo swoich dziwactw, może być świetnym językiem programowania. I codziennie przemyślisz swoje własne rozumienie „najlepszych praktyk” i wzorców dobrze zorganizowanego kodu. Ogromna energia pomysłów wlewa się teraz do Node.js, a praca nad nim naraża Cię na całe to myślenie - Wielkie Podnoszenie Ciężarów Mentalnych.
Node.js w produkcji jest z pewnością możliwe, ale daleko mu do wdrożenia „pod klucz”, które wydawało się obiecane w dokumentacji. W przypadku Node.js v0.6.x „klaster” został zintegrowany z platformą, zapewniając jeden z głównych elementów składowych, ale mój skrypt „production.js” nadal zawiera ~ 150 linii logiki do obsługi takich rzeczy, jak tworzenie katalogu dziennika, recykling martwych pracowników, itp. W przypadku "poważnej" usługi produkcyjnej musisz być również przygotowany na dławienie przychodzących połączeń i robienie wszystkiego, co robi Apache

PHP
http://en.wikipedia.org/wiki/PHP... Aby być uczciwym

Ruby on Rails
http://en.wikipedia.org/wiki/Ruby_on_Rails
To ma

dokładnie

ten problem. Rozwiązuje się go za pomocą dwóch uzupełniających się mechanizmów: 1) umieszczenie Ruby on Rails/Node.js za dedykowanym serwerem sieciowym (napisanym w C i przetestowanym w piekle iz powrotem) jak

Nginx
http://en.wikipedia.org/wiki/Nginx
(lub

Apache
http://en.wikipedia.org/wiki/Apache_HTTP_Server
/

Lighttd
http://en.wikipedia.org/wiki/Lighttpd). serwer sieciowy może wydajnie obsługiwać statyczną zawartość, logować się, przepisywać adresy URL, kończyć działanie

SSL
http://en.wikipedia.org/wiki/SSL, stosuj zasady dostępu i zarządzaj wieloma usługami wsparcia. W przypadku żądań, które trafiają do rzeczywistej usługi hosta, serwer WWW przekazuje żądanie za pośrednictwem. 2) przy użyciu struktury, takiej jak

Unicorn
http://unicorn.bogomips.org/, która będzie zarządzać przepływami pracy, okresowo je przetwarzać itp. Nadal nie znalazłem frameworka służącego Node.js, który wydaje się kompletnie wypalony; może istnieć, ale jeszcze go nie znalazłem i nadal używam ~ 150 linii w moim ręcznie zwijanym pliku „production.js”.
Ramy czytania, takie jak

Express
http://expressjs.com/, pozwala pomyśleć, ż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 (__ katalog + '/ public'))". W przypadku usług o mniejszym obciążeniu i rozwoju prawdopodobnie jest to w porządku. Ale kiedy spróbujesz włożyć dużo czasu do swojej usługi i uruchomić ją 24 godziny na dobę, 7 dni w tygodniu, szybko odkryjesz motywacje, które popychają duże witryny do posiadania dobrze wypalonego, doprawionego kodu C, takiego jak Nginx, który transmituje swoją witrynę i obsługuje wszystkie statyczne żądania zawartości (... do czasu skonfigurowania

CDN
http://en.wikipedia.org/wiki/C ... twork, tak jak

Amazon CloudFront
http://en.wikipedia.org/wiki/Amazon_CloudFront)). Aby uzyskać nieco zabawne i bezwstydnie negatywne spojrzenie na to, spójrz na

ten facet
http://teddziuba.com/2011/10/n ... .html
.
Node.js znajduje również coraz więcej zastosowań niezwiązanych z usługami. Nawet jeśli używasz czegoś innego do obsługi treści WWW, nadal możesz używać Node.js jako narzędzia do budowania, używając modułów npm do organizowania kodu.

Browserify
https://github.com/substack/node-browserify
połączyć je w jeden zasób i

brzydki-js
https://github.com/mishoo/UglifyJS
zminimalizować jego rozmieszczenie. Do pracy w sieci JavaScript jest idealny

dopasowanie impedancji
http://en.wikipedia.org/wiki/O ... match
a to często sprawia, że ​​jest to najłatwiejsza ścieżka ataku. Na przykład, jeśli chcesz czołgać się przez stertę

przydatny
http://en.wikipedia.org/wiki/JSON
mnóstwo odpowiedzi JSON, powinieneś użyć mojego modułu

podkreślenia-
https://github.com/ddopson/underscore-cli
CLI, Structured Data Service Belt.

Za I przeciw:
>
  • Pro: Dla gościa od serwera pisanie JavaScript na zapleczu było „bramką” do nauki nowoczesnych wzorców interfejsu użytkownika. Nie boję się już pisać kodu klienta.
  • Pro: ma tendencję do zachęcania do poprawnego sprawdzania błędów (błąd jest zwracany przez prawie wszystkie wywołania zwrotne, zmuszając programistę do jego obsługi; ponadto async.js i inne biblioteki obsługują paradygmat "niepowodzenie, jeśli którekolwiek z tych podzadań zawiedzie" znacznie lepiej niż typowe synchroniczne kod)
  • Pro: niektóre interesujące i zwykle trudne zadania stają się trywialne - na przykład uzyskanie statusu zadań w locie, komunikacja między pracownikami, czy udostępnienie stanu pamięci podręcznej
  • Pro: ogromna społeczność i mnóstwo wspaniałych bibliotek opartych na solidnym menedżerze pakietów (npm)
  • Wada: JavaScript nie ma standardowej biblioteki. Jesteś tak przyzwyczajony do importowania funkcjonalności, że wydaje się dziwne, gdy używasz JSON.parse lub innej metody kompilacji, która nie wymaga dodawania modułu npm. Oznacza to, że istnieje pięć wersji wszystkiego. Nawet moduły zawarte w „rdzeniu” Node.js mają pięć dodatkowych opcji, jeśli nie jesteś zadowolony z domyślnej implementacji. Prowadzi to do szybkiej ewolucji, ale także do pewnego stopnia zamieszania.


W porównaniu z prostym jednym procesem na żądanie (

LAMP
http://en.wikipedia.org/wiki/L ... %2529
):
>
  • Pro: skalowalny do tysięcy aktywnych połączeń. Bardzo szybki i bardzo wydajny. W przypadku parku internetowego może to oznaczać 10-krotne zmniejszenie liczby wymaganych modułów w porównaniu z PHP lub Ruby.
  • Pro: Pisanie równoległych szablonów jest łatwe. Wyobraź sobie, że musisz wyodrębnić trzy (lub N) plamy z Memcached http://en.wikipedia.org/wiki/Memcached... Zrób to w PHP ... czy po prostu napisałeś kod, który wyodrębnia pierwszy obiekt blob, potem drugi i trzeci Wow, co za powolność. Istnieje dedykowany moduł PECL, który rozwiązuje ten konkretny problem w Memcached, ale co zrobić, jeśli chcesz pobrać niektóre dane z Memcached równolegle z zapytaniem do bazy danych W Node.js, ponieważ paradygmat jest asynchroniczny, posiadanie żądania internetowego wykonującego wiele rzeczy równolegle jest bardzo naturalne.
  • Wada: Kod asynchroniczny jest zasadniczo bardziej złożony niż kod synchroniczny, a zaawansowana krzywa uczenia się może być trudna dla programistów bez jasnego zrozumienia, co naprawdę oznacza współbieżność. Jest to jednak znacznie mniej trudne niż napisanie dowolnego blokującego kodu wielowątkowego.
  • Wada: jeśli żądanie intensywne obliczeniowo zostanie wykonane, na przykład przez 100 ms, zatrzyma przetwarzanie innych żądań, które są przetwarzane w tym samym procesie Node.js ... AKA, współpraca wielozadaniowa http://en.wikipedia.org/wiki/C ... ng... Można to złagodzić za pomocą wzorca Web Workers (rozpoczęcie podprocesu w celu rozwiązania kosztownego zadania). Możesz także użyć dużej liczby pracowników Node.js i pozwolić każdemu z nich przetwarzać tylko jedno żądanie na raz (nadal jest to całkiem wydajne, ponieważ nie ma procesu recyklingu).
  • Wada: Uruchamianie systemu produkcyjnego DUŻO jest trudniejsze niż modelu CGI, takiego jak Apache + PHP, Perl http://en.wikipedia.org/wiki/Perl , Ruby http://en.wikipedia.org/wiki/R ... %2529i tak dalej. Nieobsłużone wyjątki zatrzymają cały proces, co będzie wymagało logicznego ponownego uruchomienia uszkodzonych procesów roboczych (zobacz. grupa http://nodejs.org/docs/latest/api/cluster.html). Moduły z błędnym kodem natywnym mogą mocno przerwać proces. Za każdym razem, gdy proces roboczy umiera, wszystkie obsłużone przez niego żądania są odrzucane, więc jeden błąd interfejsu API może łatwo obniżyć jakość usługi dla innych współhostowanych interfejsów API.


Przeciwko pisaniu „prawdziwej” usługi w Javie/C #/C (C? Naprawdę?)
>
  • Zaleta: Wykonywanie operacji asynchronicznych w Node.js jest łatwiejsze niż zabezpieczanie wątków w innym miejscu i być może zapewnia wiele korzyści. Node.js to zdecydowanie najmniej bolesny asynchroniczny paradygmat, w jakim kiedykolwiek pracowałem. Przy dobrych bibliotekach jest to tylko trochę trudniejsze niż pisanie kodu synchronicznego.
  • Pro: brak błędów wielowątkowości/blokowania. To prawda, że ​​inwestujesz z wyprzedzeniem, aby napisać bardziej szczegółowy kod, który wyraża prawidłowy asynchroniczny przepływ pracy bez żadnych operacji blokujących. I musisz napisać kilka testów i sprawić, by to działało (jest to język skryptowy, a nazwy zmiennych z grubymi palcami są przechwytywane tylko podczas testu jednostkowego). ALE, kiedy już to zrobisz, pole powierzchni Heisenbugs http://en.wikipedia.org/wiki/HeisenbugDziwne problemy, które pojawiają się tylko raz na milion uruchomień - ta powierzchnia jest po prostu znacznie mniejsza. Kod podatkowy Node.js jest mocno obciążony na etapie kodowania. Wtedy zwykle kończy się stabilny kod.
  • Pro: JavaScript jest znacznie łatwiejszy do wyrażenia funkcjonalności. Trudno to udowodnić słowami, ale JSON http://en.wikipedia.org/wiki/JSON, dynamiczne typowanie, notacja lambda, dziedziczenie prototypowe, lekkie moduły, cokolwiek ... zwykle potrzeba mniej kodu, aby wyrazić te same pomysły.
  • CON: Może naprawdę lubisz usługi kodowania Java

Aby zobaczyć inne spojrzenie na JavaScript i Node.js, sprawdź
Java na Node.js.

http://n0tw0rthy.wordpress.com ... e-js/, post na blogu o wrażeniach i doświadczeniach programisty Java uczącego się Node.js.

Moduły

rozważając węzeł, należy pamiętać, że wybór bibliotek JavaScript będzie

DEFINE

Twoje doświadczenie. Większość ludzi używa co najmniej dwóch, asynchronicznego pomocnika wzorców (Step, Futures, Async) i modułu cukru JavaScript (

Underscore.js
http://en.wikipedia.org/wiki/Underscore.js
).
Pomocnik/JavaScript Sugar:

Asynchroniczne moduły szablonów:
  • Krok https://github.com/creationix/step-bardzo elegancki sposób wyrażania kombinacji działań sekwencyjnych i równoległych. Moja osobista rekomendacja. Widzieć mój post https://coderoad.ru/5989538/jak wygląda kod kroku.
  • Futures https://github.com/coolaj86/futures- Znacznie bardziej elastyczny (czy to naprawdę dobry) Sposób wyrażenia zamówienia poprzez wymagania. Możesz wyrazić coś w stylu „start b, c równolegle. Kiedy A i B kończą, rozpocznij AB. Kiedy A i C zakończą, uruchom AC”. Ta elastyczność wymaga większej uwagi, aby uniknąć błędów w przepływie pracy (np. Nigdy bez wywołania wywołania zwrotnego lub dzwoniąc wielokrotnie). Cm ... wiadomość https://coderoad.ru/5989538/Rainos o korzystaniu z kontraktów futures (to jest post, który sprawił, że „dostałem” futures).
  • Async https://github.com/caolan/async- bardziej tradycyjna biblioteka z jedną metodą na szablon. Zacząłem od tego przed moim religijnym nawróceniem się na krok i późniejszym uświadomieniem sobie, że wszystkie wzorce asynchroniczne można wyrazić w kroku przy użyciu jednego bardziej czytelnego paradygmatu.
  • TameJS http://tamejs.org/- napisany przez OKCupid, jest to prekompilator, który dodaje nowy priorytet językowy „await” do eleganckiego pisania sekwencyjnych i równoległych przepływów pracy. Szablon wygląda niesamowicie, ale wymaga wcześniejszej kompilacji. Nadal pracuję nad tym problemem.
  • StreamlineJS https://github.com/Sage/streamlinejs-konkurent do TameJS. Skłaniam się ku udomowieniu, ale możesz sam zdecydować.

Lub przeczytaj wszystko o bibliotekach asynchronicznych, zobacz

ten panel wywiadów
http://www.infoq.com/articles/ ... cript
z autorami.
framework sieciowy:

Testowanie:
  • JSHint http://github.com/jshint/node-jshint-muszę użyć; Na początku go nie używałem, co teraz wydaje się zagmatwane. JSLint dodaje kilka podstawowych sprawdzeń, które otrzymujesz za pomocą skompilowanego języka, takiego jak Java. Niespójne nawiasy, niezadeklarowane zmienne, typy o różnych kształtach i rozmiarach. Możesz również dołączyć różne formy tego, co nazywam „trybem analnym”, w którym sprawdzasz styl białych znaków i wszystko to jest w porządku, jeśli to twoja filiżanka herbaty, ale prawdziwą wartością jest uzyskanie natychmiastowej informacji zwrotnej na temat dokładnego numeru wiersza, w którym zapomniałeś zamknij ")" ... bez konieczności uruchamiania kodu i trafienia w niewłaściwą linię. „JSHint” to bardziej konfigurowalna wersja JSLint Douglas Crockford https://rads.stackoverflow.com ... 17742 . http://www.jslint.com/
  • Mokka http://visionmedia.github.com/mocha/- rywal ślubów, które zaczynam preferować. Obie frameworki całkiem nieźle radzą sobie z podstawami, ale złożone wzorce są zwykle łatwiejsze do wyrażenia w mokce.
  • Śluby http://vowsjs.org/- jest naprawdę bardzo elegancki. I drukuje piękny raport (--spec) pokazujący, które przypadki testowe przeszły/nie powiodły się. Poświęć 30 minut na naukę, a przy minimalnym wysiłku stworzysz podstawowe testy dla swoich modułów.
  • Zambi https://github.com/assaf/zombiebezgłowe testowanie HTML i JavaScript przy użyciu JSDom w https://github.com/tmpvar/jsdom/jako wirtualna „przeglądarka”. Bardzo potężna rzecz. Połącz to z powtarzać https://github.com/assaf/node-replay#readmeaby uzyskać błyskawiczne, deterministyczne testy kodu w przeglądarce.
  • Skomentuj, jak „pomyśl o” testowaniu: [list][*]Testowanie jest opcjonalne. Z dynamicznym językiem, takim jak JavaScript, statyczne sprawdzenia wysoko mało. Na przykład przekazanie dwóch parametrów do metody, która oczekuje 4, nie spowoduje przerwania, dopóki kod nie zostanie wykonany. Dość niski pasek błędów w JavaScript. Podstawowe testy są potrzebne, aby wypełnić lukę kontrolną w kompilowanych językach.
  • Zapomnij o sprawdzaniu, po prostu wykonaj swój kod. Dla każdej metody mój pierwszy przypadek testowy to „nic się nie psuje” i to jest przypadek, który działa najbardziej. Udowodnienie, że twój kod działa bez wyrzucania 80% błędów i zrobi tak wiele, aby zwiększyć pewność kodu, że wrócisz i dodasz niuanse walidacji, które przegapiłeś.
  • Zacznij od małego i przełamaj barierę bezwładności. Wszyscy jesteśmy leniwi i czasochłonni i łatwo jest uznać testowanie za „dodatkową pracę”. Więc zacznij od małych rzeczy. Napisz przypadek testowy 0 - załaduj moduł i zgłoś sukces. Jeśli się do tego zmusisz, to bariera inercji testowania zostanie zerwana. Wykonanie tego za pierwszym razem, w tym przeczytanie dokumentacji, zajmuje mniej niż 30 minut. Teraz napisz przypadek testowy 1 - wywołaj jedną ze swoich metod i upewnij się, że „nic się nie psuje”, to znaczy, że błąd nie jest zwracany. Przypadek testowy 1 powinien zająć mniej niż minutę. Wraz z zanikiem bezwładności łatwo jest stopniowo rozszerzać zakres testu.
  • Teraz opracuj testy za pomocą swojego kodu. Nie daj się zastraszyć tym, jak będzie wyglądał „poprawny” test od początku do końca z fałszywymi serwerami i tak dalej. Kod na początku jest prosty i ewoluuje, aby obsługiwać nowe przypadki; testy też powinny. Dodając nowe przypadki i bardziej złożony kod, dodaj przypadki testowe, aby wykonać nowy kod. Gdy znajdziesz błędy, dodaj kontrole i/lub nowe przypadki, aby pokryć wadliwy kod. Kiedy debugujesz i tracisz zaufanie do fragmentu kodu, wróć i dodaj testy, aby udowodnić, że robi to, co myślisz, że robi. Pobierz wiersze przykładowych danych (z innych usług, z których korzystasz, stron internetowych, które wyczyścisz, cokolwiek) i wprowadź je do kodu parsującego. Kilka przypadków tutaj, ulepszona walidacja tam i otrzymujesz wysoce niezawodny kod.

[/*]
[/list]
Sprawdź też

oficjalna lista
http://nodejs.org/docs/v0.4.11/api/appendix_1.html
zalecane moduły Node.js. ale

Węzeł Wiki modułów GitHub
http://en.wikipedia.org/wiki/GitHub
jest znacznie bardziej kompletnym i lepszym źródłem informacji.

Aby zrozumieć Node, warto rozważyć kilka kluczowych wyborów projektowych.

:
Node.js

oparta na wydarzeniach

i

ASYNCHRONOUS

/

ODBLOKOWANY
... Zdarzenia, takie jak przychodzące połączenie HTTP, wyzwalają funkcję JavaScript, która niewiele działa i wyzwala inne zadania asynchroniczne, takie jak łączenie się z bazą danych lub pobieranie zawartości z innego serwera. Po uruchomieniu tych zadań funkcja zdarzenia kończy się i Node.js ponownie przechodzi w stan hibernacji. Gdy tylko wydarzy się coś innego, na przykład zostanie nawiązane połączenie z bazą danych lub serwer zewnętrzny odpowie treścią, uruchamiane są funkcje zwrotne i wykonywanych jest więcej kodu JavaScript, co może wywołać jeszcze bardziej asynchroniczne zadania (takie jak zapytanie do bazy danych). W ten sposób Node.js będzie szczęśliwie przeplatał działania w wielu równoległych przepływach pracy, wykonując wszystkie czynności, które są odblokowane w danym momencie. Właśnie dlatego Node.js tak dobrze radzi sobie z zarządzaniem tysiącami jednoczesnych połączeń.


Dlaczego nie użyć jednego procesu/wątku dla każdego połączenia, jak wszyscy inni?
W Node.js nowe połączenie jest po prostu bardzo małą alokacją sterty. Rozpoczęcie nowego procesu zajmuje znacznie więcej pamięci, megabajtów na niektórych platformach. Ale prawdziwy koszt to narzut związany z przełączaniem kontekstu. Kiedy masz 10 ^ 6 wątków jądra, jądro musi wykonać dużo pracy, zastanawiając się, kto powinien teraz uruchomić. Wiele pracy włożono w stworzenie harmonogramu O (1) dla Linuksa, ale ostatecznie po prostu znacznie bardziej wydajne jest posiadanie jednego procesu sterowanego zdarzeniami niż 10 ^ 6 procesów konkurujących na czas procesora. Ponadto w warunkach przeciążenia model wieloprocesorowy zachowuje się bardzo słabo, pozbawiając krytyczne usługi administracyjne i zarządzania, zwłaszcza SSHD (co oznacza, że ​​nie możesz nawet wejść do pudełka, aby dowiedzieć się, jak naprawdę jest pokręcony).
Node.js

jednowątkowy

i bez

zamek
... Node.js jako bardzo przemyślany wybór projektowy ma tylko jeden wątek na proces. Z tego powodu jednoczesny dostęp do danych wielu wątków jest zasadniczo niemożliwy. W ten sposób nie są potrzebne żadne zamki. Nici są bardzo sztywne. Bardzo, bardzo ciężko. Jeśli w to nie wierzysz, oznacza to, że nie zrobiłeś wystarczająco dużo programowania wątków. Uzyskanie właściwej blokady jest trudne i prowadzi do błędów, które są naprawdę trudne do wyśledzenia. Eliminacja blokad i wielowątkowości sprawia, że ​​jedna z najbardziej obrzydliwych klas błędów po prostu znika. To może być największa zaleta node.


Ale jak mogę używać mojego 16-rdzeniowego pudełka?
Dwie drogi:
  • W przypadku dużych i ciężkich zadań obliczeniowych, takich jak kodowanie obrazów, Node.js może uruchamiać procesy potomne lub wysyłać komunikaty do dodatkowych procesów roboczych. W tym projekcie będziesz mieć jeden wątek kontrolujący przepływ zdarzeń i N procesów wykonujących ciężkie zadania obliczeniowe i żujących pozostałe 15 procesorów.
  • Aby skalować przepustowość w usłudze sieciowej, musisz uruchomić wiele serwerów Node.js w tym samym bloku, po jednym na rdzeń, używając grupa http://nodejs.org/api/cluster.html(od Node.js v0.6.x, oficjalny moduł „klaster”, do którego link znajduje się tutaj, zastępuje wersję Learnboost, która ma inny interfejs API). Te lokalne serwery Node.js mogą następnie konkurować w gnieździe o akceptację nowych połączeń, równoważąc ich obciążenie. Po zaakceptowaniu połączenia staje się ono ściśle powiązane z jednym z tych ogólnych procesów. W teorii brzmi to źle, ale w praktyce działa całkiem nieźle i pozwala uniknąć bólu głowy związanego z pisaniem kodu bezpiecznego dla wątków. Oznacza to również, że Node.js zyskuje doskonałe powinowactwo pamięci podręcznej procesora, dzięki czemu lepiej wykorzystuje przepustowość pamięci.

Node.js pozwala robić naprawdę potężne rzeczy bez nadmiernego wysiłku.
Załóżmy, że masz program Node.js, który wykonuje różne zadania i nasłuchuje poleceń

przez
http://en.wikipedia.org/wiki/T ... tocol
Port TCP, koduje niektóre obrazy itp. Za pomocą pięciu wierszy kodu można dodać do portalu zarządzania WWW opartego na protokole HTTP, który pokazuje aktualny stan aktywnych zadań. Jest to Ł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 kliknąć przycisk URL i sprawdzić stan uruchomionego procesu. Dodaj kilka przycisków, a otrzymasz „portal zarządzania”. Jeśli masz działający skrypt Perl/Python/Ruby, po prostu „wrzucenie do portalu zarządzania” nie jest całkowicie proste.


Ale czy JavaScript nie jest wolny/zły/zły/spawn-of-the-devil?
JavaScript ma kilka dziwnych cech, ale z „dobrymi stronami” istnieje bardzo potężny język, a zresztą JavaScript jest tym językiem na kliencie (przeglądarce). JavaScript jest na zawsze; inne języki celują w to jako IL, a światowej klasy talenty rywalizują o produkcję najbardziej zaawansowanych silników JavaScript. Ze względu na rolę JavaScript w przeglądarce, bardzo dużo wysiłku inżynierów włożono w bardzo szybkie tworzenie JavaScript.

V8
http://en.wikipedia.org/wiki/V ... %2529
to najnowszy i najlepszy silnik javascript przynajmniej w tym miesiącu. To zdmuchuje inne języki skryptowe zarówno pod względem wydajności, jak i stabilności (patrząc na ciebie Ruby). A to będzie tylko lepsze, gdy ogromne zespoły pracujące nad tym problemem w Microsoft, Google i Mozilla będą konkurować o stworzenie lepszego silnika JavaScript (nie jest to już „interpreter” JavaScript, ponieważ wszystkie nowoczesne silniki wykonują mnóstwo kompilacji JIT pod maską z tłumaczeniem tylko jako rozwiązanie zastępcze dla kodu jednorazowego wykonania). Tak, wszyscy chcielibyśmy naprawić niektóre z dziwniejszych odmian języka JavaScript, ale naprawdę nie jest tak źle. A język jest tak cholernie elastyczny, że tak naprawdę nie kodujesz JavaScript, kodujesz Step lub jQuery - bardziej niż jakikolwiek inny język, biblioteki JavaScript definiują doświadczenie. Aby tworzyć aplikacje internetowe, i tak musisz znać JavaScript, więc kodowanie za jego pomocą na serwerze ma swego rodzaju synergię umiejętności. To sprawiło, że nie bałam się pisać kodu klienta.
Ponadto, jeśli NAPRAWDĘ nienawidzisz JavaScript, możesz użyć cukru syntaktycznego, takiego jak

CoffeeScript
http://jashkenas.github.com/coffee-script/... Lub cokolwiek innego, co generuje kod JavaScript, na przykład

Google Web Toolkit
http://code.google.com/webtoolkit/
(GWT).


A propos JavaScript, czym jest „zamknięcie”?
- Całkiem fantazyjny sposób powiedzenia, że ​​przechowujesz zmienne o zasięgu leksykalnym w łańcuchach wywołań. ;) Lubię to:
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 po prostu użyć „myData” bez robienia czegoś niezręcznego, na przykład ukrywania go w obiekcie? W przeciwieństwie do Javy zmienna „myData” nie powinna być tylko do odczytu. Ta zaawansowana funkcja języka sprawia, że ​​programowanie asynchroniczne jest znacznie mniej rozwlekłe i mniej bolesne.
Pisanie kodu asynchronicznego zawsze będzie trudniejsze niż pisanie prostego skryptu jednowątkowego, ale w przypadku Node.js nie jest to takie trudne, a oprócz wydajności i skalowalności dla tysięcy równoczesnych połączeń zyskujesz wiele korzyści ...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Myślę, że korzyści są następujące:
  • Tworzenie stron internetowych w dynamicznym języku (JavaScript) na niesamowicie szybkiej maszynie wirtualnej (V8). Jest znacznie szybszy niż Ruby, Python czy Perl.
  • Możliwość obsługi tysięcy jednoczesnych połączeń przy minimalnym koszcie na proces.
  • JavaScript jest idealny do pętli zdarzeń z obiektami funkcji pierwszej klasy i domknięciami. Ludzie już wiedzą, jak z niego korzystać w ten sposób, używając go w przeglądarce do reagowania na zdarzenia inicjowane przez użytkownika.
  • Wielu już zna JavaScript, nawet ci, którzy nie twierdzą, że są programistami. Jest to prawdopodobnie najpopularniejszy język programowania.
  • Używanie JavaScript na serwerze internetowym, a także w przeglądarce zmniejsza niedopasowanie impedancji między dwoma środowiskami programistycznymi, które mogą przekazywać struktury danych za pośrednictwem JSON, które działają tak samo po obu stronach równania. Zduplikowany kod walidacji formularza można udostępniać między serwerem a klientem itp.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

V8
http://en.wikipedia.org/wiki/V ... %2529
jest implementacją funkcji JavaScript. Umożliwia uruchamianie (między innymi) samodzielnych aplikacji JavaScript.
Node.js to po prostu biblioteka napisana dla V8, która obsługuje zdarzenia we/wy. ta koncepcja jest trochę trudniejsza do wyjaśnienia i jestem pewien, że ktoś odpowie lepszym wyjaśnieniem niż ja ... Najważniejsze jest to, że zamiast robić jakieś dane wejściowe lub wyjściowe i czekać, aż to się stanie, po prostu

nie

czekając, aż to się skończy. Na przykład zapytaj o czas ostatniej edycji pliku:
// Pseudo code
stat( 'somefile' )

Może to zająć kilka milisekund, a nawet kilka sekund. Z wydarzeniem

I/O
http://en.wikipedia.org/wiki/Input/output
po prostu uruchamiasz żądanie i zamiast czekać w pobliżu, dołącz wywołanie zwrotne, które uruchamia się 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 pod względem funkcjonalności stylu

Ajax
http://en.wikipedia.org/wiki/A ... %2529
).
Więcej informacji znajdziesz w artykule
Node.js naprawdę uzależnia

http://simonwillison.net/2009/Nov/23/node/
co było moim wprowadzeniem do biblioteki/platformy ... wydało mi się całkiem niezłe.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Node.js
http://nodejs.org/
to narzędzie wiersza poleceń typu open source stworzone dla kodu JavaScript po stronie serwera. Możesz pobrać

tarball
http://en.wikipedia.org/wiki/Tarball, skompiluj i zainstaluj kod źródłowy. Pozwala na uruchamianie programów JavaScript.
Wykonywany jest JavaScript

V8
http://code.google.com/p/v8/, silnik JavaScript opracowany przez Google, który jest używany w przeglądarce

Chrome
http://en.wikipedia.org/wiki/Google_Chrome... 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 operacji równoległych.

Zrozumienie node.js
http://debuggable.com/posts/un ... d56cb
to najlepsze wyjaśnienie działania node.js,

który
http://nodejs.org/
Do tej pory znalazłem.

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

Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

domknięcia to sposób wykonywania kodu w kontekście, w którym został utworzony.
W przypadku współbieżności oznacza to, że można zdefiniować zmienne, a następnie wywołać funkcję nieblokującą

Wejście
http://en.wikipedia.org/wiki/Input/output
-output i wyślij mu anonimową funkcję do wywołania zwrotnego.
Po zakończeniu zadania funkcja zwrotna zostanie wykonana w kontekście zmiennych, którymi jest zamknięcie.
Powodem, dla którego domknięcia są tak świetne do pisania nieblokujących aplikacji we/wy, jest to, że bardzo łatwo jest zarządzać kontekstem funkcji, które działają asynchronicznie.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dwa dobre przykłady dotyczą tego, jak manipulować szablonami i używać w nich stopniowych ulepszeń. Potrzebujesz tylko kilku lekkich fragmentów JavaScript, aby działał idealnie.
Gorąco polecam zajrzeć i przeczytać te artykuły:

Wybierz dowolny język i spróbuj zapamiętać, jak zarządzać szablonami plików HTML i co musisz zrobić, aby zaktualizować jedną nazwę klasy

CSS
http://en.wikipedia.org/wiki/C ... heets
w twojej strukturze

DOM
http://en.wikipedia.org/wiki/Document_Object_Model
(na przykład użytkownik kliknął element menu i chcesz, aby został oznaczony jako „wybrany” i odświeżył zawartość strony).
Dzięki Node.js jest to tak proste, jak zrobienie tego w JavaScript po stronie klienta. Pobierz węzeł DOM i zastosuj do niego klasę CSS. Pobierz swój węzeł DOM i innerHTML zawartość (potrzebujesz do tego dodatkowego JavaScript. Przeczytaj artykuł, aby dowiedzieć się więcej).
Innym dobrym przykładem jest to, że możesz uczynić swoją stronę internetową zgodną, ​​włączoną lub wyłączoną za pomocą tego samego fragmentu kodu. Wyobraź sobie, że masz selektor dat wykonany w JavaScript, który pozwoli Twoim użytkownikom wybrać dowolną datę za pomocą kalendarza. Możesz napisać (lub użyć) ten sam fragment kodu JavaScript, aby działał z JavaScript, włączonym lub wyłączonym.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Istnieje bardzo dobra analogia do fast foodów, która najlepiej wyjaśnia model wydarzeń w Node.js.Zobacz pełny artykuł.
Node.js, gabinety lekarskie i restauracje szybkiej obsługi - zrozumienie programowania wydarzeń

http://code.danyork.com/2011/0 ... ming/
Oto krótkie podsumowanie:

Jeśli restauracja typu fast food postępuje zgodnie z tradycyjnym modelem opartym na wątkach, zamawiasz jedzenie i czekasz w kolejce, aż je otrzymasz. Osoba stojąca za Tobą nie będzie mogła złożyć zamówienia, dopóki zamówienie nie zostanie zakończone. W modelu opartym na wydarzeniach zamawiasz jedzenie, a następnie opuszczasz kolejkę, aby czekać. Każdy inny może wtedy złożyć zamówienie.

Node.js jest sterowany zdarzeniami, ale większość serwerów WWW jest opartych na wątkach. York wyjaśnia, jak działa Node.js:
  • Używasz przeglądarki internetowej do wysyłania żądania „/about.html” na serwerze Serwer WWW Node.js.
  • Serwer Node.js akceptuje Twoje żądanie i wywołuje funkcję get ten plik z dysku.
  • Podczas gdy serwer Node.js oczekuje na odebranie pliku, on obsługuje następne żądanie sieciowe.
  • Gdy plik jest wyewidencjonowywany, jest dostępna funkcja zwrotna jest wstawiany do kolejki serwera Node.js.
  • Serwer Node.js robi to, co by zrobił w tym przypadku wyrenderuj stronę „/about.html” i wyślij ją z powrotem do przeglądarki internetowej ”.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dobrze to

rozumiem
http://nodejs.org/#about
  • Celem Node jest zapewnienie łatwego sposobu do budowy skalowalnych programów sieciowych.
  • Węzeł jest podobny pod względem projektu i efektu do systemów takich jak maszyna zdarzeń Ruby lub skręcony Python.
  • Evented I/O dla javascript V8.
Dla mnie oznacza to, że miałeś rację we wszystkich trzech założeniach. Biblioteka zdecydowanie wygląda obiecująco!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie zapomnij też wspomnieć, że V8 Google jest BARDZO szybki. W rzeczywistości konwertuje kod JavaScript na kod maszynowy ze stałą wydajnością skompilowanego pliku binarnego. Tak więc, wraz ze wszystkimi innymi wspaniałymi rzeczami, jest to NIEZWYKLE szybko.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

P: model programowania jest sterowany zdarzeniami, zwłaszcza w jaki sposób obsługuje

wejście wyjście
http://en.wikipedia.org/wiki/Input/output
.
Dobrze. 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 się martwić o żądanie I/O, gdy tylko otrzyma odpowiedź z systemu plików, w którym to czasie wykona kod wywołania zwrotnego. Można jednak wysyłać synchroniczne żądania we/wy (to znaczy żądania blokujące). Deweloper musi wybrać pomiędzy asynchronicznym (callback) lub synchronicznym (oczekującym).
P: Używa JavaScript, a parser to V8.
tak
P: Można go łatwo wykorzystać do tworzenia równoległych aplikacji serwerowych.
Tak, chociaż będziesz musiał ręcznie kodować całkiem sporo JavaScript. Lepiej byłoby spojrzeć na framework, taki jak

http://www.easynodejs.com/
http://www.easynodejs.com/
- który zawiera pełną dokumentację online i przykładową aplikację.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się