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

Автор оригинала: Deepak Gupta
  • Перевод
Недавно был выпущен 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 кажутся вам наиболее интересными?

RUVDS.com
808,31
RUVDS – хостинг VDS/VPS серверов
Поделиться публикацией

Комментарии 13

    +1
    Я бы поостерегся называть try/catch без аргумента «улучшением» — это провоцирует написание отвратительного кода вида «словим все и проигнорим».
      +2
      Присутствующий аргумент в catch не мешает людям писать «отвратительный код».
        0
        Да, но это «улучшение» поощряет подобное.
          0
          eslinter?
            0

            Если в линтере надо делать правило "не использовать фичу X", возможно, с фичей что-то не так :)

              0
              Если в линтере надо делать правило «не использовать фичу X», чтобы те, кому она мешает, могли её выключить, возможно, фича нужна одним и не нужна другим :)
                0

                В линтере можно написать нормальное правило "проверить, чтобы аргумент ошибки был обязательно использован". И такая опция действительно есть. Это гораздо надежнее, чем просто навязывать аргумент, а будет он использоваться или нет — неважно.


                Нововведение синтаксиса просто утверждает статус-кво, избавляя программистов от необходимости придумывать имена тому, что не будет использовано.

                0

                В таком случае получается, что в языке вообще всё не так. Линтеров полно на любой вкус и цвет. И это касается не только JS, а вообще любого популярного языка. Вы и буквы написать в файле не сможете, чтобы чей-нибудь линтер не ругнулся.

        0
        Свойство code у ошибок было и раньше, но теперь эти коды не надо сравнивать как простые строки, а можно взять из соответствующего модуля: nodejs.org/dist/latest-v10.x/docs/api/errors.html#errors_node_js_error_codes
          0

          Работать с chacha20 и poly135 можно и из 8 ноды. Достаточно просто скомпилировать их в wasm. Эти алгоритмы хороши тем, что хорошо оптимизируются софтово. Хотя, если процессор поддерживает тот же aes gcm аппаратно, это будет определённо быстрее.


          Я не очень понимаю заметки об aead. Даже текущая версия ноды вполне поддерживает aead, а в частности aes gcm и aes ccm. Просто реализовываю тут dtls на чистом js и aead шифрование вполне себе работает из коробки.

            0
            filter, map, reduce в 10 раз быстрее — это сильно.
            Думал в 10 версии уберут флаг --experimental-modules для использования ECMAScript Modules Import/Export.
              0
              Насколько я знаю, эти модули обещают к 2020 году реализовать
              0

              Регулярные выражения полностью доступны без флага --harmony.
              Есть хороший сайт который показывает что работает, а что нет.
              node.green

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое