Выпуск сервернай JavaScript-платформы Node.js 17.0

Адбыўся рэліз 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

Дадаць каментар