Хабрахабр

[Перевод] Новшества Node.js 10 в области разработки и безопасности

Недавно был выпущен Node.js 10.0.0. Это — седьмой основной релиз платформы. Он, в октябре 2018, получит статус LTS на три года. Обычно основные релизы Node выпускают два раза в год. Один — в апреле, а второй — в октябре. В материале, перевод которого мы сегодня публикуем, дан обзор основных новшеств Node.js 10.0.0 с точки зрения разработки серверных приложений и безопасности.

image

Улучшения в сфере обработки ошибок

До выхода Node 10.0.0 единственным способом распознавания ошибок в выражениях catch была проверка текста сообщения об ошибке, что усложняло анализ проблем и отладку приложений. Выглядело это так.

try { //выполняем какие-то действия
} catch(error) else { //обрабатываем остальные ошибки }
}

В общей сложности для того, чтобы улучшить ситуацию с обработкой ошибок, было сделано около 300 коммитов. Благодаря этому теперь у нас имеются коды ошибок, которые проверять удобнее, чем сообщения. Это упрощает работу.

try { //выполняем какие-то действия
} catch(error) { if(error.code == 'Some error code') { //обрабатываем конкретную ошибку } else { //обрабатываем остальные ошибки }
}

Улучшенная производительность

К улучшениям в области производительности относятся асинхронные генераторы, встроенные асинхронные циклы, поддерживающие работу с промисами, усовершенствованные механизмы, предназначенные для работы с массивами.

6 дало значительное повышение производительности. Использование в Node движка V8 6. Так, например, функции для работы с массивами, такие, как reduce, map и filter, стали примерно в 10 раз быстрее.

const sum = [1,2,3,4,5,6].reduce((sum, num) => sum+=num,0);

Все эти и другие улучшения вносят вклад в повышение производительности приложений, построенных на платформе Node.js.

Экспериментальная версия модуля fs с поддержкой промисов

Преобразовывать функции, использующие коллбэки, в конструкции, поддерживающие промисы, можно было и раньше, с помощью utils.promisify. Однако, если уж говорить об использовании промисов, куда лучше, если некое API изначально на них ориентировано. Сейчас модуль fs поддерживает промисы в экспериментальном режиме. Полная поддержка ожидается в октябрьском релизе Node.

Улучшенная поддержка HTTP и HTTP/2

Протокол HTTP/2 поддерживает TCP-мультиплексирование. Это означает, что процедура установления TCP-соединения может быть выполнена лишь один раз, после чего сервер может повторно использовать уже существующее соединение для отправки ответов на различные запросы.

В частности, это означает, что когда браузер запрашивает у сервера HTML-файл, сервер может, по своей инициативе, отправить браузеру необходимые для корректного отображения страницы файлы с JS-кодом и CSS-правилами. HTTP/2, кроме того, поддерживает технологию отправки данных по инициативе сервера (server push). В результате, когда эти ресурсы понадобятся браузеру, он сможет воспользоваться ими гораздо быстрее, чем если бы ему пришлось, для их загрузки, намеренно запрашивать их у сервера. Эти ресурсы попадают в кэш браузера. Вот пример использования HTTP/2.

const http2 = require('http2')
const server = http2.createSecureServer( { cert, key }, onRequest
) function push (stream, filePath) { const { file, headers } = getFile(filePath) const pushHeaders = { [HTTP2_HEADER_PATH]: filePath } stream.pushStream(pushHeaders, (pushStream) => { pushStream.respondWithFD(file, headers) })
} function onRequest (req, res) { //отправка дополнительных файлов вместе с index.html if (reqPath === '/index.html') { push(res.stream, 'bundle1.js') push(res.stream, 'bundle2.js') } //обработка файла res.stream.respondWithFD(file.fileDescriptor, file.headers)
}

Надо отметить, что браузеры поддерживают HTTP/2 только через SSL, поэтому тут, в продакшне, понадобится какой-нибудь прокси-сервер, вроде Nginx.

Криптография и безопасность

В Node 10.0.0 добавлена поддержка криптографической библиотеки OpenSSL 1.1.0, которая поддерживает протоколы TLS/SSL. Благодаря этой библиотеке, кроме того, теперь можно работать с потоковым шифром ChaCha20 и алгоритмом аутентификации сообщений Poly1305. В октябре планируется расширить набор поддерживаемых криптографических технологий. Речь идёт о поддержке режимов шифрования AEAD, которые применяются для организации безопасного обмена сообщениями, и о поддержке дополнительных криптографических библиотек.

0 особое внимание было уделено безопасности. Тут надо отметить, что при выпуске npm 6. При этом 77% разработчиков беспокоятся о безопасности подобных решений. Отчасти это было вызвано результатами одного исследования, которое показало, что 97% JavaScript-разработчиков во всём мире полагаются, по крайней мере, в некоторых своих разработках, на опенсорсные проекты. Этот проект является основным источником сведений об уязвимости JS-пакетов. Для того чтобы лучше документировать и исправлять уязвимости модулей и потенциальные конфликты зависимостей, компания npm приобрела проект Node Security Platform.

0 поддерживает новую команду, направленную на анализ проблем с безопасностью: npm audit. Npm 6. Это позволяет разработчикам заблаговременно, не дожидаясь возникновения проблем, заменять в своих проектах устаревшие пакеты на их более новые версии, или переходить на другие пакеты, если те, что они используют, могут вызвать нежелательные эффекты. Она позволяет пользователям рекурсивно анализировать деревья зависимостей для обнаружения потенциальных конфликтов и проблемных мест.

Улучшения JavaScript

В Node.js 10.0.0 появились некоторые улучшения, касающиеся JavaScript. Вот некоторые из них:

  • В выражении catch конструкции try-catch больше нет необходимости использовать параметры.
  • Команда Function.prototype.toString() теперь возвращает исключительно текст исходного кода функции, что благотворно влияет на безопасность за счёт предотвращения утечки информации.
  • В Node, благодаря новому V8, появилась поддержка методов String.prototype.trimEnd(), String.prototype.trimStart().

Улучшенные механизмы отладки

В Node.js 10.0.0 значительно упрощена отладка. В частности, теперь в распоряжении разработчика имеется модуль trace_events, который позволяет централизованно, из кода (то есть, для этого больше не нужно обращаться к командной строке), управлять трассировочной информацией, поступающей из разных источников, в частности, от движка V8, от механизмов ядра Node и от пользовательского кода. Эти данные можно записывать в файл, их понимают инструменты разработчика Google Chrome. Вот как выглядит работа с новым API.

const t_events = require('trace_events')
const tracing = t_events.createTracing({ categories: ['async.hooks', 'v8']
}) tracing.enable()
//выполняем какие-то действия
tracing.disable()

Полная поддержка N-API

N-API -это API для разработки нативных расширений для Node.js. Это API не зависит от JS-движка (например, от V8), оно поддерживается как часть самого Node.js.

То есть, при выходе нового релиза Node, расширения, написанные для старых релизов, переделывать не придётся. Интерфейс N-API не привязан к релизу Node. До сих пор N-API носило статус экспериментальной технологии, однако, в Node 10. В частности, речь идёт об абстракции над API V8, которая даёт разработчикам нативных расширений стабильную среду. 0 оно переведено в разряд стабильных API. 0.

При этом, в идеале, благодаря N-API разработчики нативных модулей могут не беспокоиться, например, о том, какой именно JS-движок используется в конкретной установке Node. В целом, N-API пригодится разработчикам нативных расширений для Node за счёт того, что оно даёт им достаточно стабильное средство для взаимодействия с платформой.

Экспериментальная поддержка ChakraCore

Как известно, изначально платформа Node.js поддерживала лишь JS-движок V8, однако сейчас, в рамках проекта Node-ChakraCore, ведутся работы над поддержкой в Node движка ChakraCore от Microsoft. В целом, поддержка Node альтернативных JS движков — это хорошая тенденция, которая может быть особенно интересна IoT-разработчикам.

Итоги

В Node 10.0.0 появилось много нового. По мере развития эта платформа становится более производительной, удобной и универсальной. В настоящий момент текущим релизом Node является Node 10.1.0, в котором исправлены некоторые ошибки и кое-что улучшено.

Уважаемые читатели! Какие возможности Node.js 10 кажутся вам наиболее интересными?

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»