Node.js 26 ieslēdz Temporal — jauno JavaScript datuma un laika API — pēc noklusējuma, bez nekādiem eksperimentālajiem karodziņiem. Versija iznāca 7. jūlijā, un pirmo reizi kods ar Temporal.Now.plainDateISO() strādā tīrā Node instalācijā uzreiz pēc lejupielādes.
Tas atrisina problēmu, ar ko JavaScript izstrādātāji dzīvo kopš valodas pirmsākumiem. Iebūvētais Date objekts ir pārmantots no 1995. gada Java, tas maina savu stāvokli uz vietas, mēnešus skaita no nulles un laika joslas apstrādā tikai caur pārlūka lokāli. Gandrīz katrs nopietns projekts to apietu ar bibliotēku — sākumā Moment.js, vēlāk date-fns vai Luxon. Temporal to visu ieceļ pašā valodā.
Kā izskatās vecās kļūmes? new Date(2026, 6, 15) dod 15. jūliju, nevis jūniju, jo mēneši sākas no nulles. Izsaucot date.setMonth(11), tiek izmainīts pats objekts, tāpēc datums klusi mainās arī visur citur, kur uz to ir norāde. Un divi kolēģi, kuriem serveros ir dažādas laika joslas, no viena un tā paša Date var izlasīt divus dažādus datumus. Temporal katru no šīm kļūmēm noņem jau pēc uzbūves.
Ko Temporal dara citādi
Temporal objekti ir nemaināmi. Kad pieskaiti dienu PlainDate objektam, atpakaļ saņem jaunu objektu, nevis izmaini veco. Tas nozīmē, ka datumu vairs nevar netīši sabojāt, nododot to funkcijai, kas to modificē.
API sadala jēdzienus, ko Date sablīvēja vienā tipā. Temporal.PlainDate ir datums bez laika un laika joslas — piemēram, dzimšanas diena. Temporal.PlainTime ir laiks bez datuma. Temporal.ZonedDateTime nes līdzi konkrētu laika joslu, tāpēc “2026-03-29 tikšanās Rīgā” paliek pareiza pat tad, kad pienāk vasaras laiks. Ilgumus apstrādā atsevišķs Temporal.Duration tips, un aritmētiku raksta tieši:
const rit = Temporal.Now.plainDateISO().add({ days: 1 });
const tiksanas = Temporal.ZonedDateTime.from("2026-03-29T10:00[Europe/Riga]");
Temporal darbojas ar nanosekunžu precizitāti un saprot arī citus kalendārus papildus Gregora. Node komanda API implementēja Rust valodā caur bibliotēku temporal_rs. Tāpēc tam, kurš Node būvē no pirmkoda, tagad vajag arī Rust rīkkopu papildus C++ kompilatoram.
Node vairs nav pirmais
Šeit Node dzenas pakaļ konkurentiem. Deno un Bun Temporal atbalstu iebūvēja jau agrāk, un pārlūki to pakāpeniski ieviesa caur V8 un SpiderMonkey. InfoQ raksta, ka Node 26 šo iztrūkumu aizver — kods, kas rakstīts vienam izpildvidei, tagad drošāk pārnesams uz citu.
Temporal nav vienīgais jaunums no V8. Dzinējs pacelts uz versiju 14.6.202.33 (tā pati, kas Chromium 146) un atnes dažus TC39 priekšlikumus. Map.prototype.getOrInsert() un getOrInsertComputed() ļauj vienā gājienā ielikt vērtību, ja atslēgas vēl nav. Tas izmet ierasto if (!map.has(k)) map.set(k, ...) paraugu, ko raksta katrā skaitīšanas vai grupēšanas ciklā. Bet Iterator.concat() savieno vairākus iteratorus vienā secībā, neizvēršot tos masīvos.
Kas salūzīs pēc atjaunināšanas
Node 26 ir liels laidiens, un tas izmet virkni sen novecojušu lietu. Vecie iekšējie straumju moduļi — _stream_readable, _stream_writable un pārējie ar apakšsvītru — ir izņemti pavisam. Metode http.Server.prototype.writeHeader() aizvākta; tās vietā jālieto writeHead(). Karodziņš --experimental-transform-types vairs neeksistē, bet module.register() tagad brīdina par novecošanu izpildes laikā.
Sāpīgākā vieta lielākiem projektiem: NODE_MODULE_VERSION pacelts uz 147. Tas nozīmē, ka katrs iepriekš sakompilētais native papildinājums jāpārbūvē, pirms tas strādās ar Node 26. Pakotnes ar C++ saistījumiem — better-sqlite3, bcrypt, sharp un līdzīgas — atjaunināšanu nevar veikt uz āķa; ja gatavais binārais fails vēl neeksistē, npm install mēģinās kompilēt uz vietas, un tur noder GCC 13.2 vai jaunāks.
Mainījušās arī prasības pašai būvei. Minimālais GCC ir 13.2, atbalsts Python 3.9 nomests, bet Windows SDK jāatjaunina uz 11. versiju.
Temporal ievieš Rust atkarību Node būvē — tas ir pirmais gadījums, kad standarta JavaScript API Node iekšienē balstās uz Rust kodu.
Pēdējais laidiens pēc vecās shēmas
Node 26 pašlaik ir “Current” versija un ilgtermiņa atbalstā (LTS) pāries oktobrī. Pēc tam to uzturēs vēl aptuveni divus ar pusi gadus. Šī ir pēdējā versija pēc vecās pāra/nepāra numuru shēmas — turpmāk Node pāriet uz gadskārtēju laidiena ritmu, tāpat kā to jau dara vairums lielo projektu.
Pēc pirmā laidiena darbs neapstājās. Versija 26.5.0 iznāca 8. jūlijā ar eksperimentālu teksta failu importēšanu un Blob straumēšanu, kā redzams GitHub laidiena piezīmēs. Teksta importēšana ļauj ar import ievilkt failu saturu kā virkni, tāpēc SQL vaicājumus vai HTML veidnes vairs nav jālasa ar atsevišķu readFile izsaukumu. Undici — HTTP klients aiz iebūvētā fetch() — pacelts uz 8.0.2.
Praktiskais padoms: ražošanas serveriem pagaidīt līdz oktobrim, kad iznāks LTS. Kas tikai grib izmēģināt Temporal vai atbrīvoties no date bibliotēkas, var lejupielādēt Node 26 jau tagad no nodejs.org. Vienīgā ķeramā vieta — pārliecinies, ka visi native papildinājumi ir pārbūvēti pret jauno ABI.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.