Представлений реліз
Node.js 8.0.0 , платформи для виконання високопродуктивних мережевих додатків на мові JavaScript. Node.js 8.0 відноситься до гілок з тривалим терміном підтримки, але цей статус буде надано тільки в жовтні, після проведення стабілізації. Час випуску оновлень для LTS-гілок становить 4 роки. Підтримка минулої LTS-гілки Node.js 6.0 триватиме до 2020 року, а позаминулої LTS-гілки 4.x до квітня 2018 року. Підтримка проміжної гілки Node.js 7.0 буде припинена в липні 2017 року.
З поліпшень в Node.js 7.0 зазначається оновлення двигуна V8 до версії 5.8, в якій реалізована нова схема компіляції, з використанням інтерпретатора
Ignition і JIT-компілятора Turbofan . Нова схема примітна підвищенням продуктивності виконання JavaScript-додатків і зниженням витрат пам'яті. В V8 5.8 також представлений новий підхід до стабілізації - ABI даної версії буде сумісний з V8 5.9 і 6.0, що дозволить реалізувати оновлення движка V8 до нових випусків в рамках життєвого циклу гілки Node.js 8.x.
Серед інших змін:
— Новий Node.js API (
N-API ), що дозволяє створення доповнень до Node.js на Сі, не прив'язаних до JavaScript runtime і які є частиною Node.js. Для подібних доповнень буде забезпечений постійний ABI, що дозволяє без перекомпіляції використовувати додаток з різними версіями Node.js і навіть з різними JavaScript-двигунами (V8 і Chakra-Core);
— Додана експериментальна підтримка асинхронних обробників (модуль async_hooks), через які можна виконувати моніторинг операцій в циклі обробки подій, відстежувати асинхронні запити і повністю контролювати весь життєвий цикл роботи програми;
— У
класі URL забезпечена повна підтримка стандарту
WHATWG, що визначає вимоги до оформлення URL і API для розбору URL, що представляється браузерами;
— У
класі Buffer представлена серія нових методів формування буфера, таких як Buffer.alloc(), Buffer.allocUnsafe() і Buffer.from(). При виклику застарілого конструктора Buffer(num) програмі тепер виділяється очищений блок пам'яті (раніше пам'ять не ініціалізувалася, що могло призвести до витоку залишкових даних). Для виділення пам'яті без очищення, яке помітно знижує продуктивність, запропонований метод Buffer.allocUnsafe(num);
— Представлений новий API util.promisify(), що надає обв'язку над штатним API на основі callback-викликів для функцій, які повертають Promise;
— У console.log(), console.error() і інших методах модуля console з'явилася можливість перенаправлення виведення в stdout, stderr і безіменні канали. Помилки в процесі виведення тепер ігноруються, а для повернення старої поведінки (вихід з програми) в конструктор Console додана опція ignoreErrors;
— Додана опція "--redirect-warnings={file}" і змінна оточення "NODE_REDIRECT_WARNINGS={file}" за допомогою яких можна перенаправити в файл попередження, наприклад про виклик застарілих можливостей, раніше виведені в stderr;
— В Stream API додані нові способи завершення або обриву потоку. Кожен екземпляр об'єкта тепер включає метод destroy(), реалізація якого може бути змінена через створення методу _destroy();
— Замість застарілого CLI-відладчика, до складу runtime доданий інструмент node-inspect. Доданий експериментальний JavaScript API для інспектування роботи процесів Node.js з використанням протоколу Inspector;
— До складу включений новий випуск пакетного менеджера npm 5.0.0.
Нагадаємо, що платформа Node.js може бути використана як для серверного супроводу роботи Web-додатків, так і для створення звичайних клієнтських і серверних мережевих програм. Для розширення функціональності додатків для Node.js підготовлена велика колекція модулів, в якій можна знайти модулі з реалізацією серверів і клієнтів HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, модулі для інтеграції з різними web-фреймворками, обробники WebSocket і Ajax, драйвери для СУБД (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) {обробка результату});", при якому управління миттєво перейде до подальшого коду, а результат запиту буде оброблений в міру надходження даних. Жодна функція в Node.js не повинна безпосередньо виконувати операції введення/виводу — для отримання даних з диска, від іншого процесу або з мережі потрібна установка callback-обробника.
Джерело:
http://www.opennet.ru/opennews/art.shtml?num=46630 .