Адбыўся рэліз Node.js 17.0, платформы для выканання сеткавых дадаткаў на мове JavaScript. Node.js 17.0 адносіцца да галіны са звычайным тэрмінам падтрымкі, абнаўленні для якой будуць выпускацца да чэрвеня 2022 года. У бліжэйшыя дні будзе завершана стабілізацыя веткі Node.js 16, якая атрымае статус LTS і будзе падтрымлівацца да красавіка 2024 года. Суправаджэнне мінулай LTS-галінкі Node.js 14.0 працягнецца да красавіка 2023 года, а пазамінулай LTS-галінкі 12.0 да красавіка 2022 года.
Асноўныя паляпшэнні:
- Рухавічок V8 абноўлены да версіі 9.5.
- Прадоўжана рэалізацыя варыянтаў базавага API, заснаваных на выкарыстанні інтэрфейсу асінхронных вылічэнняў Promise. У дадатак да раней прапанаваных API Timers Promises і Streams Promises у Node.js 17.0 прадстаўлены API Readline Promise для парадковага чытання дадзеных з выкарыстаннем модуля readline. import * як readline ад 'node:readline/promises'; import { stdin as input, stdout as output } from 'process'; const rl = readline.createInterface({ input, output }); const answer = await rl.question('What do you think of Node.js?'); console.log('Такая ідэя для вашага моцнага feedback: ${answer}'); rl.close();
- Якая пастаўляецца ў камплекце бібліятэка OpenSSL абноўлена да версіі 3.0 (выкарыстаны форк quictls/openssl з уключанай падтрымкай пратаколу QUIC).
- Забяспечана выснова версіі Node.js у трасіроўках стэка, якія выводзяцца ў выпадку фатальных памылак, якія прыводзяць да завяршэння працы прыкладання.
Дадаткова можна згадаць аб ухіленні ў актуальных галінках Node.js двух уразлівасцяў (CVE-2021-22959, CVE-2021-22960), якія даюць магчымасць здзейсніць напады класа «HTTP Request Smuggling» (HRS), якія дазваляюць праз адпраўку спецыяльна аформленых кліенцкіх запытаў. змесціва запытаў іншых карыстачоў, апрацоўваных у тым жа струмені паміж фронтэндам і бэкэндам (напрыклад, можна дамагчыся падстаноўкі шкоднаснага JavaScript-кода ў сеанс іншага карыстача). Дэталі будуць расчыненыя пазней, а пакуль вядома толькі тое, што праблемы выкліканыя некарэктнай апрацоўкай прабелаў паміж імем HTTP-загалоўка і двукроп'ем, а таксама рознай апрацоўкай знакаў звароту карэткі і перакладу радка ў блоку параметраў, выкарыстоўваным пры перадачы цела запыту па частках у рэжыме «chunked ».
Нагадаем, што платформа Node.js можа быць скарыстана як для сервернага суправаджэння працы Web-прыкладанняў, так і для стварэння звычайных кліенцкіх і серверных сеткавых праграм. Для пашырэння функцыянальнасці прыкладанняў для Node.js падрыхтавана вялікая калекцыя модуляў, у якой можна знайсці модулі з рэалізацыяй сервераў і кліентаў HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, модулі для інтэграцыі з рознымі web-фрэймворкамі, апрацоўшчыкі WebSocket і Aja , канектары да СКБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонізатары, CSS-рухавічкі, рэалізацыі крыптаалгарытмаў і сістэм аўтарызацыі (OAuth), XML-парсеры.
Для забеспячэння апрацоўкі вялікай колькасці паралельных запытаў Node.js задзейнічае асінхронную мадэль запуску кода, заснаваную на апрацоўцы падзей у неблакіруючым рэжыме і вызначэнні callback-апрацоўшчыкаў. У якасці спосабаў мультыплексавання злучэнняў падтрымліваюцца такія метады, як epoll, kqueue, /dev/poll і select. Для мультыплексавання злучэнняў выкарыстоўваецца бібліятэка libuv, якая з'яўляецца надбудовай над libev у сістэмах Unix і над IOCP у Windows. Для стварэння пула патокаў (thread pool) задзейнічана бібліятэка libeio, для выканання DNS-запытаў у неблакіруючым рэжыме інтэграваны c-ares. Усе сістэмныя выклікі, якія выклікаюць блакаванне, выконваюцца ўсярэдзіне пула струменяў і затым, як і апрацоўшчыкі сігналаў, перадаюць вынік сваёй працы зваротна праз неназваны канал (pipe). Выкананне JavaScript-кода забяспечваецца праз задзейнічанне распрацаванага кампаніяй Google рухавічка V8 (дадаткова Microsoft развівае варыянт Node.js з рухавіком Chakra-Core).
Па сваёй сутнасці Node.js падобны на фрэймворкі Perl AnyEvent, Ruby Event Machine, Python Twisted і рэалізацыю падзей у Tcl, але цыкл апрацоўкі падзей (event loop) у Node.js скрыты ад распрацоўніка і нагадвае апрацоўку падзей у web-дадатку, які працуе ў браўзэры. Пры напісанні прыкладанняў для node.js неабходна ўлічваць спецыфіку падзейна-арыентаванага праграмавання, напрыклад, замест выканання "var result = db.query("select..");" з чаканнем завяршэння працы і наступнай апрацоўкай вынікаў, у Node.js выкарыстоўвае прынцып асінхроннага выканання, г.зн. код трансфармуецца ў "db.query("select..", function (result) {апрацоўка выніку});", пры якім кіраванне імгненна пяройдзе да наступнага кода, а вынік запыту будзе апрацаваны па меры паступлення дадзеных.
Крыніца: opennet.ru