Byl vydán Node.js 21.0, platforma pro běh síťových aplikací v jazyce JavaScript. Podpora verze Node.js 21.0 bude poskytována po dobu 6 měsíců. V nejbližších dnech bude dokončena stabilizace verze Node.js 20, která získá status LTS a bude podporována do dubna 2026. Podpora předchozí LTS verze Node.js 18.0 potrvá do září 2025, a předchozí LTS verze 16.0 do dubna 2024.
Hlavní vylepšení:
- Bylo oznámeno stabilní API Fetch, které slouží k načítání zdrojů přes síť a usnadňuje psaní univerzálního JavaScript kódu, který je použitelný jak na straně serveru, tak na klientovi. Implementace vychází z kódu HTTP/1.1 klienta undici a je co nejblíže podobnému API poskytovaném v prohlížečích. API zahrnuje metodu fetch() a objekty Headers, Request a Response, které reprezentují HTTP hlavičky, dotaz a odpověď. const res = await fetch('https://nodejs.org/api/documentation.json'); if (res.ok) { const data = await res.json(); console.log(data); }
- Byla stabilizována podpora API WebStreams, které poskytuje přístup k datovým tokům přijímaným po síti. API umožňuje přidávat vlastní zpracovatele, kteří pracují s daty při jejich příjmu, aniž by bylo nutné čekat na stáhnutí celého souboru. V Node.js jsou k dispozici objekty jako ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream a DecompressionStream.
- Byla přidána experimentální implementace WebSocket klienta, compatible with browsers. Pro aktivaci podpory WebSocket je k dispozici příznak "--experimental-websocket".
- Byl přidán experimentální režim výchozího použití implementace JavaScript modulů ESM (ECMAScript Modules, používané v modulech pro prohlížeče) namísto CommonJS (specifický pro Node.js). Změna se netýká modulů, jejichž formát je výslovně definován prostřednictvím pole "type" v package.json, nastaveného pomocí příznaku "--input-type" nebo jasného na základě přípony souboru (.mjs pro ESM, .cjs pro CommonJS). Přitom moduly, které nejsou jasně definovány jako CommonJS (například mají příponu ".js"), budou při aktivaci nového režimu považovány za moduly ESM. K aktivaci nového nastavení modulů je navržen příznak "--experimental-default-type".
- Engin V8 byl aktualizován na verzi 11.8, použitou v Chromium 118, které nyní podporuje metodu ArrayBuffer.prototype.transfer, možnost skupinování polí (metoda groupBy) a instrukce WebAssembly pro zpracování konstant (i32.add, i32.sub, i32.mul, i64.add, i64.sub a i64.mul).
- Podpora globalPreload byla ukončena, místo toho by měly být pro nastavení modulů použity volání register a initialize.
- Do funkce fs.writeFile byla přidána volba „flush“ pro vynucení vyprázdnění dat na úložiště po každé operaci zápisu.
- Byl zvýšen výkon kódu souvisejícího s analýzou URL, API fetch, streamy, node:fs a HTTP.
- Byl přidán globální objekt navigator. Například pro získání údajů o počtu jader CPU lze použít vlastnost navigator.hardwareConcurrency.
- Do parametru „—test“ byla přidána podpora globálních masek pro výběr spouštěných testů (například můžete uvést „—test **/*.test.js“).
- Byly aktualizovány dodávané balíčky, správce balíčků npm na verzi 10.2.0 a parser llhttp na verzi 9.1.2.
- Podpora Visual Studio 2019 a verzí macOS starších než 11.0 byla ukončena.
Platforma Node.js může být využita jak pro serverové zajištění chodu webových aplikací, tak pro vytváření obyčejných klientských a serverových síťových programů. Pro rozšíření funkcionality aplikací pro Node.js je k dispozici rozsáhlá sbírka modulů, ve které lze nalézt moduly s realizacemi servery a klientů HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduly pro integraci s různými webovými frameworky, zpracovatele WebSocket a Ajax, konektory k databázím (MySQL, PostgreSQL, SQLite, MongoDB), šablonovací enginy, CSS frameworky, implementace kryptografických algoritmů a systémů autorizace (OAuth), XML parsery.
Aby Node.js zvládl zpracování velkého počtu paralelních požadavků, využívá asynchronní model spouštění kódu založený na zpracování událostí v nezablokovaném režimu a určení callback-handlerů. Mezi metody multiplexování spojení patří epoll, kqueue, /dev/poll a select. Pro multiplexování spojení se používá knihovna libuv, která je nadstavbou nad libev v systémech Unix a nad IOCP ve Windows. Pro vytvoření vlákna (thread pool) se využívá knihovna libeio a pro provádění DNS dotazů v nezablokovaném režimu je integrován c-ares. Všechny systémové výzvy, které způsobují blokaci, jsou prováděny uvnitř vlákna a následně, stejně jako zpracovatelé signálů, předávají výsledek své práce zpět prostřednictvím anonymního kanálu (pipe). Provádění JavaScriptového kódu je zajišťováno prostřednictvím využití motoru V8 vyvinutého společností Google (navíc Microsoft vyvíjí variantu Node.js s motorem Chakra-Core).
Node.js je v podstatě podobný frameworkům Perl AnyEvent, Ruby Event Machine, Python Twisted a událostem implementovaným v Tcl, avšak event loop v Node.js je skrytý před vývojářem a připomíná zpracování událostí ve webové aplikaci běžící v prohlížeči. Při psaní aplikací pro Node.js je třeba vzít v úvahu specifika událostmi orientovaného programování, například místo provádění 'var result = db.query("select..")' s čekáním na dokončení a následným zpracováním výsledků, Node.js používá princip asynchronního provádění, tj. kód se transformuje na 'db.query("select..", function(result) {zpracování výsledku});', kdy se řízení okamžitě přesune na další kód a výsledek dotazu bude zpracován, jakmile budou data k dispozici.
Zdroj: opennet.ru
