Доступна серверна JavaScript-платформа Node.js 20.0

Відбувся реліз Node.js 20.0, платформи для виконання мережевих програм мовою JavaScript. Node.js 20.0 віднесений до гілок з тривалим терміном підтримки, але цей статус буде надано лише у жовтні, після проведення стабілізації. Підтримка Node.js 20.x здійснюватиметься до 30 квітня 2026 року. Супровід минулої LTS-гілки Node.js 18.x триватиме до квітня 2025 року, а позаминулої LTS-гілки 16.x до вересня 2023 року. Супровід LTS-гілки 14.x буде припинено 30 квітня, а проміжної гілки Node.js 19.x - 1 червня.

Основні покращення:

  • Двигун V8 оновлений до версії 11.3, застосовуваної у Chromium 113. Зі змін у порівнянні з гілкою Node.js 19, в якій використовувався двигун Chromium 107, відзначаються функції String.prototype.isWellFormed і toWellFormed, методи Array.prototype та Typ з копією при зміні об'єктів Array і TypedArray, прапор «v» в RegExp, підтримка зміни розміру ArrayBuffer та збільшення розміру SharedArrayBuffer, хвостова рекурсія (tail-call) у WebAssembly.
  • Запропоновано експериментальний механізм Permission Model, що дозволяє обмежити доступ до певних ресурсів у процесі виконання. Підтримка Permission Model включається через вказівку під час запуску прапора «experimental-permission». У початковій реалізації запропоновані опції для обмеження доступу на запис (-allow-fs-write) та читання (-allow-fs-read) до певних частин ФС, дочірніх процесів (-allow-child-process), доповнень (-no-addons ) і потоків (-allow-worker). Наприклад, щоб дозволити запис до каталогу /tmp та читання файлу /home/index.js можна вказати: node —experimental-permission —allow-fs-write=/tmp/ —allow-fs-read=/home/index.js index .js

    Для перевірки доступу пропонується використовувати метод process.permission.has(), наприклад «process.permission.has('fs.write',»/tmp/test»).

  • Обробники зовнішніх модулів ECMAScript (ESM), що завантажуються через опцію «experimental-loader», тепер виконуються в окремому потоці, ізольованому від основного потоку, що виключає перетин коду додатків і завантажуваних ESM-модулів. За аналогією з браузерами метод import.meta.resolve() під час виклику з програми тепер виконується у синхронному режимі. В одній з наступних гілок Node.js підтримку завантаження ESM планують перевести до стабільних можливостей.
  • До стабільного переведено модуль node:test (test_runner), призначений для створення та запуску тестів на мові JavaScript, що повертають результат у форматі TAP (Test Anything Protocol).
  • Сформовано окрему команду розробників, що відповідає за оптимізацію продуктивності, яка під час підготовки нової гілки провела роботу з прискорення різних runtime-компонентів, включаючи розбір URL, fetch() та EventTarget. Наприклад, накладні витрати при ініціалізації EventTarget знижено вдвічі, значно підвищено продуктивність методу URL.canParse() та підвищено ефективність роботи таймерів. Крім того, до складу включено випуск високопродуктивного парсера URL - Ada 2.0, написаного мовою C++.
  • Продовжено розвиток експериментальної можливості для постачання додатків у формі одного файлу, що виконується (SEA, Single Executable Applications). Створення файлу, що виконується, тепер вимагає підстановки блобу, що формується на основі файлу конфігурації у форматі JSON (замість підстановки JavaScript-файлу).
  • Поліпшено сумісність API Web Crypto з реалізаціями від інших проектів.
  • Додана офіційна підтримка Windows на системах ARM64.
  • Продовжено реалізацію підтримки розширень WASI (WebAssembly System Interface) для створення відокремлених WebAssembly-додатків. Прибрано необхідність вказати спеціальний прапор командного рядка для включення підтримки WASI.

Платформа 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

Додати коментар або відгук