Node.js 22.0 har släppts, en plattform för att köra nätverksapplikationer skrivna i JavaScript. Node.js 22.0 har klassificerats som en långsiktig stödversion, men denna status kommer att tilldelas först i oktober efter stabilisering. Stödet för Node.js 22.x kommer att vara fram till den 30 april 2027. Underhållet av den tidigare LTS-versionen Node.js 20.x kommer att fortsätta fram till april 2026, och den före detta LTS-versionen 18.x fram till april 2025. Underhållet av den mellanliggande versionen Node.js 21.x kommer att upphöra den 1 juni 2024.
Huvudsakliga förbättringar:
- V8-motorn har uppdaterats till version 12.4, som används i Chromium 124. Bland förändringarna jämfört med versionen Node.js 21, som använde V8-motorn 11.8, märks:
- Stöd för WasmGC-tillägget, som underlättar porteringen av program skrivna på programmeringsspråk som använder skräpsamling (Kotlin, PHP, Java m.fl.) till WebAssembly. WasmGC lägger till nya typer av strukturer och arrayer som kan använda icke-linjär minnesallokering.
- Stöd för metoden Array.fromAsync(), som i asynkront läge returnerar en ny instans av objektet Array, kopierad från array-liknande objekt som är uppräkningsbara (iterable) eller asynkront uppräkningsbara (async iterable).
- Stöd för metoder för att arbeta med iteratorer, såsom .map, .filter, .find, .take, .drop, .forEach och .reduce.
- Stöd för objektet Set, som definierar en samling värden och erbjuder metoder för att utföra typiska operationer på mängder, såsom snitt, union, Differens och komplement.
- Den optimerande JIT-kompilatorn Maglev är aktiverad som standard, med fokus på att snabbt generera högpresterande maskinkod för aktivt använd JavaScript-kod. Aktiveringen av Maglev kan avsevärt snabba upp kortlivade CLI-applikationer som inte utför långvariga operationer, till exempel minskar testtiden för Jetstream med 7,5 % och för Speedometer med 5 %.
- Arbetet med strömmar har snabba upp genom att öka värdet på alternativet highWaterMark från 16 KB till 65 KB (definierar gränsen för hur mycket som buffras för skrivning). Denna förändring resulterar i ökad minnesanvändning, så applikationer som är avsedda att arbeta med begränsad RAM kan behöva återgå till det gamla värdet genom att anropa setDefaultHighWaterMark().
- Prestanda för API fetch() och testlöpare har förbättrats genom ökad effektivitet vid skapande av instanser av AbortSignal. Prestandan för API:er kopplade till synkron arbete med filsystem har också förbättrats.
- En experimentell funktion har lagts till för att använda anropet "require()" för att ladda JavaScript-moduler ESM (ECMAScript Modules) i synkront läge. ESM-moduler används i webbläsare och ersätter CommonJS-moduler som är specifika för Node.js. För att ladda ESM-modulen via "require()" måste den köras i synkront läge (utan await på hög nivå). Stödet aktiveras med flaggan "--experimental-require-module".
- En experimentell funktion har lagts till för att köra skript definierade i package.json-filen med kommandot "--run ".
- Kommandot "node --watch" har övergått till stabil kategori med implementation av övervakningsläge, som säkerställer att processen startas om vid ändring av den importerade filen (till exempel, om "node --watch index.js" körs, kommer processen automatiskt att startas om när index.js ändras).
- Den inbyggda implementationen av WebSocket API har stabiliserats, vilket gör det möjligt att använda WebSocket i klientläge utan att installera ytterligare beroenden.
- Delvis stöd för Navigator API har lagts till.
- Stöd för deflate-raw komprimeringsformatet har lagts till i Webstreams API.
- Funktionerna glob och globSync har lagts till i modulen node:fsmodule för att matcha filvägar med mönster.
- Hanteringen av felaktigt konfigurerade IPv6-staplar har förbättrats. Algoritmen Happy Eyeballs har implementerats för snabb återgång vid problem med IPv6.
- API util har deklarerats som föråldrat.
- Versionerna av beroenden har uppdaterats: npm 10.5.1, libuv 1.48.0, simdutf 5.2.3, c-ares 1.28.1, zlib 1.3.0.1-motley-24c07df, simdjson till 3.8.0, ada 2.7.7 och undici 6.6.0.
Node.js-plattformen kan användas både för serverhantering av webapplikationer och för att skapa vanliga klient- och servernätverksprogram. För att utöka funktionaliteten för Node.js-applikationer har en stor samling moduler tagits fram, där man kan finna moduler med implementeringar. servrar och kunder för HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduler för integration med olika webbramverk, WebSocket- och Ajax-hanterare, anslutare till databaser (MySQL, PostgreSQL, SQLite, MongoDB), mallmotorer, CSS-motorer, implementationer av kryptalgoritmer och auktorisationssystem (OAuth), XML-parserare.
För att hantera ett stort antal parallella förfrågningar använder Node.js en asynkron kodexekveringsmodell baserad på händelsehantering i icke-blockerande läge och definiering av callback-hanterare. För flerfaldig koppling stöds metoder som epoll, kqueue, /dev/poll och select. Biblioteket libuv används för att multiplexera kopplingar, vilket är en överbyggnad ovanpå libev i Unix-system och IOCP i Windows. För att skapa en trådpool används biblioteket libeio, och för att utföra DNS-förfrågningar i icke-blockerande läge integreras c-ares. Alla systemanrop som orsakar blockering genomförs inuti trådpoolen och överför sedan, liksom signalhanterare, resultatet av sitt arbete tillbaka genom en namnlös kanal (pipe).
Utförandet av JavaScript-kod säkerställs genom användning av V8-motorn utvecklad av Google (dessutom utvecklar Microsoft en variant av Node.js med Chakra-Core-motorn). I sin kärna liknar Node.js ramverken Perl AnyEvent, Ruby Event Machine, Python Twisted och händelseimplementeringen i Tcl, men händelsebehandlingsloopen i Node.js är dold för utvecklaren och påminner om händelsehantering i en webapplikation som körs i en webbläsare.
Källa: opennet.ru
