Udgivelsen af Node.js 21.0, en platform til kørsel af netværksapplikationer skrevet i JavaScript, er gennemført. Støtten til Node.js 21.0 vil vare i 6 måneder. Stabilisering af Node.js 20-grenen afsluttes inden for de næste par dage, og denne gren vil få LTS-status og blive supporteret indtil april 2026. Den tidligere LTS-gren Node.js 18.0 vil blive vedligeholdt indtil september 2025, mens den før det, LTS-gren 16.0, vil blive vedligeholdt indtil april 2024.
Hovedforbedringer:
- Det stabile API Fetch er blevet erklæret, som er designet til at hente ressourcer over nettet og gør det lettere at skrive universel JavaScript-kode, der kan bruges både på server- og klientsiden. Implementeringen er baseret på koden fra HTTP/1.1-klienten undici og er så tæt som muligt på det tilsvarende API, der leveres i browsere. API'et inkluderer metoden fetch() samt objekterne Headers, Request og Response, der repræsenterer HTTP-hoveder, anmodninger og svar. const res = await fetch('https://nodejs.org/api/documentation.json'); if (res.ok) { const data = await res.json(); console.log(data); }
- Støtten til API WebStreams er blevet stabiliseret, som giver adgang til datastreams hentet over nettet. API'et muliggør tilføjelse af brugerdefinerede håndteringsfunktioner, der kan arbejde med data, mens informationen overføres, uden at vente på, at hele filen er hentet. I Node.js er objekter som ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream og DecompressionStream tilgængelige.
- En eksperimentel implementering af WebSocket-klienten er blevet tilføjet, kompatibel med browsere. For at aktivere støtte til WebSocket er der en flag '-experimental-websocket'.
- En eksperimentel standardtilstand for brugen af JavaScript-moduler ESM (ECMAScript Modules, anvendt i moduler til browsere) er tilføjet i stedet for CommonJS (specifik for Node.js). Ændringen påvirker ikke moduler, hvis format er eksplicit defineret via 'type' feltet i package.json, angivet gennem flaget '-input-type' eller er åbenlyst på grund af filens udvidelse (.mjs for ESM, .cjs for CommonJS). Moduler, der ikke er eksplicit defineret som CommonJS (f.eks. har udvidelsen '.js'), vil i den nye tilstand blive betragtet som ESM-moduler. For at aktivere de nye modulindstillinger er flaget '-experimental-default-type' foreslået.
- V8-motoren er opdateret til version 11.8, som anvendes i Chromium 118, hvor der er tilføjet støtte til metoden ArrayBuffer.prototype.transfer, muligheden for at gruppere arrays (metoden groupBy) og WebAssembly-instruktioner til håndtering af konstanter (i32.add, i32.sub, i32.mul, i64.add, i64.sub og i64.mul).
- Understøttelsen af handleren globalPreload er ophørt, i stedet bør moduler konfigureres ved hjælp af kald til register og initialize.
- Der er tilføjet en mulighed "flush" til funktionen fs.writeFile for at tvinge data til at blive skrevet til lagringsmediet efter hver skriveoperation.
- Ydeevnen for koden relateret til parsing af URL, API-fetch, streams, node:fs og HTTP er forbedret.
- Der er tilføjet et globalt objekt navigator. For eksempel kan egenskaben navigator.hardwareConcurrency bruges til at hente data om antallet af CPU-kerner.
- Globale masker til valg af kørbare tests er blevet tilføjet til parameteren "--test" (f.eks. kan du angive "--test **/*.test.js").
- Den medfølgende pakkestyrrer npm 10.2.0 og parseren llhttp 9.1.2 er blevet opdateret.
- Understøttelsen af Visual Studio 2019 og versioner af macOS tidligere end 11.0 er ophørt.
Node.js-platformen kan bruges til både server-side drift af webapplikationer og til at skabe almindelige klient- og serverbaserede netværksprogrammer. Der er forberedt en stor samling af moduler til at udvide funktionaliteten af applikationer til Node.js, hvor man kan finde moduler med implementeringer servere og HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3 klienter, moduler til integration med forskellige web-rammer, WebSocket- og Ajax-håndterere, forbindelser til DBMS (MySQL, PostgreSQL, SQLite, MongoDB), templating-motorer, CSS-motorer, implementeringer af kryptografi-algoritmer og autorisationssystemer (OAuth), XML-parsere.
For the handling of a large number of parallel requests, Node.js utilizes an asynchronous code execution model based on event-driven, non-blocking I/O and the definition of callback handlers. It supports multiplexing methods such as epoll, kqueue, /dev/poll, and select. The libuv library, which acts as a wrapper over libev in Unix systems and IOCP in Windows, is used for connection multiplexing. A thread pool is created using the libeio library, and for performing non-blocking DNS queries, c-ares is integrated. All blocking system calls are executed within the thread pool and then, similar to signal handlers, relay their results back via an unnamed pipe. JavaScript code execution is facilitated through the V8 engine developed by Google (Microsoft also develops a Node.js variant with the Chakra-Core engine).
In essence, Node.js is similar to frameworks like Perl AnyEvent, Ruby Event Machine, Python Twisted, and the event implementation in Tcl, but the event loop in Node.js is abstracted from the developer, resembling the event handling in a web application running in a browser. When developing applications for Node.js, one must consider the aspects of event-driven programming; for instance, instead of executing "var result = db.query('select..');" while waiting for the operation to complete and subsequently handling results, Node.js employs asynchronous execution principles, meaning the code transforms to "db.query('select..', function (result) {result handling});" whereby control immediately passes to subsequent code while the result will be processed as data arrives.
Kilde: opennet.ru
