Обзор функций и обновлений Node.js 12 для среды выполнения JavaScript

Node.js продолжает свой годовой цикл выпуска с версией 12 (кодовое имя Erbium). Поскольку это четная версия, она перейдет в долгосрочную поддержку (LTS), начиная с октября 2019 года, и достигнет конца срока службы в апреле 2022 года.

Напротив, выпуски с нечетными номерами не относятся к LTS и существуют в течение 6–8 месяцев между выпусками LTS. Они используются для подготовки к следующему выпуску LTS.

Узел 12 обладает отличными функциями и значительными обновлениями среды выполнения. Кроме того, поскольку Node использует движок V8, поддерживаемый Google и используемый в Chrome, Node также будет получать все обновления от него.



Особенности узла 12

поддерживаются операторы импорта / экспорта (сборщик не требуется)

Узел 12 входит в Фазу 3 для модулей ECMAScript, которая соответствует пути к стабильности модулей внутри узла. Первоначально он все еще будет находиться за флагом --experimental-modules, и планируется удалить этот флаг к тому времени, когда узел 12 перейдет в LTS в октябре.

Синтаксис _3 _ / _ 4_ стал предпочтительным синтаксисом модуля для разработчиков JavaScript с момента его стандартизации в ES6, и команда Node усердно работала, чтобы включить его изначально. Экспериментальная поддержка началась в Node 8.0 на этапе 0 и делает большой шаг вперед с последней версией Node. Все основные браузеры поддерживают модули ECMAScript через <script type="module">, так что это огромное обновление для Node.

Фаза 3 будет поддерживать 3 типа import из файлов модулей ES (работает со всеми встроенными пакетами Node):

// default exports
import module from 'module'
// named exports
import { namedExport } from 'module'
// namespace exports
import * as module from 'module'

Если вы import из пакета CommonJS, вы можете импортировать только с использованием синтаксиса экспорта по умолчанию import module from 'cjs-library'.

Вы можете использовать динамические import() выражения для загрузки файлов во время выполнения. Синтаксис import() возвращает Promise и работает как с модулями ES, так и с библиотеками CommonJS.

Двигатель V8

Узел 12 первоначально будет работать на V8 7.4 и, в конечном итоге, будет обновлен до 7.6 в течение своего жизненного цикла. Команда V8 согласилась обеспечить стабильность ABI (Application Binary Interface) для этого диапазона. Заметными улучшениями в V8 7.4 являются обновления производительности для более быстрого выполнения JavaScript, лучшего управления памятью и расширенной поддержки синтаксиса ECMAScript.

  • Асинхронные трассировки стека
  • Более быстрый парсинг JavaScript
  • Более быстрые звонки с несоответствием аргументов
  • Быстрее await

Поля частного класса

Узел 12 будет поставляться с полями частного класса (включенными в V8). Переменные поля частного класса доступны только внутри самого класса и не доступны извне. Поле частного класса объявляется путем добавления к переменной символа #.

class Greet {
  #name = 'World';
  get name() {
    return this.#name;
  }
  set name(name) {
    this.#name = name;
  }
  sayHello() {
    console.log(`Hello, ${this.#name}`);
  }
}

В приведенном выше примере, если вы попытаетесь получить доступ к #name вне класса, вы получите синтаксическую ошибку.

const greet = new Greet()
greet.#name = 'NewName';
// -> SyntaxError
console.log(greet.#name)
// -> SyntaxError

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

Узел 12 создаст кеш кода для встроенных библиотек до времени сборки и внедрит его как двоичный файл. Основной поток может использовать этот кеш кода, улучшая время запуска на 30%.

TLS и безопасность

Node теперь поддерживает TLS 1.3, который обеспечивает повышенную безопасность и сокращение задержек. TLS 1.3 стал огромным обновлением протокола и активно интегрируется через Интернет. Благодаря реализации TLS 1.3 приложения Node повысят конфиденциальность конечных пользователей, а также улучшат производительность запросов за счет сокращения времени, необходимого для установления связи HTTPS. Кроме того, TLS 1.0 и 1.1 отключены по умолчанию, а библиотека crypto удалила устаревшие функции.

Улучшения размера кучи

Ранее использовались размеры кучи V8 по умолчанию, которые соответствовали 700 МБ (32-разрядные системы) или 1400 МБ (64-разрядные системы). Node теперь будет определять размеры кучи на основе доступной памяти, что гарантирует, что он не использует больше, чем разрешено.

Функциональность дампа кучи

Узел 12 предоставляет возможность создавать дамп кучи, что упрощает исследование проблем с памятью.

Экспериментальные диагностические отчеты

Node предлагает улучшенную возможность диагностики проблем (производительность, использование ЦП, память, сбои и т. Д.) В приложениях, предоставляя функцию экспериментального диагностического отчета.

Улучшения N-API в собственных модулях

N-API был выпущен для обеспечения более стабильной и собственной модульной системы Node, которая предотвратила бы поломку библиотек в каждом выпуске, предоставляя абстракцию, устойчивую к ABI, по сравнению с собственными API-интерфейсами JavaScript. Узел 12 предлагает улучшенную поддержку N-API в сочетании с рабочими потоками.

Другие заметные улучшения

  • Рабочим потокам больше не требуется флаг
  • http обновил свой синтаксический анализатор по умолчанию на llhttp
  • assert проверяет требуемые аргументы и корректирует неточные утверждения
  • buffer улучшения, чтобы сделать его более стабильным и безопасным
  • async_hooks удаляет устаревшие функции
  • Сделайте global.process, global.Buffer геттеры для улучшения process
  • Новое приветственное сообщение для repl

Заключение

Команда Node очень усердно работает, чтобы предоставлять ежегодные обновления с огромными улучшениями для Node и всей экосистемы JS, и версия 12 не разочаровывает. Полную версию CHANGELOG можно найти на GitHub, а дополнительные сведения - в официальной статье о выпуске.

2019 год уже был большим годом для Node и Node.js Foundation, слияния с JS Foundation, чтобы сформировать OpenJS Foundation. Мы продолжаем захватывающий год для JavaScript выпуском Node версии 12.