A avut loc lansarea Node.js 23.0.0, o platformă pentru executarea aplicațiilor de rețea în limbajul JavaScript. Node.js 23.0 este clasificat drept ramură intermediară, care va fi susținută timp de 7 luni (până în iunie 2025). În zilele următoare, se va finaliza stabilizarea ramurii Node.js 22, care va primi statutul LTS pe 29 octombrie și va fi susținută până în aprilie 2027. Suportul pentru versiunile anterioare LTS Node.js 20.x și 18.x va continua până în aprilie 2026 și, respectiv, 2025.
Îmbunătățiri principale:
- A fost adăugată suport experimental pentru limbajul TypeScript, care permite specificarea explicită a tipurilor. Suportul se activează prin opțiunile „—experimental-strip-types” și „—experimental-transform-types”. În cazul primei opțiuni, lucrul cu TypeScript se rezumă la curățarea definițiilor de tip specifice acestui limbaj (nu se efectuează verificarea tipurilor, codul fiind pur și simplu transformat în JavaScript fără tipuri). A doua opțiune transformă unele elemente de sintaxă TypeScript în cod JavaScript, cum ar fi enumerațiile (enum) și spațiile de nume (namespace).
- A fost activată, implicit, posibilitatea utilizării apelului „require()” pentru a încărca module JavaScript ESM (ECMAScript Modules) în modul sincron. Modulele ESM sunt utilizate în browsere și înlocuiesc modulele CommonJS, specifice Node.js. Pentru a încărca un modul ESM prin „require()” în Node.js, acesta trebuie să fie executat în mod sincron (fără await la nivel superior).
- S-a realizat detectarea automată a modulelor ESM în fișiere fără extensie sau cu extensia „.js”. Anterior, asemenea fișiere erau tratate ca module CommonJS, dacă tipul lor nu era specificat clar în fișierul package.json din același director („type”: „module”). În noua versiune, pentru fișierele a căror tip nu este specificat în package.json, se realizează mai întâi o încercare de încărcare ca modul CommonJS, iar dacă această încercare eșuează, ca modul ESM.
- A fost adăugată o implementare experimentală compatibilă cu browserele API Web Storage, destinat stocării permanente (clasa localStorage) sau temporare (clasa sessionStorage) a datelor în format cheie/valoare. Pentru a activa suportul pentru Web Storage, se necesită rularea cu flagul „—experimental-webstorage” și specificarea căii către fișierul de stocare prin flagul „—localstorage-file”.
- A fost adăugat un API experimental SQLite pentru a lucra cu baze de date, folosind limbajul de interogare SQL și stocarea bazată pe biblioteca SQLite. Pe lângă stocarea bazei de date într-un fișier pe disc, aceasta poate fi de asemenea plasată în memorie, specificând în loc de numele fișierului „:memory:”. API-ul Web Storage menționat mai sus este de asemenea implementat pe baza SQLite, ceea ce a dus la adăugarea SQLite în lista de dependențe pentru Node.js.
- A fost declarată stabila echipa „node —run”, destinată pentru a rula scripturi definite în fișierul package.json.
- A fost implementat suport opțional pentru caching-ul codului compilat pe disc pentru a accelera semnificativ lansarea modulelor. Activarea caching-ului se face prin variabila de mediu NODE_COMPILE_CACHE. Funcționalitatea sa seamănă cu pachetul v8-compile-cache, dar se distinge printr-o performanță mai ridicată și suport pentru module ESM.
- A fost efectuată o optimizare a obiectului Buffer, care a permis creșterea semnificativă a performanței metodelor Buffer.copy() și Buffer.write().
- A fost îmbunătățită performanța modulului node:fs, în care s-a redus de asemenea numărul apelurilor de cod C++ în timpul executării.
- Motorul V8 a fost actualizat la versiunea 12.9, utilizată în Chromium 129.
- A fost eliminat suportul pentru sistemele de 32 de biți cu sistemul de operare Windows.
- Din cauza implementării în Node.js și motorul V8 a caracteristicilor definite în standardul C++20, cerințele pentru versiunea compilatorului GCC au fost ridicate. Pentru a compila Node.js este acum necesară o versiune minimă de GCC 12.
Platforma Node.js poate fi utilizată atât pentru suportul serverului în funcționarea aplicațiilor web, cât și pentru crearea de aplicații client și server de rețea obișnuite. Pentru a extinde funcționalitatea aplicațiilor pentru Node.js a fost pregătită o mare colecție de module, în care se pot găsi module cu implementări servere și clienți HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, module pentru integrarea cu diverse framework-uri web, manejere WebSocket și Ajax, convertoare pentru baze de date (MySQL, PostgreSQL, SQLite, MongoDB), generatoare de șabloane, motoare CSS, implementări de algoritmi criptografici și sisteme de autorizare (OAuth), parsere XML.
Pentru a gestiona un număr mare de cereri paralele, Node.js utilizează un model asincron de execuție a codului, bazat pe procesarea evenimentelor în mod non-blocant și definirea callback-urilor. Ca metode de multiplexare a conexiunilor sunt susținute tehnici precum epoll, kqueue, /dev/poll și select. Pentru multiplexarea conexiunilor este utilizată biblioteca libuv, care este o extensie a libev în sistemele Unix și a IOCP în Windows. Pentru a crea un pool de thread-uri este folosită biblioteca libeio, iar pentru efectuarea cererilor DNS în mod non-blocant este integrat c-ares. Toate apelurile de sistem care generează blocaje sunt efectuate în cadrul pool-ului de thread-uri și apoi, ca și handlerii de semnale, transmit rezultatul muncii lor înapoi printr-un canal anonim (pipe).
Executarea codului JavaScript este asigurată prin utilizarea motorului V8 dezvoltat de Google (în plus, Microsoft dezvoltă o variantă a Node.js cu motorul Chakra-Core). În esență, Node.js este similar cu framework-urile Perl AnyEvent, Ruby Event Machine, Python Twisted și implementarea evenimentelor în Tcl, dar loop-ul de procesare a evenimentelor în Node.js este ascuns de dezvoltator și se aseamănă cu procesarea evenimentelor într-o aplicație web care rulează în browser.
Sursa: opennet.ro
