Node.js

Node.js to środowisko uruchomieniowe czyli pewnego rodzaju platforma, która umożliwia uruchomić kod JavaScript. Działa po stronie serwera na licencji open-source i warto dodać, że za jego pomocą można uruchomić kod bezpośrednio na komputerze, bez wykorzystywania przeglądarki. Node.js nie jest sam w sobie serwerem jednak pozwala na stworzenie własnego serwera HTTP ale też innych usług sieciowych.

Główne funkcje tego środowiska to przede wszystkim jego asynchroniczność oraz sterowanie zdarzeniami. Wiąże się to z tym, że wywoływanie funkcji API nie musi czekać na wyniki dzięki czemu blok wykonawczy nie jest blokowany. Natomiast po wywołaniu funkcja zwrotna zostaje uruchomiona lub zdarzenie zostaje ogłoszone w konkretnych częściach wykonawczych. Mimo że środowisko to działa tylko na jednym wątku z pętlą zdarzeń, jest w stanie obsłużyć więcej zapytań niż przykładowo serwer HTTP Apache. To wszystko dzieje się za sprawą asynchronicznej obsługi wywołań kodu dzięki, której nie dochodzi do blokowania wątku. Oprócz tego Node.js opiera się na silniku JavaScript V8, który charakteryzuje się wyjątkowo szybkim wykonywanie kodu JavaScript. Silnik taki wykorzystywany jest między innymi w znanej przeglądarce Google Chrome. Dodatkowo Node.js cechuje wysoka skalowalność. Oznacza to, że dzięki mechanizmowi zdarzeń, Node.js może być z łatwością skalowalny. Jest to ważne dla programistów gdyż mogą w dowolny sposób rozbudować to środowisko tak by działało z jak największą wydajnością. Również dużym plusem dla programistów jest to, że Node.js posiada dość rozbudowaną dokumentację składającą się między innymi z mnóstwa tutoriali czy przykładowych projektów.

Architektura Node.js wyróżnia trzy główne cechy. Pierwszą z nich jest jednowątkowość tego środowiska. Czyli podstawą jego działania jest działanie na jednym wątku. Być może dla niektórych programistów nie jest to do końca dobre jednak warto wziąć to pod uwagę ze względu na to, że pozwoli nam to uniknąć niepotrzebnego przełączania pomiędzy kontekstami procesora. Kolejną cechą tej architektury jest jej pętla zdarzeń. W tym przypadku zapętlanie zdarzeń opiera się na bibliotece ‘libuv’. Odpowiada ona za tak zwane kolejkowanie i asynchroniczne powtarzanie. Zatem pętla obsługuje pewną kolejkę zdarzeń, która zawiera ich listę włącznie z wywołaniami. Trzecią cechą jest jej nie blokujące ‘wejście’ / ‘wyjście’. Mówi to nam o tym że pętla zdarzeń działa na pojedynczym wątku natomiast każde długoterminowe zadania są za każdym razem wykonywane w sposób asynchroniczny jako wątki robocze. Wówczas przekazują one wyniki za pomocą funkcji zwrotnej do pętli zdarzeń. W ten sposób powstaje nam w zupełności asynchroniczny i jednocześnie nieblokujący pracy motyw na wykonywanie kodu.

Node.js często wykorzystywane jest przy strumieniowych danych. Dzięki swoim funkcjom środowisko to jest idealne podczas obsługiwania transmisji strumieniowej w czasie rzeczywistym. Czyli przykładowo do przesyłania danych czy plików z wielu źródeł lub mediów. Może także okazać się świetnym narzędziem do pracy jako serwer API dzięki umiejętności obsługiwania wielu połączeń naraz. Dodatkowo Node.js może posłużyć programistom także do działania jako serwer mikroserwisów. Dzięki swojej szybkości i lekkości często stosowany jest do pisania pomiędzy innymi bramkami API.

Ciekawostką jest, że Node.js podbiło już serca wielkich firm. Między innymi ich funkcjonalności wykorzystuje wszystkim znany Pay Pal, Linkedin czy też Netflix.

Przykładowy kod w Node.js

Node.js Przykład #1

  var http = require("http"),
  url = require("url");
  
  http.createServer(function (request, response) {
    request.on('end', function () {
      var _get = url.parse(request.url, true).query;
      response.writeHead(200, {
        'Content-Type': 'text/plain'
      });
      response.end('Your data: ' + _get['data']);
    });
  }).listen(8080);
  
Node.js Przykład #2

  var express = require('express');
  var app = express();
  
  app.get('/hello', function (req, res) {
    res.send('Hello!')
  });
  
  app.listen(2000, function () {
    console.log('App listening on port 2000!')
  });