Skip to main content

Як Node.js підтримує Web Streams API?

У Node.js Web Streams API - це реалізація стандартного WHATWG Streams, яка робить Node-потоки сумісними з потоками, що використовуються в браузерах. Це дозволяє писати єдиний код для роботи з потоками, який працюватиме однаково і в Node.js, і в браузері.

Коли з'явилася підтримка

  • Уперше Web Streams з'явилися в Node.js v16.5 як експериментальна функція.
  • Починаючи з Node.js v21, вони повністю стабільні й доступні через модуль node:stream/web.

Основні класи Web Streams

Node.js реалізує стандартні класи Web Streams:

  • ReadableStream - потік для читання даних;
  • WritableStream - потік для запису;
  • TransformStream - потік, що читає, перетворює й видає дані.

Приклад:

javascript
import { ReadableStream } from 'node:stream/web'; const stream = new ReadableStream({ start(controller) { controller.enqueue('Hello, '); controller.enqueue('Web Streams!'); controller.close(); }, }); const reader = stream.getReader(); while (true) { const { value, done } = await reader.read(); if (done) break; console.log(value); }

Сумісність із потоками Node.js

Node.js надає спеціальні методи для конвертації між класичними потоками Node.js (stream.Readable, stream.Writable) і Web Streams:

javascript
import { Readable, Writable } from 'node:stream'; // Node.js → Web Stream const webReadable = Readable.toWeb(fs.createReadStream('input.txt')); // Web Stream → Node.js const nodeReadable = Readable.fromWeb(webReadable);

Те саме працює і для Writable, і для Transform потоків. Це дозволяє поєднувати старий і новий API в одному коді.

Робота з fetch() і Web Streams

Node.js із версії 18 включає вбудований fetch, і його тіло (res.body) - це Web ReadableStream:

javascript
const res = await fetch('https://example.com/data'); const webStream = res.body; // це ReadableStream (Web API)

Можна працювати з ним через методи Web Streams, наприклад pipeTo():

javascript
await webStream.pipeTo(new WritableStream({ write(chunk) { console.log('Отримано chunk:', chunk); }, }));

Навіщо це потрібно

  • Сумісність із браузерами - тепер можна писати той самий потоковий код для фронтенда й бекенда.
  • Сучасний API - заснований на промісах, підтримує pipeTo, pipeThrough, getReader(), cancel(), і легко поєднується з async/await.
  • Міграція - можна поступово переходити від Node.js потоків до Web Streams без повного переписування коду.

Відмінності від класичних потоків Node.js

ОсобливістьNode.js StreamsWeb Streams
МодельПодієва (on('data'), pipe())Асинхронна (pipeTo, for await...of)
Керування потокомЧерез backpressure автоматичноЧерез контролери (controller.enqueue(), desiredSize)
СтандартNode.js-специфічнийWHATWG (браузерний стандарт)
Підтримка fetch()НемаєТак
Підтримка промісівЧастковаПовна

Підсумок

Web Streams API у Node.js - це сучасна, стандартизована реалізація потоків, сумісна з браузерною моделлю. Вона працює через модуль node:stream/web, повністю підтримує ReadableStream, WritableStream, TransformStream, і дозволяє вільно перетворювати їх у класичні Node.js потоки й назад.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.