Została wydana wersja Node.js 16.0, platformy do wykonywania aplikacji sieciowych w języku JavaScript. Node.js 16.0 jest przyporządkowany do gałęzi o długoterminowym wsparciu, jednak status ten zostanie nadany dopiero w październiku po stabilizacji. Wsparcie dla Node.js 16.0 będzie prowadzone do kwietnia 2023 roku. Utrzymanie poprzedniej wersji LTS Node.js 14.0 potrwa do kwietnia 2023 roku, a wcześniejszej wersji LTS 12.0 do kwietnia 2022 roku. Utrzymanie gałęzi LTS 10.0 zakończy się za 10 dni.
Zaimplementowano wywołania systemowe waitid (oczekiwanie na zmianę stanu procesu), pinsyscall (do przekazywania informacji o punkcie wejścia execve w celu ochrony przed exploitami ROP), getthrname i setthrname (uzyskiwanie i ustalanie nazwy wątku).
- Silnik V8 został zaktualizowany do wersji 9.0 (w Node.js 15 używano wydania 8.6), co umożliwiło zaimplementowanie w Node.js 16 takich możliwości, jak właściwość „indices” dla wyrażeń regularnych (zawiera tablicę z początkowymi i końcowymi pozycjami grup dopasowań), metoda Atomics.waitAsync (asynchroniczna wersja Atomics.wait), wsparcie dla użycia słowa kluczowego await w modułach na najwyższym poziomie. Przyspieszono wywoływanie funkcji, w sytuacji, gdy liczba przekazanych argumentów nie odpowiada parametrom zdefiniowanym w funkcji.
- Zostało ustabilizowane API Timers Promises, oferujące alternatywny zestaw funkcji do pracy z timerem, które zwracają obiekty Promise, co pozwala na zrezygnowanie z użycia util.promisify(). import { setTimeout } from ‘timers/promises’; async function run() { await setTimeout(5000); console.log(‘Hello, World!’); } run();
- Dodana została eksperymentalna implementacja API Web Crypto, przeznaczona do wykonywania podstawowych operacji kryptograficznych po stronie aplikacji webowych, takich jak manipulacje z kryptograficznymi skrótami, generowanie i weryfikacja podpisów cyfrowych, kodowanie i dekodowanie danych z użyciem różnych metod szyfrowania, generowanie kryptograficznie pewnych liczb losowych. API zawiera również funkcje do generowania kluczy i zarządzania nimi.
- N-API (API do tworzenia rozszerzeń) zostało zaktualizowane do wersji 8.
- Zrealizowano przejście na nową wersję menedżera pakietów NPM 7.10.
- Ustabilizowano implementację klasy AbortController, opartej na Web API AbortController, która umożliwia anulowanie sygnałów w wybranych interfejsach API opartych na Promise.
- Ustabilizowano wsparcie dla trzeciej wersji formatu Source Map, używanego do mapowania wygenerowanych, przetworzonych lub spakowanych modułów z oryginalnym kodem źródłowym.
- Dla kompatybilności z przestarzałymi Web API dodano metody buffer.atob(data) i buffer.btoa(data).
- Rozpoczęła się produkcja wersji dla nowych urządzeń Apple z układem ARM M1.
- Na platformie Linux wymagania dotyczące wersji kompilatora wzrosły do GCC 8.3.
Przypomnijmy, że platforma Node.js może być wykorzystywana zarówno do serwerowego wsparcia Web aplikacji, jak i do tworzenia zwykłych klientów oraz programów sieciowych. Aby rozszerzyć funkcjonalność aplikacji dla Node.js, przygotowano dużą kolekcję modułów, w której można znaleźć moduły z realizacją serwerów klientów HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduły do integracji z różnymi frameworkami webowymi, obsługiwacze WebSocket i Ajax, konektory do baz danych (MySQL, PostgreSQL, SQLite, MongoDB), silniki szablonów, silniki CSS, realizacje algorytmów kryptograficznych oraz systemów autoryzacji (OAuth), parsery XML.
Aby obsłużyć dużą liczbę równoległych zapytań, Node.js wykorzystuje asynchroniczny model uruchamiania kodu oparty na przetwarzaniu zdarzeń w trybie non-blocking oraz definiowaniu callbacków. Wsparcie dla multiplexing połączeń obejmuje takie metody jak epoll, kqueue, /dev/poll i select. Do multiplexing połączeń używana jest biblioteka libuv, która jest dodatkową warstwą nad libev w systemach Unix oraz nad IOCP w Windows. Do tworzenia puli wątków (thread pool) wykorzystana jest biblioteka libeio, a do wykonywania zapytań DNS w trybie non-blocking zintegrowano c-ares. Wszystkie wywołania systemowe, które powodują blokowanie, są realizowane w obrębie puli wątków, a następnie, podobnie jak obsługa sygnałów, przekazują wyniki swojej pracy z powrotem przez niestrunną rynnę (pipe). Wykonanie kodu JavaScript zapewnia stworzony przez firmę Google silnik V8 (dodatkowo Microsoft rozwija wersję Node.js z silnikiem Chakra-Core).
Zasadniczo Node.js przypomina frameworki Perl AnyEvent, Ruby Event Machine, Python Twisted oraz implementację zdarzeń w Tcl, ale pętla zdarzeń (event loop) w Node.js jest ukryta przed deweloperem i przypomina przetwarzanie zdarzeń w aplikacji webowej działającej w przeglądarce. Przy pisaniu aplikacji dla Node.js należy uwzględnić specyfikę programowania opartego na zdarzeniach, na przykład zamiast wykonywać „var result = db.query(„select..”);” z oczekiwaniem na zakończenie pracy i dalszą obróbką wyników, w Node.js stosuje się zasadę asynchronicznego wykonania, tj. kod przekształca się w „db.query(„select..”, function (result) {obróbka wyniku});”, przy czym kontrola natychmiast przechodzi do dalszego kodu, a wynik zapytania jest przetwarzany na bieżąco.
Dodatkowo warto zaznaczyć, że firma Deno, założona przez twórcę Node.js w celu rozwoju platformy nowej generacji Deno, otrzymała 4,9 miliona dolarów inwestycji. Pod względem funkcji Deno przypomina Node.js, ale stara się wyeliminować konceptualne błędy, które wystąpiły w architekturze Node.js, a także zaoferować użytkownikom bardziej bezpieczne środowisko. Podkreśla się, że rozwiązania biznesowe firmy Deno będą oparte na całkowicie otwartych produktach, a model Open Core z wydzieleniem osobnych płatnych funkcji jest postrzegany jako nieakceptowalny dla platformy Deno.
Źródło: opennet.ru
