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

в 8:48, , рубрики: javascript, node.js, Блог компании RUVDS.com, разработка, Разработка веб-сайтов

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

image

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

До выхода 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 кажутся вам наиболее интересными?

Автор: ru_vds

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js