Node.js 26.5.0 уже доступна. Это текущий выпуск (Current), а не LTS-ветка, поэтому он находится на переднем крае возможностей платформы. Это различие имеет значение. Не стоит слепо внедрять её в производственные среды, где ожидается восемнадцать месяцев стабильности. Но именно в таких небольших, быстрых релизах можно увидеть, как формируется будущее. Они показывают, какие API разработчики доводят до совершенства и в каком направлении движется среда выполнения (runtime). В версии 26.5.0 основная работа сосредоточена в Web Streams API: пара точечных исправлений приближает Node к паритету с браузерами. Релиз также устраняет два недочёта в слоях работы с файловой системой и URL.
Зачем в Node.js нужны Web Streams?
Если вы какое-то время писали потоковый код в Node, то знаете, что встроенный модуль stream обладает своим характером. Readable, Writable, Transform и Duplex годами были «рабочими лошадками» экосистемы. Они мощные, но они не такие, как потоки, с которыми вы сталкиваетесь в браузере. Когда вы пытаетесь разделить логику между сервис-воркером на фронтенде и обработчиком маршрутов на бэкенде, этот разрыв создает трение. В итоге вам приходится переписывать адаптеры, копировать данные в непривычные форматы или вовсе избегать общего кода.
Web Streams API существует именно для того, чтобы устранить этот разрыв. Это тот же стандарт, который управляет обработкой тела fetch в браузере. Перенося его в Node, проект позволяет вам написать логику потоков один раз и запускать её в любой из сред. API работает с объектами ReadableStream, WritableStream и TransformStream, которые передают чанки через унифицированный интерфейс. Версия 26.5.0 не переписывает этот интерфейс, но «подтягивает два важных болта».
Исправление releaseLock и оптимизация BYOB-ридеров
Одним из конкретных изменений в этом релизе является исправление метода releaseLock в WritableStreamDefaultWriter. В модели Web Streams блокировка писателя (writer lock) предотвращает одновременное вмешательство нескольких потребителей в один и тот же поток. Когда вы вызываете releaseLock(), вы сигнализируете о том, что ваш писатель закончил работу и базовый поток свободен для следующей операции. Ошибочная реализация может оставить поток в неопределенном состоянии: он будет считать, что всё еще находится в использовании, хотя писатель уже исчез. На нагруженном сервере, парсящем загрузки или перенаправляющем данные в хранилище, такая «зависшая» блокировка может остановить конвейер или вызвать ошибки, которые трудно отследить до источника. Исправление в 26.5.0 снова делает передачу управления предсказуемой.
Второе изменение в Web Streams улучшает работу ReadableStream и TransformStream с BYOB-ридерами. BYOB расшифровывается как Bring Your Own Buffer («принеси свой собственный буфер»). Вместо того чтобы выделять новый фрагмент памяти каждый раз при передаче данных, поток получает буфер, который вы уже подготовили. Поток заполняет этот буфер, вы обрабатываете байты, а затем возвращаете тот же буфер для повторного использования. Это небольшое механическое различие дает колоссальные результаты при перемещении больших объемов данных.
Node поддерживает BYOB уже некоторое время, но в пограничных случаях ReadableStream и TransformStream могли работать некорректно при подключении BYOB-ридера. Детали исправления менее важны, чем практический результат: потоки, использующие явные буферы, теперь работают более надежно как на этапе чтения, так и на этапе трансформации. Если вы избегали BYOB-ридеров из-за странных ошибок при возникновении обратного давления (backpressure), этот релиз убирает еще один повод держаться от них подальше.
Где на самом деле применяется BYOB
Легко рассуждать о повторном использовании буферов в абстрактных терминах. Полезнее подумать о том, где это действительно важно.
Представьте, что вы пишете сервис, принимающий телеметрию. Эти загрузки могут представлять собой сжатые логи или дампы необработанных данных с датчиков, каждый объемом в несколько сотен мегабайт. Если поток будет выделять новый Node Buffer для каждого фрагмента данных, сборщик мусора (garbage collector) будет работать на износ, а скачки потребления памяти будут быстро расти. С BYOB-ридером вы выделяете небольшой пул буферов при запуске. Поток заполняет их, ваш парсер вычитывает их, и они возвращаются в цикл. Потребление памяти остается стабильным. Тот же принцип применим при проксировании сетевого трафика между двумя сокетами или построчном парсинге больших CSV-файлов без загрузки всего файла в оперативную память (RAM).
Transform streams are equally important here. A TransformStream sits in the middle of a pipeline, perhaps decompressing a gzip stream or encrypting chunks on the fly. If the transform step mishandles BYOB buffers, you can see corrupted output, dropped chunks, or stalls under load. The 26.5.0 fixes address exactly those kinds of pipeline hiccups, which is why anyone running high-throughput I/O should pay attention.
The Quiet Wins: File System and Error Clarity
Not everything in 26.5.0 is about streaming. The release also fixes behavior in fs.rm and fs.rmSync when the recursive option is set to false. Previously, passing recursive: false alongside a directory path could produce unexpected results during cleanup. The method might act in ways that did not match the explicit intent of the caller, deleting more than expected or failing in inconsistent ways depending on the platform. Cleaning up files is the sort of operation that should be boring and predictable. Boring is good. This fix restores that predictability, so your temporary directory cleanup scripts or deployment teardown logic behave exactly as the code suggests.
There is also a quality-of-life improvement in how URL.canParse reports failure. The method checks whether a string is a valid URL without throwing on malformed input. In 26.5.0, it now carries better Error.cause information when something goes wrong. Rather than swallowing the original reason, the error object preserves a causal chain. That means when a URL parse fails deep inside a validation helper, the stack you log tells you whether the issue was a bad protocol, a missing hostname, or some other structural problem. You spend less time sprinkling manual debug logs across every call site.
Should You Upgrade?
The answer depends on what you are running.
If your production workloads sit on an LTS version such as the v20.x line, stay there. These fixes will eventually backport or arrive in the next active LTS. Stability and predictable support timelines outweigh the benefit of a slightly smoother stream lock or clearer URL error on a server that is already working.
If you are building a new service, prototyping a real-time data pipeline, or actively using the Web Streams API for performance-critical I/O, 26.5.0 is worth the jump. The incremental alignment between Node streams and browser Web Streams is not just a compatibility win. It is a bet on a more unified JavaScript runtime where the same data-pushing logic can travel between server and client without translation layers. That cuts down on cognitive load and reduces the surface area for bugs when your team ships code to both environments.
This release is small, but the direction is clear. Node is continuing to invest in standards-based APIs that work everywhere JavaScript runs. The Web Streams improvements are not headline features, but they smooth out a path that has been rocky for years. Grab 26.5.0 if you live on the Current line, and watch for these fixes to land in your LTS world when the time is right.
Source: Dev.to – Node.js 26.5.0: What's New for Web Streams and Error Handling
Join the discussion and keep learning with the GyaanSetu community on Telegram.
