
Улучшения в сфере обработки ошибок
До выхода Node 10.0.0 единственным способом распознавания ошибок в выражениях
catch
была проверка текста сообщения об ошибке, что усложняло анализ проблем и отладку приложений. Выглядело это так.try {
//выполняем какие-то действия
} catch(error) {
if(error.message == 'Some error message') {
//обрабатываем конкретную ошибку
} else {
//обрабатываем остальные ошибки
}
}
В общей сложности для того, чтобы улучшить ситуацию с обработкой ошибок, было сделано около 300 коммитов. Благодаря этому теперь у нас имеются коды ошибок, которые проверять удобнее, чем сообщения. Это упрощает работу.
try {
//выполняем какие-то действия
} catch(error) {
if(error.code == 'Some error code') {
//обрабатываем конкретную ошибку
} else {
//обрабатываем остальные ошибки
}
}
Улучшенная производительность
К улучшениям в области производительности относятся асинхронные генераторы, встроенные асинхронные циклы, поддерживающие работу с промисами, усовершенствованные механизмы, предназначенные для работы с массивами.
Использование в Node движка V8 6.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-соединения может быть выполнена лишь один раз, после чего сервер может повторно использовать уже существующее соединение для отправки ответов на различные запросы.
HTTP/2, кроме того, поддерживает технологию отправки данных по инициативе сервера (server push). В частности, это означает, что когда браузер запрашивает у сервера HTML-файл, сервер может, по своей инициативе, отправить браузеру необходимые для корректного отображения страницы файлы с JS-кодом и CSS-правилами. Эти ресурсы попадают в кэш браузера. В результате, когда эти ресурсы понадобятся браузеру, он сможет воспользоваться ими гораздо быстрее, чем если бы ему пришлось, для их загрузки, намеренно запрашивать их у сервера. Вот пример использования 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, которые применяются для организации безопасного обмена сообщениями, и о поддержке дополнительных криптографических библиотек.
Тут надо отметить, что при выпуске npm 6.0 особое внимание было уделено безопасности. Отчасти это было вызвано результатами одного исследования, которое показало, что 97% JavaScript-разработчиков во всём мире полагаются, по крайней мере, в некоторых своих разработках, на опенсорсные проекты. При этом 77% разработчиков беспокоятся о безопасности подобных решений. Для того чтобы лучше документировать и исправлять уязвимости модулей и потенциальные конфликты зависимостей, компания npm приобрела проект Node Security Platform. Этот проект является основным источником сведений об уязвимости JS-пакетов.
Npm 6.0 поддерживает новую команду, направленную на анализ проблем с безопасностью:
npm audit
. Она позволяет пользователям рекурсивно анализировать деревья зависимостей для обнаружения потенциальных конфликтов и проблемных мест. Это позволяет разработчикам заблаговременно, не дожидаясь возникновения проблем, заменять в своих проектах устаревшие пакеты на их более новые версии, или переходить на другие пакеты, если те, что они используют, могут вызвать нежелательные эффекты.Улучшения 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.
Интерфейс N-API не привязан к релизу Node. То есть, при выходе нового релиза Node, расширения, написанные для старых релизов, переделывать не придётся. В частности, речь идёт об абстракции над API V8, которая даёт разработчикам нативных расширений стабильную среду. До сих пор N-API носило статус экспериментальной технологии, однако, в Node 10.0.0 оно переведено в разряд стабильных API.
В целом, N-API пригодится разработчикам нативных расширений для Node за счёт того, что оно даёт им достаточно стабильное средство для взаимодействия с платформой. При этом, в идеале, благодаря N-API разработчики нативных модулей могут не беспокоиться, например, о том, какой именно JS-движок используется в конкретной установке 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 кажутся вам наиболее интересными?

Комментарии (12)
sinh
23.05.2018 18:22Свойство code у ошибок было и раньше, но теперь эти коды не надо сравнивать как простые строки, а можно взять из соответствующего модуля: nodejs.org/dist/latest-v10.x/docs/api/errors.html#errors_node_js_error_codes
ReklatsMasters
23.05.2018 22:38Работать с chacha20 и poly135 можно и из 8 ноды. Достаточно просто скомпилировать их в wasm. Эти алгоритмы хороши тем, что хорошо оптимизируются софтово. Хотя, если процессор поддерживает тот же aes gcm аппаратно, это будет определённо быстрее.
Я не очень понимаю заметки об aead. Даже текущая версия ноды вполне поддерживает aead, а в частности aes gcm и aes ccm. Просто реализовываю тут dtls на чистом js и aead шифрование вполне себе работает из коробки.
sanchezzzhak
25.05.2018 10:45Регулярные выражения полностью доступны без флага --harmony.
Есть хороший сайт который показывает что работает, а что нет.
node.green
mwizard
Я бы поостерегся называть try/catch без аргумента «улучшением» — это провоцирует написание отвратительного кода вида «словим все и проигнорим».
theTeacherOfEnglish
Присутствующий аргумент в catch не мешает людям писать «отвратительный код».
mwizard
Да, но это «улучшение» поощряет подобное.
vvadzim
eslinter?
brain_tyrin
Если в линтере надо делать правило "не использовать фичу X", возможно, с фичей что-то не так :)
vvadzim
Если в линтере надо делать правило «не использовать фичу X», чтобы те, кому она мешает, могли её выключить, возможно, фича нужна одним и не нужна другим :)
faiwer
В таком случае получается, что в языке вообще всё не так. Линтеров полно на любой вкус и цвет. И это касается не только JS, а вообще любого популярного языка. Вы и буквы написать в файле не сможете, чтобы чей-нибудь линтер не ругнулся.