Strona główna / Artykuły

Cechy Node.js 26, które po cichu zastępują lata rozwiązań tymczasowych

Funkcje Node.js 26, które eliminują stare rozwiązania workaround: API Temporal do obsługi dat, natywna obsługa TypeScript, wbudowane narzędzia do zarządzania pamięcią cache oraz kilka mniejszych ulepszeń.

Wydawca: REACTAPP.TOP8 min czytania1739 słów

Źródła: You’re Still Writing Node.js Like It’s 2020

1. W końcu możemy przestać udawać, że Date to prawdziwa API do dat

Oto zwykły JavaScript:

const date = new Date("2026-09-08");
console.log(date);

A teraz spróbuj odpowiedzieć na nieco trudniejsze pytanie:

Jaka jest lokalna data spotkania odbywającego się w Nowym Jorku?

Lub:

Dodaj trzy miesiące do tej daty fakturowania.

Lub:

Jaka jest właściwie różnica między datą kalendarzową a dokładnym momentem w czasie?

Wtedy właśnie Date zaczyna zawodzić.

Dlatego Temporal jest tak ważne.

Node.js 26 włącza API Temporal jako standard, dostarczając JavaScriptowi odrębne koncepcje dla instantów, dat kalendarzowych, okresów czasu i stref czasowych.

Zamiast pisać:

const date = new Date();

możesz teraz pisać:

const today = Temporal.Now.plainDateISO();

const invoiceDate =
  Temporal.PlainDate.from("2026-09-08");
const dueDate =
  invoiceDate.add({ days: 30 });

A gdy naprawdę potrzebujesz dokładnego momentu w czasie, a nie daty kalendarzowej:

const now = Temporal.Now.instant();

To rozróżnienie ma większe znaczenie, niż się wydaje.

System rozliczeniowy tak naprawdę nie potrzebuje „obiektu Date w JavaScript”.

Potrzebuje Data kalendarzowej.

Rozproszony rejestr zdarzeń nie potrzebuje „Data kalendarzowej”.

Potrzebuje momentu w czasie.

Struktura temporalna zmusza do jasnego określenia, co dokładnie mamy na myśli.

Dla wszystkiego, co dotyczy płatności, subskrypcji, rezerwacji, rynków lub użytkowników rozproszonych w różnych strefach czasowych, nie jest to tylko ładniejsza składnia.

Zapobiega to całej kategorii błędów, w których reprezentuje się niewłaściwy rodzaj wartości czasowej.

2. Twój plik .ts niekoniecznie wymaga kroku budowania

Przez lata uruchamianie TypeScript w Node oznaczało taki proces:

app.ts
   ↓
TypeScript
   ↓
app.js
   ↓
Node

Ten sposób pracy jest nadal w pełni ważny.

Ale Node może teraz bezpośrednio uruchamiać pliki TypeScript, pod warunkiem że używają one jedynie składni do usuwania informacji.

Weźmy ten plik:

interface User {
  id: number;
  name: string;
}

function greet(user: User) {
  return `Hello ${user.name}`;
}
console.log(
  greet({
    id: 1,
    name: "Priyanshu"
  })
);

Można go uruchomić bezpośrednio za pomocą:

node app.ts

Node po prostu usuwa adnotacje typowe i uruchamia pozostały zwykły JavaScript.

Warto powtórzyć jedną ważną kwestię: Node nie sprawdza dla ciebie typów.

Dlatego w dużych bazach kodu produkcyjnego nadal będziesz potrzebował narzędzia tsc lub równoważnego kroku sprawdzania typów w swoim procesie pracy.

Pomyśl jednak o mniejszych przypadkach: wewnętrznym skrypcie, szybkim narzędziu CLI czy jednoplikowym programie pomocniczym.

Stary sposób wyglądał tak:

script.ts
   ↓
configure compiler
   ↓
compile
   ↓
run

Teraz może wyglądać tak:

script.ts
   ↓
node

To niewielka zmiana.

Jest to jednak kolejny przykład na to, jak Node cicho usuwa warstwę, której wiele projektów tak naprawdę nigdy nie potrzebowało.

3. Twój kod cache wygląda na niepotrzebnie skomplikowany

Prawie na pewno pisałeś ten wzorzec więcej razy, niż możesz zliczyć:

let user = cache.get(userId);

if (user === undefined) {
  user = await fetchUser(userId);
  cache.set(userId, user);
}

W tym kodzie nie ma nic złego.

Jednak rzeczywisty zamiar zostaje pogrzebany pod mechanizmami sprawdzania, pobierania i przechowywania.

To, co naprawdę chcesz powiedzieć, to:

Daj mi tę wartość. Jeśli jeszcze jej nie ma, stwórz ją.

Współczesny JavaScript pozwala już mówić dokładnie to.

V8 14.6, który jest częścią Node.js 26, dodaje:

Map.prototype.getOrInsert()
Map.prototype.getOrInsertComputed()

Dzięki nim synchroniczne wyszukiwanie w cache można uprościć do czegoś w rodzaju:

const value = cache.getOrInsert(
  key,
  createValue()
);

A gdy wartość powinna być obliczana tylko w razie potrzeby, opóźnionie:

const value = cache.getOrInsertComputed(
  key,
  () => createValue()
);

Żadna z tych funkcji sama w sobie nie jest przełomowa.

Ale projektowanie języków rzadko rozwija się dzięki przełomowym funkcjom.

Rozwija się wtedy, gdy wystarczająco wielu programistów pisze te same pięć linijek raz po raz, aż język w końcu odpowie:

">Dobrze. Już nie musisz pisać tych pięciu linijek."

To właśnie ten rodzaj ulepszenia, które cicho wtapia się w codzienny kod.

Za rok prawie nikt o tym nie będzie mówił.

Będą go po prostu używać bez zastanowienia.

4. Node.js może teraz dotrzeć poza JavaScript

Następna ta możliwość ma znacznie większe znaczenie.

Node.js 26 wprowadza eksperymentalną Interfejs Funkcji Obcych:

node:ffi

FFI umożliwia JavaScriptowi wywoływanie funkcji dostępnych bezpośrednio przez biblioteki natywne.

Oto ogólny zarys tego rozwiązania:

JavaScript
     ↓
node:ffi
     ↓
Native library
     ↓
C / C++ / system APIs

Załóżmy bibliotekę natywną, która udostępnia coś w rodzaju:

double calculate(double value);

JavaScript może teraz, przynajmniej teoretycznie, załadować tę bibliotekę i bezpośrednio wywołać funkcję.

To otwiera drogę do takich możliwości jak:

  • specializowane obliczenia liczbowe
  • ponowne wykorzystanie istniejących bibliotek natywnych
  • głębsza integracja z systemem
  • kryptografia na poziomie natywnym
  • przetwarzanie obrazów i wideo

Jest jednak poważna zastrzeżenie.

Przekraczasz granicę oddzielającą zarządzany JavaScript od surowej pamięci natywnej.

Jesli błędnie określisz sygnaturę funkcji, nie otrzymasz uprzejmego wyjątku JavaScript w odpowiedzi.

Możesz spowodować upadek całego procesu.

Dlatego właśnie ta API pozostaje eksperymentalna i jest dostępna tylko przy włączonej flagi.

Zatem nie traktuj tego jako:

"Czas przepisać każdy pakiet npm w języku C."

Lepiej odczytać to jako:

"Node teraz oferuje znacznie prostszy sposób wejścia w środowisko natywne."

To są dwa zupełnie różne stwierdzenia.

5. Twoja Node CLI może nie wymagać zainstalowanego Node

Oto kolejne założenie, które warto zakwestionować:

Jeśli tworzysz narzędzie za pomocą Node, twoi użytkownicy również muszą mieć zainstalowany Node.

Aplikacje jednoznaczne sprzeciwiają się temu założeniu.

Narzędzia SEA od Node pozwalają zapakować aplikację jako samodzielny plik binarny.

Zamiast więc wysyłać:

npm install
node index.js

można wysłać coś bardziej zbliżonego do:

./my-cli

Rozważmy wewnętrzne narzędzie, od którego codziennie korzysta twoz zespół.

Może to być CLI do wdrażania:

deploy production

lub pomocnik do bazy danych:

db-migrate

lub narzędzie do tworzenia szkieletu projektu:

project init

Jeśli udostępniasz pojedynczy plik wykonywalny, użytkownicy nie muszą wiedzieć ani się przejmować tym, że w tle działa JavaScript.

To subtelnie zmienia wizerunek Node’a.

Node zaczął swoją drogę jako:

JavaScript działający poza przeglądarką.

Zaczyna przypominać raczej:

Środowisko uruchomieniowe do zadań ogólnego przeznaczenia, które akurat obsługuje JavaScript.

To znacznie szersze stwierdzenie.

6. A co, jeśli twoja aplikacja już nie potrzebuje wszystkich swoich uprawnień?

Modele bezpieczeństwa zazwyczaj podążają za tym wzorcem:

Application
     ↓
Gets permissions
     ↓
Keeps permissions
     ↓
Runs

Ale co, jeśli uprawnienie jest potrzebne tylko przez krótki czas, podczas uruchamiania?

Weźmy na przykład usługę, która podczas inicjalizacji czyta plik konfiguracyjny oraz niektóre certyfikaty.

Gdy już będzie działał, może w ogóle nie potrzebować dostępu do systemu plików.

Model uprawnień w Node zmierza w kierunku umożliwienia aplikacjom aktywnego ograniczania swoich możliwości podczas działania, za pomocą takich API jak permission.drop().

Przepływ wygląda mniej więcej tak:

Start
  ↓
Read configuration
  ↓
Initialize
  ↓
Drop unnecessary permissions
  ↓
Run

To odzwierciedla przydatną zasadę bezpieczeństwa:

Nie pytaj tylko o to, co twoja aplikacja ma prawo robić. Zapytaj, jakie uprawnienia faktycznie będzie potrzebować w przyszłości.

Zmiana interfejsu API jest niewielka.

Zmiana sposobu myślenia o bezpieczeństwie aplikacji już tak nie jest.

7. Node.js w końcu jest gotowy na usuwanie elementów

Dodawanie API to łatwy sposób na sprawienie, by środowisko wykonawcze wyglądało imponująco.

Ich usuwanie to trudniejsza część.

Node.js 26 nadal usuwa stare API oraz przestarzałe elementy wewnętrzne, które istniały od lat.

To ma większe znaczenie, niż mogłoby się wydawać.

Każda stara API prędzej czy później staje się nieuniknioną zależnością kogoś.

Jeśli nie zostanie sprawdzona, środowisko wykonawcze musi nosić ze sobą dziesięciolecia nagromadzonego „bagażu historycznego”:

old API
   +
new API
   +
replacement API
   +
deprecated API
   +
"don't use this anymore" API

Zrośnięta platforma wymaga chęci usunięcia tego nagromadzenia.

Node.js coraz częściej pokazuje właśnie taką chęć.

To dobra wiadomość, jeśli wolisz nie zapamiętywać każdej starszej metody wykonywania tej samej czynności.

Ciekawą częścią nie jest żadna pojedyncza funkcja

Temporal sam w sobie nie jest imponujący.

Również getOrInsert() nie jest imponujący.

Również uruchamianie pliku .ts bez kroku kompilacji nie jest imponujące.

Również pakowanie interfejsu CLI jako pliku wykonywalnego nie jest imponujące.

Ale umieść je obok siebie.

Node jednocześnie wznosi się w górę pod względem abstrakcji:

Temporal
Better collections
TypeScript
Modern JavaScript

a jednocześnie schodzi w dół:

FFI
Native libraries
Permissions
Executable packaging

To jest właściwa historia w tym przypadku.

Node.js nie tylko staje się lepszy w wykonywaniu JavaScriptu.

Staje się również lepszym środowiskiem wykonawczym dla wszystkiego, co otacza naszą aplikację.

To zmienia pytanie, które warto zadać na początku nowego projektu.

Zamiast od razu pytać:

"Który pakiet npm jest mi do tego potrzebny?"

coraz bardziej warto najpierw zapytać:

">Czy Node.js już potrafi to zrobić?"

Czasami uczciwa odpowiedź nadal brzmi „nie”.

Ale coraz częściej odpowiedź okazuje się być:

">Właściwie... tak."

To jest chyba najbardziej uderzająca cecha Node.js 26.

Środowisko wykonawcze już posunęło się do przodu.

Nasze modele myślowe po prostu jeszcze nie nadrobiły tej różnicy.

Literatura pokrewna

  • Powszechne potknięcia w JavaScript i TypeScript, które cicho niszczą kod — Wyjaśnia subtelne pułapki w JavaScript i TypeScript – od porównań z NaN po kwestie związane z asynchronicznym działaniem i przymusową konwersją typów – które powodują błędy mimo pozornie poprawnego kodu.
  • Pomocnik poleceniami Node.js dla rozwoju lokalnego i serwerów produkcyjnych — Łatwy do przeglądania przewodnik poleceniami obejmujący zarządzanie wersjami Node.js, menedżery pakietów, konfigurację środowiska, debugowanie, PM2 oraz wdrażanie aplikacji na Linuxie bez przerwy w działaniu.