Opublikowana platforma Node.js 23.0 z wstępnym wsparciem dla języka TypeScript

Wydano Node.js 23.0.0, platformę do uruchamiania aplikacji sieciowych w języku JavaScript. Node.js 23.0 należy do gałęzi pośrednich, której wsparcie będzie trwało przez 7 miesięcy (do czerwca 2025 roku). W najbliższych dniach zakończy się stabilizacja gałęzi Node.js 22, która 29 października uzyska status LTS i będzie wspierana do kwietnia 2027 roku. Wsparcie dla wcześniejszych gałęzi LTS Node.js 20.x i 18.x potrwa do kwietnia 2026 i 2025 roku odpowiednio.

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).

  • Dodano eksperymentalne wsparcie dla języka TypeScript, umożliwiającego jawne definiowanie typów. Wsparcie włącza się za pomocą opcji „—experimental-strip-types” i „—experimental-transform-types”. W przypadku pierwszej opcji praca z TypeScript sprowadza się do usunięcia specyficznych dla tego języka definicji typów (sprawdzanie typów nie jest wykonywane, kod po prostu przekształcany jest w JavaScript bez typów). Druga opcja przekształca niektóre elementy składni TypeScript, takie jak enumeracje (enum) i przestrzenie nazw (namespace), na kod JavaScript.
  • Włączono domyślnie możliwość użycia wywołania „require()” do ładowania modułów JavaScript ESM (ECMAScript Modules) w trybie synchronicznym. Moduły ESM są stosowane w przeglądarkach i zastępują moduły CommonJS, specyficzne dla Node.js. Aby załadować przez „require()” w Node.js, moduł ESM musi być wykonywany w trybie synchronicznym (bez await na najwyższym poziomie).
  • Zautomatyzowano wykrywanie modułów ESM w plikach bez rozszerzenia lub z rozszerzeniem „.js”. Wcześniej takie pliki były interpretowane jako moduły CommonJS, jeśli w umieszczonym w tym samym katalogu pliku package.json wyraźnie nie wskazywano ich typu („type”: „module”). W nowej wersji dla plików, których typ nie został określony w package.json, najpierw próbuje się załadować jako moduł CommonJS, a jeśli to się nie uda, jako moduł ESM.
  • Dodano eksperymentalną implementację zgodnego z przeglądarkami API Web Storage, przeznaczonego do stałego (klasa localStorage) lub tymczasowego (klasa sessionStorage) przechowywania danych w formacie klucz/wartość. Aby włączyć wsparcie dla Web Storage, należy uruchomić z flagą „—experimental-webstorage” i wskazać ścieżkę do pliku z magazynem przez flagę „—localstorage-file”.
  • Dodano eksperymentalne API SQLite do pracy z bazami danych, wykorzystując język zapytań SQL oraz magazyn oparty na bibliotece SQLite. Oprócz przechowywania bazy danych w pliku na dysku, można ją również umieścić w pamięci, wskazując zamiast nazwy pliku ":memory:". Wspomniane wcześniej API Web Storage również zostało zaimplementowane na bazie SQLite, co spowodowało dodanie SQLite do grona zależności dla Node.js.
  • Ogłoszono stabilną wersję zespołu „node --run”, przeznaczonego do uruchamiania skryptów określonych w pliku package.json.
  • Wprowadzono opcjonalne wsparcie dla pamięci podręcznej skompilowanego kodu na dysku, co znacznie przyspiesza uruchamianie modułów. Włączenie pamięci podręcznej realizowane jest poprzez zmienną środowiskową NODE_COMPILE_CACHE. Jej funkcjonalność przypomina pakiet v8-compile-cache, jednak różni się wyższą wydajnością i wsparciem dla modułów ESM.
  • Przeprowadzono optymalizację obiektu Buffer, która znacznie zwiększyła wydajność metod Buffer.copy() oraz Buffer.write().
  • Poprawiono wydajność modułu node:fs, w którym także zredukowano liczbę wywołań kodu w C++ w trakcie działania.
  • Silnik V8 zaktualizowano do wersji 12.9, używanej w Chromium 129.
  • Usunięto wsparcie dla 32-bitowych systemów operacyjnych Windows.
  • W wyniku wprowadzenia w Node.js i silniku V8 funkcjonalności zdefiniowanej w standardzie C++20, wzrosły wymagania dotyczące wersji kompilatora GCC. Aby zbudować Node.js, teraz wymagana jest przynajmniej wersja GCC 12.

Platforma Node.js może być wykorzystana zarówno do serwerowego wsparcia prac Web-aplikacji, jak i do tworzenia zwykłych klientskich oraz serwerowych programów sieciowych. Dla rozszerzenia funkcjonalności aplikacji do 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 żądań, Node.js wykorzystuje asynchroniczny model uruchamiania kodu, oparty na przetwarzaniu zdarzeń w trybie nieblokującym oraz definiowaniu callbacków. W ramach mnożenia połączeń wspierane są takie metody jak epoll, kqueue, /dev/poll i select. Do mnożenia połączeń używana jest biblioteka libuv, która jest nakładką na libev w systemach Unix oraz na IOCP w Windows. Do tworzenia puli wątków wykorzystana jest biblioteka libeio, a do wykonywania zapytań DNS w trybie nieblokującym zintegrowano c-ares. Wszystkie wywołania systemowe, które powodują blokowanie, są wykonywane wewnątrz puli wątków, a następnie, tak jak obsługa sygnałów, przekazują wyniki swojej pracy z powrotem przez bezimienny kanał (pipe).

Wykonanie kodu JavaScript zapewniane jest poprzez wykorzystanie silnika V8 opracowanego przez firmę Google (dodatkowo Microsoft rozwija wariant Node.js z silnikiem Chakra-Core). Zasadniczo Node.js przypomina frameworki Perl AnyEvent, Ruby Event Machine, Python Twisted oraz implementację zdarzeń w Tcl, jednak pętla przetwarzania zdarzeń (event loop) w Node.js jest ukryta przed programistą i przypomina przetwarzanie zdarzeń w aplikacji webowej działającej w przeglądarce.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster