Что нового в Node.js v20 (тестировщик, модель разрешений, SEA, V8 JS Engine 11.3)

Опубликовано: 2023-04-28

Node.js v20 уже доступен! 18 апреля 2023 года он был обнародован и теперь может использоваться всеми. В этом выпуске Node.js должен стать намного безопаснее и работать лучше.

Важно знать — поскольку это выпуск с четным номером, он должен стать версией с долгосрочной поддержкой (LTS) в октябре 2023 года и будет поддерживаться до апреля 2026 года. Однако команда Node.js активно ищет сообщество. обратная связь для выявления и устранения любых проблем, прежде чем они будут переведены в LTS.

Этот новый выпуск Node.js включает в себя интересные обновления и функции, которые наверняка оценят разработчики, такие как экспериментальная модель разрешений, синхронный import.meta.resolve , стабильный запуск тестов, обновление движка JavaScript V8 до версии 11.3, обеспечивающее повышение производительности и устранение ошибок. исправления и многое другое.

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

Начало работы с Node.js v20

Установка Node.js v20 очень похожа на установку других версий Node.js. Все, что вам нужно сделать, это:

  1. Загрузите установочный пакет с официального сайта Node.js.
  2. После загрузки установщика запустите его и следуйте инструкциям, чтобы завершить процесс установки. Этот процесс довольно прост, и вам просто нужно согласиться с лицензионным соглашением и нажать кнопку «Далее».
  3. Перезагрузите систему/компьютер после завершения процесса установки, чтобы все изменения вступили в силу.
  4. Проверьте установку Node.js, выполнив следующую команду:
 node -v
Проверка установки Node.js v20
Установка Node.js v20

Если вы видите номер версии (v20.0.0), это означает, что Node.js установлен правильно, и вы готовы начать работу с Node.js v20.

Node.js v20 уже доступен! Ознакомьтесь с моделью разрешений, синхронным import.meta.resolve, стабильным запуском тестов и другими интересными функциями и обновлениями здесь ️ Нажмите, чтобы твитнуть

Что нового в Node.js v20?

Давайте рассмотрим 5 основных обновлений, представленных в этом выпуске Node.js. Эти функции включают в себя:

Экспериментальная модель разрешений

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

Эта новая функция удобна, когда безопасность и использование ресурсов имеют решающее значение, например, в производственной среде.

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

Разработчики могут использовать такие флаги, как --allow-fs-read , --allow-fs-write и --allow-child-process , чтобы указать, какие ресурсы доступны. Чтобы активировать эти флаги, разработчикам необходимо использовать флаг --experimental-permission в сочетании с необходимыми разрешениями.

Вот пример того, как использовать модель разрешений, чтобы разрешить доступ для чтения и записи ко всей файловой системе:

 $ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

Разработчики также могут использовать модель разрешений для указания доступа к определенным папкам и файлам. Например, следующая команда разрешает запись в папку /tmp/ :

 $ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

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

 $ node --experimental-permission --allow-fs-read=/home/user/* index.js

Приведенная выше команда предоставляет доступ для чтения ко всем папкам внутри каталога /home/user/ .

Свойство разрешения объекта процесса также можно использовать для проверки того, было ли предоставлено конкретное разрешение во время выполнения. Например, если вы хотите проверить, имеет ли ваш процесс Node.js доступ для чтения к определенной папке /home/user/documents , вы можете использовать следующий код:

 if (process.permission.has('fs.read', '/home/user/documents')) { console.log('Read access granted to /home/user/documents'); } else { console.log('Read access not granted to /home/user/documents'); }

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

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

Стабильный тестировщик

Node.js v20 включает стабильную версию модуля test_runner, который позволяет разработчикам быстро и легко создавать и запускать наборы тестов JavaScript без установки дополнительных зависимостей.

Стабильный запуск тестов теперь включает в себя несколько строительных блоков, таких как describe , it / test и хуки, для создания и структурирования тестовых файлов, а также имитации, режима просмотра и возможности запускать несколько тестовых файлов параллельно с помощью node --test команда.

Вот пример того, как использовать средство запуска тестов:

 import { test, mock } from 'node:test'; import assert from 'node:assert'; import fs from 'node:fs'; mock.method(fs, 'readFile', async () => "Hello World"); test('synchronous passing test', async (t) => { // This test passes because it does not throw an exception. assert.strictEqual(await fs.readFile('a.txt'), "Hello World"); });

Средство запуска тестов предлагает настраиваемые и настраиваемые отчеты о тестах с помощью флага --test-reporter , покрытие экспериментальных тестов с помощью флага --experimental-test-coverage и возможности имитации.

Хотя стабильная программа запуска тестов не предназначена для замены полнофункциональных сред тестирования, таких как Jest или Mocha, она предлагает простой и быстрый способ создания наборов тестов. Он был значительно улучшен с момента его появления в Node.js v19, и благодаря тестированию и отзывам конечных пользователей он теперь отмечен как стабильный в Node.js v20.

Дополнительную информацию можно найти в этом объединенном запросе на вытягивание.

Движок JavaScript V8 обновлен до версии 11.3.

Движок JavaScript V8, на котором работает Node.js, был обновлен до версии 11.3 в Node.js v20. Это повышает производительность и вводит новые языковые функции. Некоторые из новых функций, которые включает это обновление:

  • String.prototype.isWellFormed и toWellFormed : эти методы особенно полезны для обеспечения правильного формата строки. Это помогает гарантировать, что введенная пользователем строка находится в правильном формате UTF-16, уменьшая количество ошибок в эпоху эмодзи.
  • Методы, которые изменяют Array и TypedArray путем копирования: это может быть полезно для создания измененных копий массивов, не затрагивая исходные данные, что особенно актуально в тех случаях, когда вам нужно сохранить исходные данные для сравнения или других целей.
  • Изменяемый размер ArrayBuffer и расширяемый SharedArrayBuffer : обеспечивает большую гибкость, позволяя более эффективно распределять память.
  • Флаг RegExp v с установленной нотацией и свойствами строк: добавляет функциональность для регулярных выражений.
  • Хвостовой вызов WebAssembly: предоставляет способ оптимизации определенных типов вызовов функций.

Эти обновления демонстрируют постоянную приверженность сообщества разработчиков Node.js повышению производительности и функциональности.

Синхронный импорт.meta.resolve()

В Node.js v20 был введен import.meta.resolve() , который упрощает написание скриптов, не зависящих от местоположения. Эта функция возвращается синхронно, аналогично поведению браузера, что обеспечивает более эффективное выполнение.

Обработчики разрешения пользовательского загрузчика по-прежнему могут быть определены как асинхронная функция, но import.meta.resolve() по-прежнему будет синхронно возвращаться для кода приложения, даже если загружены обработчики асинхронного разрешения.

Синхронное поведение import.meta.resolve() обеспечивает более эффективное выполнение кода, особенно при работе с большими объемами данных. Как автор, вы можете определить хуки разрешения как асинхронные или синхронизирующие функции, в зависимости от ваших предпочтений. Код приложения по-прежнему будет выполняться синхронно независимо от того, загружены ли асинхронные обработчики разрешения.

Экспериментальные одиночные исполняемые приложения (SEA)

Экспериментальные одиночные исполняемые приложения (SEA) — это новая функция, представленная в Node.js v20, которая позволяет связывать ваше приложение с двоичным файлом Node.js, позволяя конечным пользователям распространять и запускать его как один исполняемый файл.

Это был давний запрос от сообщества, и за последний год команда усовершенствовала подход.

В Node.js v20 для создания одного исполняемого приложения требуется внедрить большой двоичный объект, подготовленный Node.js, из конфигурации JSON, а не внедрить необработанный файл JS.

Большой двоичный объект — это файл, содержащий двоичные данные, в данном случае подготовленные Node.js, которые внедряются в двоичный файл. Это изменение было сделано для того, чтобы разрешить встраивание нескольких сосуществующих ресурсов в SEA, что открывает новые варианты использования.

Вот пример файла sea-config.json :

 { "main": "myscript.js", "output": "sea-prep.blob" }

При выполнении с командным node --experimental-sea-config sea-config.json большой двоичный объект записывается в файл sea-prep.blob , который затем можно внедрить в двоичный файл.

Функция SEA позволяет разработчикам распространять приложения Node.js, не требуя от пользователей установки Node.js. Функциональность была создана Даршаном Сеном, получившим награду «Выдающийся вклад от нового поступления» в рамках премии JavaScriptLandia Awards на OpenJS World.

Microsoft, член OpenJS Foundation, исследует эту функцию как способ уменьшить векторные атаки и расширить возможности архитектуры Node.js для лучшего взаимодействия. Хотя функция SEA все еще является экспериментальной, она представляет собой захватывающую новую разработку для сообщества Node.js.

Производительность

В Node.js v20 значительно улучшена среда выполнения, а вновь созданная группа разработчиков Node.js уделяет особое внимание производительности. Улучшения включают оптимизацию основных частей среды выполнения, таких как URL, fetch() и EventTarget .

Одним из заметных улучшений является снижение стоимости инициализации EventTarget , которая была сокращена вдвое, что привело к более быстрому доступу ко всем использующим его подсистемам. Кроме того, вызовы V8 Fast API использовались для повышения производительности таких API, как URL.canParse() и таймеры.

Еще одним конкретным изменением является включение обновленной версии 2.0 Ada, быстрого анализатора URL-адресов, соответствующего спецификации, написанного на C++.

Знаете ли вы, что Node.js v20 предлагает стабильный, нативный инструмент для запуска тестов? Время более эффективно тестировать свой код! Проверьте это ️ Нажмите, чтобы твитнуть

Краткое содержание

В этой статье вы узнали о некоторых основных функциях (экспериментальных и стабильных) и улучшениях, которые приносит Node.js v20, таких как улучшения движка JavaScript V8, производительности, запуска тестов и введения экспериментальной модели разрешений, а также приложений с однократным выполнением. .

Важно знать, что срок службы Node.js v14 прекратится в апреле 2023 года, поэтому рекомендуется начать планировать обновление до Node.js v18 (LTS) или vNode.js 20 (скоро будет LTS).

Хотели бы вы попробовать последнюю версию Node.js? Вы можете сделать это, развернув свое приложение Node.js на Kinsta и получив от нас свои первые 20 долларов. Мы уже поддерживаем Node.js v20, а это значит, что вы можете протестировать его новые функции и возможности, начиная с сегодняшнего дня.

Теперь твоя очередь! Какие функции или улучшения вы считаете наиболее интересными в Node.js v20? Есть ли какие-то важные из них, которые мы, возможно, упустили из виду? Дайте нам знать об этом в комментариях.