Co nowego w Node.js v20 (Test Runner, model uprawnień, SEA, V8 JS Engine 11.3)

Opublikowany: 2023-04-28

Node.js v20 jest już dostępny! 18 kwietnia 2023 roku został upubliczniony i teraz może z niego korzystać każdy. W tej wersji Node.js powinien być znacznie bezpieczniejszy i działać lepiej.

Warto wiedzieć — ponieważ jest to wydanie parzyste, w październiku 2023 r. stanie się wersją długoterminowego wsparcia (LTS) i będzie obsługiwane do kwietnia 2026 r. Jednak zespół Node.js aktywnie poszukuje społeczności informacje zwrotne, aby zidentyfikować i naprawić wszelkie problemy, zanim zostanie awansowany do LTS.

Ta nowa wersja Node.js zawiera ekscytujące aktualizacje i funkcje, które programiści z pewnością docenią, takie jak eksperymentalny model uprawnień, synchroniczny import.meta.resolve , stabilny program uruchamiający testy, aktualizuje silnik JavaScript V8 do wersji 11.3, wprowadzając ulepszenia wydajności i błędy poprawki i wiele więcej.

W tym artykule poznasz zmiany wprowadzone w Node.js v20, zapewniając dogłębne spojrzenie na jego nowe funkcje i możliwości.

Pierwsze kroki z Node.js v20

Instalacja Node.js v20 jest dość podobna do innych wersji Node.js. Wszystko, co musisz zrobić, to:

  1. Pobierz pakiet instalacyjny z oficjalnej strony Node.js.
  2. Po pobraniu instalatora uruchom go i postępuj zgodnie z instrukcjami, aby zakończyć proces instalacji. Ten proces jest dość prosty i wystarczy zaakceptować umowę licencyjną i kliknąć przycisk „Dalej”.
  3. Uruchom ponownie system/maszynę po zakończeniu procesu instalacji, aby mieć pewność, że wszystkie zmiany zostaną zastosowane.
  4. Sprawdź instalację Node.js, uruchamiając następujące polecenie:
 node -v
Sprawdź instalację Node.js v20
Instalacja Node.js v20

Jeśli widzisz numer wersji (v20.0.0), oznacza to, że Node.js jest poprawnie zainstalowany i możesz rozpocząć pracę z Node.js v20.

Przybył Node.js v20! Sprawdź model uprawnień, synchroniczny import.meta.resolve, stabilny program uruchamiający testy oraz więcej ekscytujących funkcji i aktualizacji tutaj ️ Kliknij, aby zatweetować

Co nowego w Node.js v20?

Przyjrzyjmy się 5 głównym aktualizacjom wprowadzonym w tej wersji Node.js. Funkcje te obejmują:

Eksperymentalny model uprawnień

Wprowadzenie eksperymentalnego Permission Model w Node.js v20 jest znaczącym dodatkiem, który daje programistom większą kontrolę nad dostępem do określonych zasobów podczas wykonywania.

Ta nowa funkcja jest korzystna, gdy bezpieczeństwo i wykorzystanie zasobów mają krytyczne znaczenie, na przykład w środowisku produkcyjnym.

Model uprawnień ma kilka możliwości, w tym ograniczanie dostępu do systemu plików, procesów potomnych, wątków roboczych i natywnych dodatków.

Deweloperzy mogą używać flag, takich jak --allow-fs-read , --allow-fs-write i --allow-child-process , aby określić, które zasoby są dostępne. Aby aktywować te flagi, programiści muszą użyć flagi --experimental-permission w połączeniu z wymaganymi uprawnieniami.

Oto przykład użycia modelu uprawnień w celu umożliwienia dostępu do odczytu i zapisu do całego systemu plików:

 $ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

Deweloperzy mogą również używać modelu uprawnień do określania dostępu do określonych folderów i plików. Na przykład następujące polecenie umożliwia dostęp do zapisu w folderze /tmp/ :

 $ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

Istotną zaletą modelu uprawnień jest możliwość sprawowania bardziej szczegółowej kontroli nad dostępem do systemu plików. Na przykład programiści mogą określić ścieżki i wzorce symboli wieloznacznych, aby umożliwić dostęp do określonych folderów lub plików.

 $ node --experimental-permission --allow-fs-read=/home/user/* index.js

Powyższe polecenie zapewnia dostęp do odczytu do wszystkich folderów w katalogu /home/user/ .

Właściwośćpermission obiektu procesu może również służyć do sprawdzania, czy określone uprawnienie zostało przyznane w czasie wykonywania. Na przykład, jeśli chcesz sprawdzić, czy Twój proces Node.js ma dostęp do odczytu do określonego folderu /home/user/documents , możesz użyć następującego kodu:

 if (process.permission.has('fs.read', '/home/user/documents')) { console.log('Read access granted to /home/user/documents'); } else { console.log('Read access not granted to /home/user/documents'); }

Korzystając z modelu uprawnień, masz dokładniejszą kontrolę nad dostępem procesów Node.js do systemu plików, co może prowadzić do lepszego bezpieczeństwa i wydajniejszego wykorzystania zasobów.

Należy zauważyć, że model uprawnień jest nadal eksperymentalny i może ulec zmianie w przyszłych wydaniach Node.js. Zaleca się, aby być na bieżąco z dokumentacją modelu uprawnień i zachować ostrożność podczas korzystania z tych funkcji eksperymentalnych.

Stabilny Test Runner

Node.js v20 zawiera stabilną wersję modułu test_runner, który umożliwia programistom szybkie i łatwe tworzenie i uruchamianie zestawów testów JavaScript bez instalowania dodatkowych zależności.

Stabilny program do uruchamiania testów zawiera teraz kilka bloków konstrukcyjnych, takich jak describe , it / test i hooki do tworzenia i strukturyzacji plików testowych, wraz z mockowaniem, trybem oglądania i możliwością równoległego uruchamiania wielu plików testowych za pomocą node --test polecenie node --test .

Oto przykład użycia narzędzia test runner:

 import { test, mock } from 'node:test'; import assert from 'node:assert'; import fs from 'node:fs'; mock.method(fs, 'readFile', async () => "Hello World"); test('synchronous passing test', async (t) => { // This test passes because it does not throw an exception. assert.strictEqual(await fs.readFile('a.txt'), "Hello World"); });

Program uruchamiający testy oferuje konfigurowalne i niestandardowe raporty testów za pomocą flagi --test-reporter , pokrycie testów eksperymentalnych za pomocą flagi --experimental-test-coverage i możliwości kpiny.

Chociaż nie ma na celu zastąpienia w pełni funkcjonalnych środowisk testowych, takich jak Jest lub Mocha, stabilny program do uruchamiania testów oferuje prosty i szybki sposób tworzenia zestawów testów. Został znacznie ulepszony od czasu jego wprowadzenia w Node.js v19, a dzięki testom i opiniom użytkowników końcowych został teraz oznaczony jako stabilny w Node.js v20.

Więcej informacji można znaleźć w tym połączonym żądaniu ściągnięcia.

Silnik JavaScript V8 zaktualizowany do wersji 11.3

Silnik JavaScript V8, który napędza Node.js, został zaktualizowany do wersji 11.3 w Node.js v20. Zapewnia to lepszą wydajność i wprowadza nowe funkcje językowe. Niektóre z nowych funkcji, które zawiera ta aktualizacja:

  • String.prototype.isWellFormed i toWellFormed : Te metody są szczególnie przydatne do zapewnienia prawidłowego formatu ciągu znaków. Pomaga to zapewnić, że ciąg znaków wprowadzanych przez użytkownika jest w prawidłowym formacie UTF-16, zmniejszając liczbę błędów w epoce emotikonów.
  • Metody, które zmieniają Array i TypedArray przez kopiowanie: Może to być przydatne do tworzenia zmodyfikowanych kopii tablic bez wpływu na oryginalne dane, co jest szczególnie istotne w przypadkach, gdy trzeba zachować oryginalne dane do porównania lub do innych celów.
  • Resizable ArrayBuffer i rosnący SharedArrayBuffer : zapewnia większą elastyczność, pozwalając na wydajniejszą alokację pamięci.
  • Flaga RegExp v z ustawioną notacją i właściwościami łańcuchów: dodaje funkcjonalność dla wyrażeń regularnych.
  • WebAssembly tail call: umożliwia optymalizację niektórych typów wywołań funkcji.

Te aktualizacje pokazują ciągłe zaangażowanie społeczności programistów Node.js w poprawę wydajności i funkcjonalności.

Synchroniczny import.meta.resolve()

W Node.js v20 wprowadzono import.meta.resolve() , która ułatwia pisanie skryptów, które nie są zależne od lokalizacji. Ta funkcja zwraca synchronicznie, podobnie jak zachowanie przeglądarki, co pozwala na bardziej efektywne wykonanie.

Przechwycenia modułu ładującego użytkownika nadal mogą być definiowane jako funkcje asynchroniczne, ale import.meta.resolve() będzie nadal zwracana synchronicznie dla kodu aplikacji, nawet jeśli załadowane są przechwyty rozstrzygania asynchronicznego.

Synchroniczne zachowanie metody import.meta.resolve() pozwala na wydajniejsze wykonywanie kodu, zwłaszcza w przypadku dużych ilości danych. Jako autor możesz zdefiniować hooki rozwiązywania jako funkcje asynchroniczne lub synchronizujące, w zależności od preferencji. Kod aplikacji będzie nadal wykonywany synchronicznie, niezależnie od tego, czy załadowano asynchroniczne punkty zaczepienia.

Eksperymentalne pojedyncze aplikacje wykonywalne (SEA)

Experimental Single Executable Applications (SEA) to nowa funkcja wprowadzona w Node.js v20, która umożliwia łączenie aplikacji z plikiem binarnym Node.js, umożliwiając użytkownikom końcowym dystrybucję i uruchamianie jej jako pojedynczego pliku wykonywalnego.

Społeczność prosiła o to od dawna, a zespół udoskonalił to podejście w ciągu ostatniego roku.

W Node.js v20 zbudowanie pojedynczej aplikacji wykonywalnej wymaga wstrzyknięcia obiektu blob przygotowanego przez Node.js z konfiguracji JSON zamiast wstrzyknięcia surowego pliku JS.

Blob to plik zawierający dane binarne, w tym przypadku przygotowane przez Node.js, i jest on wstrzykiwany do pliku binarnego. Ta zmiana została wprowadzona, aby umożliwić osadzenie wielu współistniejących zasobów w SEA, co otwiera nowe przypadki użycia.

Oto przykład pliku sea-config.jso n:

 { "main": "myscript.js", "output": "sea-prep.blob" }

W przypadku wykonania za pomocą polecenia node --experimental-sea-config sea-config.json obiekt blob jest zapisywany w pliku sea-prep.blob , który można następnie wstrzyknąć do pliku binarnego.

Funkcja SEA umożliwia programistom dystrybucję aplikacji Node.js bez konieczności instalowania Node.js przez użytkowników. Funkcjonalność została stworzona przez Darshana Sen, który zdobył nagrodę za wybitny wkład od New Arrival w ramach JavaScriptLandia Awards na OpenJS World.

Firma Microsoft, członek OpenJS Foundation, bada tę funkcję jako sposób na ograniczenie ataków wektorowych i wzmocnienie architektury Node.js w celu uzyskania lepszych doświadczeń. Chociaż funkcja SEA jest nadal eksperymentalna, stanowi ekscytujące nowe rozwiązanie dla społeczności Node.js.

Wydajność

Node.js v20 zawiera znaczne ulepszenia środowiska wykonawczego, z odnowionym skupieniem się na wydajności przez nowo utworzony zespół ds. wydajności Node.js. Ulepszenia obejmują optymalizacje podstawowych części środowiska wykonawczego, takich jak URL, fetch() i EventTarget .

Jedną z godnych uwagi ulepszeń jest zmniejszenie kosztu inicjalizacji EventTarget , który został zmniejszony o połowę, co skutkuje szybszym dostępem do wszystkich podsystemów korzystających z niego. Ponadto wywołania V8 Fast API zostały wykorzystane do zwiększenia wydajności w interfejsach API, takich jak URL.canParse() i liczniki czasu.

Kolejną konkretną zmianą jest włączenie zaktualizowanej wersji 2.0 Ady, szybkiego i zgodnego ze specyfikacją parsera adresów URL, napisanego w C++.

Czy wiesz, że Node.js v20 zapewnia stabilny, natywny program do uruchamiania testów? Czas na wydajniejsze testowanie kodu! Sprawdź to ️ Kliknij, aby tweetować

Streszczenie

W tym artykule poznałeś niektóre z głównych funkcji (eksperymentalnych i stabilnych) oraz ulepszeń wprowadzanych przez Node.js v20, takich jak ulepszenia silnika JavaScript V8, wydajności, mechanizmu uruchamiania testów i wprowadzenia eksperymentalnego modelu uprawnień oraz pojedynczych aplikacji wykonawczych .

Ważne jest, aby wiedzieć, że Node.js v14 zostanie wycofany z eksploatacji w kwietniu 2023 r., dlatego zaleca się rozpoczęcie planowania aktualizacji do Node.js v18 (LTS) lub vNode.js 20 (wkrótce LTS).

Czy chcesz wypróbować najnowszą wersję Node.js? Możesz to zrobić, wdrażając aplikację Node.js na Kinsta i otrzymaj od nas swoje pierwsze 20 USD. Obsługujemy już Node.js v20, co oznacza, że ​​od dzisiaj możesz testować jego nowe funkcje i możliwości.

Teraz twoja kolej! Jakie funkcje lub ulepszenia najbardziej interesują Cię w Node.js v20? Czy są jakieś istotne, które mogliśmy przeoczyć? Daj nam znać w komentarzach.