Выпуск серверной JavaScript-платформы Node.js 8.0
31 мая 2017 года
Представлен релиз 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 8.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-обработчика.
Источники[править]
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии[править]
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.