Проект Node.js выпустил версию 26.5.0 — очередной релиз «текущей» ветки (Current — ветка, где обкатываются новые возможности перед долгосрочной поддержкой). На первый взгляд это рядовое минорное обновление, но под капотом собрано сразу несколько давно ожидаемых вещей: импорт текстовых файлов напрямую как модулей, потоковое чтение объектов Blob, штатное раздвоение потоков и наблюдаемость пост-квантового TLS. Разберёмся, что именно поменялось и почему на это стоит обратить внимание.
Что за релиз и почему он важен
Версия 26.5.0 вышла 8 июля 2026 года под управлением релиз-менеджера Ричарда Лау (Richard Lau). Это ветка Current: в ней Node.js обкатывает свежие API, прежде чем «заморозить» их в LTS (Long-Term Support — версия с долгосрочной поддержкой, которую принято ставить в продакшн). По графику проекта чётные мажорные версии со временем переходят в статус LTS, и Node.js 26 должен получить его уже в октябре 2026-го. Иными словами, возможности, которые появляются сейчас, совсем скоро окажутся в версии, рекомендованной для промышленной эксплуатации, — поэтому знакомиться с ними имеет смысл заранее.
Отдельно в релизе отмечена смена подписанта сборок: артефакты будущих версий теперь заверяются ключом Стюарта Эддисона (Stewart X Addison). Деталь техническая, но важная для тех, кто проверяет цифровые подписи пакетов на этапе сборки и в защищённых пайплайнах.
Импорт текстовых файлов как модулей
Самая заметная новинка — экспериментальный флаг --experimental-import-text. Он разрешает импортировать обычный текстовый файл прямо в ES-модуль и получать его содержимое как строку, без обращения к файловой системе в рантайме:
// запуск: node --experimental-import-text app.mjs
import readme from './readme.txt' with { type: 'text' };
console.log(readme); // содержимое файла как обычная строка
Синтаксис повторяет уже привычный импорт JSON через «атрибуты импорта» (import attributes) — конструкцию with { type: '...' }. Раньше, чтобы подтянуть в код SQL-запрос, шаблон письма, GraphQL-схему или лицензию, приходилось вызывать fs.readFile и вручную разбираться с путями и асинхронностью. Теперь текст становится частью графа модулей: его видно сборщику, он резолвится по тем же правилам, что и остальные импорты, и доступен синхронно на верхнем уровне модуля.
Важная оговорка: возможность намеренно оставлена экспериментальной. Один из мейнтейнеров, Джеффри Бут (Geoffrey Booth), настоял держать её под флагом, пока не устоятся совместимость с браузерами и поведение в npm-пакетах — это соответствует практике TC39 (комитет, стандартизирующий JavaScript). Поэтому в продакшене на неё пока полагаться рано, но попробовать в инструментах и прототипах уже можно.
Потоковое чтение Blob: textStream()
Второе нововведение — метод Blob.prototype.textStream(), который возвращает ReadableStream<string>, то есть поток уже декодированных из UTF-8 строковых фрагментов. До сих пор у Blob были методы text() и arrayBuffer(), но оба загружают всё содержимое в память целиком. Для больших файлов это дорого и рискованно.
const blob = await fetch('/big-log.txt').then(r => r.blob());
for await (const chunk of blob.textStream()) {
// обрабатываем текст по кускам, не держа весь файл в памяти
process(chunk);
}
На практике это упрощает потоковую обработку журналов, выгрузок и пользовательских загрузок: можно читать и парсить данные по мере поступления, а не после полной загрузки. Автор изменения — Мэтью Эйткен (Matthew Aitken).
ReadableStream.tee(): раздвоение потока из коробки
Node.js теперь штатно отдаёт функцию ReadableStream.tee() из стандарта WHATWG Streams. Она «раздваивает» один читаемый поток на два независимых, каждый из которых можно потреблять отдельно. Классический сценарий — прочитать данные один раз, но пустить их сразу по двум маршрутам: например, одновременно считать хеш файла и записать его в хранилище, или залогировать сырой ответ и тут же его распарсить.
const [a, b] = readable.tee();
// a — считаем контрольную сумму
// b — пишем в файл, оба потока независимы
Раньше подобное приходилось собирать вручную или тянуть сторонние зависимости. Теперь поведение соответствует спецификации и работает так же, как в браузере. Изменение внёс Маттео Коллина (Matteo Collina), один из ключевых мейнтейнеров ядра.
Пост-квантовый TLS стал наблюдаемым
Метод tlsSocket.getEphemeralKeyInfo() теперь сообщает, какая именно группа ключевого обмена (TLS group) была согласована при рукопожатии, — включая пост-квантовые варианты вроде ML-KEM и гибридные схемы. Пост-квантовая криптография (устойчивая к атакам будущих квантовых компьютеров) постепенно приходит в TLS, и до сих пор проверить из кода, что соединение действительно использует квантово-устойчивый обмен ключами, было непросто.
Теперь это делается штатно: приложение или система мониторинга может убедиться, что защищённые соединения переходят на новые алгоритмы, и вовремя заметить, если клиент или сервер откатились на классический обмен. Для команд, которые уже планируют миграцию инфраструктуры на пост-квантовые протоколы, это конкретный инструмент контроля. Автор — Филип Скокан (Filip Skokan).
Точные метрики цикла событий
Функция monitorEventLoopDelay() получила опцию samplePerIteration. Раньше задержку цикла событий (event loop — механизм, обрабатывающий асинхронные задачи в Node.js) измеряли по таймеру, что давало приближённую картину. Новый режим снимает реальные показания libuv на каждой итерации цикла, а не через фиксированные интервалы.
Для диагностики это ощутимая разница: всплески задержек, из-за которых сервис «подтормаживает» под нагрузкой, теперь видно точнее, и их проще привязать к конкретным участкам кода. Изменение предложил Пабло Эрхард (Pablo Erhard).
Что ускорили под капотом
Помимо новых API, релиз заметно оптимизирует внутреннюю кухню. Метод TextEncoder.encode() перестал копировать исходную строку — это снижает нагрузку на память и ускоряет кодирование, особенно на «горячих» путях обработки текста (автор — Ягыз Низипли, Yagiz Nizipli). Реализация WHATWG-потоков уменьшила накладные расходы на каждый чанк. А REPL (интерактивная консоль Node.js) стал стартовать быстрее за счёт ленивой загрузки парсера acorn и отложенного создания контекста виртуальной машины (Дайдзиро Ваки, Daijiro Wachi).
Вошли и штатные исправления безопасности и стабильности — в частности, в криптографии (валидация больших генераторов Диффи — Хеллмана и проверка точек EdDSA) и в обработке сигналов прерывания у потоков.
Стоит ли обновляться
Node.js 26.5.0 — релиз ветки Current, поэтому у него две аудитории. Тем, кто разрабатывает инструменты, экспериментирует с потоками и хочет пораньше пощупать импорт текста, обновление даёт заметный набор удобств прямо сейчас. Тем, кто держит продакшен на текущем LTS (сейчас это линейка Node.js 24), спешить необязательно: экспериментальные флаги ещё могут поменять поведение, а сама ветка станет LTS только к октябрю. Разумная стратегия — обкатать новинки в тестовом окружении и на CI, чтобы к моменту перехода 26-й версии в LTS уже понимать, какие из возможностей вы готовы включить в боевую сборку.
Частые вопросы
По графику проекта Node.js 26 (чётная мажорная версия) должен перейти в статус LTS в октябре 2026 года. До этого момента 26.x — это ветка Current, где обкатываются новые API. Текущий LTS на момент выхода 26.5.0 — линейка Node.js 24.
Нужно запустить Node.js с экспериментальным флагом --experimental-import-text, после чего .txt-файл можно импортировать через синтаксис атрибутов импорта: import readme from './readme.txt' with { type: 'text' }. Возможность экспериментальная и в продакшене пока не рекомендуется.
Метод text() загружает всё содержимое Blob в память целиком, а textStream() возвращает ReadableStream строк и позволяет читать данные по частям. Для больших файлов это снижает потребление памяти и даёт возможность обрабатывать текст по мере поступления.
Он показывает, какая группа ключевого обмена согласована при TLS-рукопожатии, включая пост-квантовые ML-KEM и гибридные схемы. Это позволяет из кода или мониторинга убедиться, что соединения используют квантово-устойчивый обмен ключами, и заметить откат на классические алгоритмы.
Источники
- 1.Node.js — Node.js 26.5.0 (Current), официальный блогhttps://nodejs.org/en/blog/release/v26.5.0
- 2.Release 2026-07-08, Version 26.5.0 (Current) — nodejs/node (GitHub)https://github.com/nodejs/node/releases/tag/v26.5.0
- 3.Node.js v26.5.0 Released With Experimental Text Imports and Blob Streaming — linuxcompatible.orghttps://www.linuxcompatible.org/story/nodejs-v2650-released-with-experimental-text-imports-and-blob-streaming



