5 августа 2026 года команда Node.js выпустила обновление до версии 26.7.0, которое добавило новые функции в ветку Current. Среди нововведений — возможность загрузки закрытых ключей через OpenSSL STORE, интеграция трассировки Perfetto, автоматическая очистка модульных хуков и учёт файлов, которые не были покрыты тестами. Версия 26 предназначена для тестирования и раннего внедрения новых возможностей, а официальной долгосрочной поддержкой (LTS) продолжает оставаться Node.js 24.19.0.

Node.js 26.7.0 собрал четыре функции вокруг контроля и наблюдаемости
В официальном журнале Node.js 26.7.0 перечислены четыре заметных изменения: поддержка OpenSSL STORE для закрытых ключей, трассировка Perfetto, Symbol.dispose в ModuleHooks и флаг --test-coverage-include-all. Вместе они закрывают разные этапы работы серверного приложения — от хранения криптографических ключей до поиска узких мест и проверки качества тестов.
Релиз получился техническим, и его эффект легче увидеть через конкретные сценарии:
| Область | Прежнее поведение | Поведение в Node.js 26.7.0 | Практический эффект |
| Закрытые ключи | Node.js принимал ключевой материал в форматах PEM, DER, JWK и других поддерживаемых представлениях | API криптографии принимает URL и обращается к настроенным OpenSSL STORE loaders | Ключ может оставаться в файле, аппаратном токене или внешнем хранилище, управляемом провайдером OpenSSL |
| Трассировка | Диагностика опиралась на существующий механизм trace events и инструменты Inspector | Сборка Node.js может записывать трассы Perfetto в формате .pftrace | Временная шкала событий открывается в интерфейсе Perfetto и связывает работу Node.js с системными событиями |
| Модульные хуки | Хуки, зарегистрированные через registerHooks(), снимались вызовом deregister() | Объект ModuleHooks поддерживает Symbol.dispose | Конструкция using автоматически снимает хук при выходе из области видимости |
| Покрытие тестами | Отчёт видел исходные файлы, которые загрузились во время тестового запуска | Новый флаг добавляет подходящие незагруженные файлы с покрытием 0% | Отчёт показывает модули, до которых тесты вообще не дошли |
Основной интерес вызывает масштаб нововведений. Версия Node.js 26.7.0 делает внутреннее состояние приложения более очевидным: она показывает, где находится ключ, какой фрагмент кода был выполнен, когда сработал хук и какие файлы не были включены в тесты.
OpenSSL STORE подключает Node.js к аппаратным и внешним хранилищам ключей
Самое прикладное изменение релиза затрагивает node:crypto. Функции crypto.createPrivateKey(), crypto.sign(), crypto.privateDecrypt(), crypto.diffieHellman() и crypto.decapsulate() получили возможность загружать закрытые ключи через настроенные OpenSSL STORE loaders. В качестве ссылки используется объект WHATWG URL.
В простом случае источником может быть файл:
import { createPrivateKey } from 'node:crypto';
const key = createPrivateKey(
new URL('file:///path/to/private-key.pem'),
);Более интересный сценарий связан с PKCS#11 — стандартным интерфейсом для аппаратных модулей безопасности и криптографических токенов:
import { createPrivateKey, sign } from 'node:crypto';
const key = createPrivateKey({
key: new URL('pkcs11:token=node;object=signing-key;type=private'),
passphrase: process.env.PKCS11_PIN,
properties: 'provider=pkcs11',
});
const signature = sign('sha256', Buffer.from('payload'), key);Этот пример взят из описания изменения в репозитории Node.js. Провайдер STORE должен быть заранее загружен в стандартный контекст OpenSSL. Сам API Node.js провайдеры не подключает.
Смысл функции хорошо виден в платёжных системах, центрах сертификации и сервисах электронной подписи. Закрытый ключ может оставаться внутри HSM или токена, а приложение получает объект KeyObject для подписи и других операций. Возможность экспорта ключа и допустимый набор операций по-прежнему определяет провайдер.
Поддержка STORE требует OpenSSL 3 или новее. Для модели разрешений появился отдельный доступ openssl.store, который включается параметром --allow-openssl-store. Такое разрешение охватывает широкие возможности: конкретный loader способен обращаться к файлам, устройствам, токенам или сети. Ограничения fs.read, fs.write и net на его внутренние операции не распространяются.
Node.js скрывает URI в собственных сообщениях об отказе разрешения. Ошибки OpenSSL или стороннего провайдера после начала загрузки всё ещё могут содержать адрес ресурса. Поэтому механизм затрагивает сразу две темы — удобное подключение внешнего ключа и границы доверия к OpenSSL-конфигурации.
Perfetto добавляет временную шкалу для сложной диагностики
Node.js 26.7.0 получил поддержку Perfetto — системы трассировки, созданной для анализа событий на временной шкале. Она помогает увидеть, в какой последовательности работали подсистемы, сколько времени заняли операции и где возникли задержки.
Поддержка включается при сборке Node.js флагом:
./configure --with-perfettoПри активной трассировке среда создаёт файлы вида node_trace.1.pftrace. Они используют бинарное кодирование Protocol Buffers и открываются в веб-интерфейсе Perfetto. JSON-вывод для этого режима разработчики намеренно не добавляли.
В обсуждении реализации Perfetto зафиксировано текущее ограничение: при сборке с Perfetto отключается трассировка через Inspector. Для передачи бинарных данных через Inspector потребуется изменение протокола, которого в этом релизе ещё нет.
Чем такая трасса отличается от обычного журнала? Лог показывает отдельные сообщения. Временная шкала связывает события по времени и длительности. В сервере с большим числом запросов это позволяет сопоставить паузу сборщика мусора, работу JavaScript, системный ввод-вывод и другие категории событий в одном представлении.
Поддержка Perfetto ориентирована прежде всего на разработчиков Node.js, авторов нативных модулей и команды, которые исследуют редкие задержки. Для большинства приложений она пока остаётся инструментом специальной сборки, поскольку стандартные готовые бинарные пакеты зависят от параметров, выбранных проектом при компиляции.
ModuleHooks теперь очищаются через конструкцию using
API module.registerHooks() позволяет вмешиваться в загрузку модулей: менять разрешение путей, обработку исходного кода и другие этапы. Раньше возвращаемый объект предоставлял метод deregister(), который снимал зарегистрированные хуки вручную.
В Node.js 26.7.0 класс ModuleHooks реализует [Symbol.dispose] как эквивалент deregister(). Благодаря этому хук совместим с конструкцией using:
import { registerHooks } from 'node:module';
{
using hooks = registerHooks({
resolve(specifier, context, nextResolve) {
return nextResolve(specifier, context);
},
});
// В этой области хук активен.
}
// После выхода из блока вызывается Symbol.dispose,
// и зарегистрированный хук снимается.Автор изменения описывает Symbol.dispose как псевдоним deregister. Механизм делает срок жизни хука частью структуры кода: фигурная скобка определяет момент очистки без отдельного вызова в конце блока.
Такой подход полезен для тестов, инструментов сборки и временных преобразований модулей. Например, тест может зарегистрировать специальный resolver только на время одного сценария. После завершения блока следующий тест не наследует этот хук из-за забытого deregister().
Функция продолжает общую линию JavaScript на явное управление ресурсами. В роли ресурса здесь выступает зарегистрированное поведение процесса, которое сохранялось бы до завершения Node.js.
Отчёт покрытия показывает файлы, которые тесты ни разу не загрузили
Встроенный test runner получил параметр --test-coverage-include-all. Его задача проста: добавить в отчёт подходящие исходные файлы, которые тестовый запуск ни разу не импортировал. Для таких файлов отображается покрытие 0%.
До появления флага отчёт мог создавать обманчиво аккуратную картину. Допустим, в каталоге src лежат десять модулей, а тесты загрузили восемь. Статистика рассчитывалась по загруженному коду, и два полностью забытых модуля могли не попасть в итоговую таблицу.
Новый режим ищет кандидатов в текущем рабочем каталоге. К ним применяются те же фильтры --test-coverage-include и --test-coverage-exclude, которые управляют остальной частью отчёта. Такое поведение описано в pull request тестового раннера.
Базовый запуск выглядит так:
node --test --experimental-test-coverage --test-coverage-include-allФункция покрытия в Node.js сохраняет экспериментальный статус. Новый параметр расширяет существующий механизм и делает нулевое покрытие видимым для локального запуска и CI. Особенно заметен эффект в проектах, где новые модули могут появиться без тестового импорта и долго оставаться за пределами статистики.
Криптография и сетевой слой получили серию точечных исправлений
Помимо четырёх функций, журнал коммитов Node.js 26.7.0 содержит обновления зависимостей и исправления низкоуровневых подсистем. Корневые сертификаты обновлены до набора NSS 3.125, npm — до версии 11.19.0, nghttp2 — до 1.70.0, SQLite — до 3.53.4.
В криптографическом коде исправлена работа Argon2 в режиме FIPS, сохранение ошибок OpenSSL при сбоях KDF, проверка параметров генерации ключей и обработка сбоев операций Диффи — Хеллмана. В TLS скорректирован выбор сертификата через SNICallback. Отдельный коммит устраняет утечку, связанную с AbortSignal.any().
Проект не пометил Node.js 26.7.0 как отдельный security release и не связал перечисленные изменения с новыми CVE в заметке о выпуске. Здесь уместна точная формулировка: обычный Current-релиз включает несколько исправлений в коде, который отвечает за криптографию, TLS и управление памятью.
Набор зависимостей показывает ещё одну особенность Node.js. Среда выполнения объединяет JavaScript-движок V8, сетевые библиотеки, OpenSSL, npm, SQLite и другие компоненты. Минорный релиз поэтому способен менять как видимые API, так и детали протоколов и сборки.
Ветка Current отделяет новые функции от стабильной LTS-линии
Node.js 26.7.0 имеет статус Current. Согласно официальной политике выпусков, крупные версии до Node.js 26 проводят шесть месяцев в Current, после чего чётные ветки переходят в LTS. Проект относит производственные приложения к веткам Active LTS и Maintenance LTS.
На 6 августа 2026 года сайт Node.js показывает две разные вершины линейки:
- Node.js 26.7.0 — последний Current-релиз;
- Node.js 24.19.0 — последняя LTS-версия с кодовым именем Krypton.
Разделение влияет на аудиторию обновления. Node.js 26.7.0 первым показывает новые API и изменения диагностических инструментов. Node.js 24 остаётся линией длительной поддержки для систем, где предсказуемый цикл исправлений имеет больший вес.
Появление функций в Current не гарантирует их немедленный перенос в LTS. Решение зависит от обратной совместимости, зрелости реализации и правил backport. Поэтому сроки появления OpenSSL STORE, Perfetto или --test-coverage-include-all в ветке 24.x пока нельзя вывести из самого релиза 26.7.0.
Релиз оставляет открытыми вопросы о переносе функций в LTS
На данный момент подтверждены четыре новых возможности Node.js 26.7.0 и ряд исправлений в криптографии, TLS, зависимостях и диагностике. Версия опубликована 5 августа 2026 года, имеет статус Current и доступна в официальных сборках для Windows, macOS, Linux, AIX и ARM64.
На данный момент нет ясности относительно сроков переноса backport в Node.js 24 LTS. В сообщении о выпуске отсутствует расписание этих изменений. У Perfetto по-прежнему есть ограничение на совместимость с трассировкой Inspector, а OpenSSL STORE требует наличия предварительно настроенного провайдера OpenSSL 3 и широкого разрешения openssl.store.
В новой версии Node.js 26 значительно расширены возможности для управления ключами, жизненного цикла хуков, временной диагностики и полноты тестовых отчетов. Скорость внедрения этих функций в рабочие среды будет зависеть от дальнейших обновлений и перехода ветки 26 в статус долгосрочной поддержки (LTS).