Як 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- потік, що читає, перетворює й видає дані.
Приклад:
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:
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:
const res = await fetch('https://example.com/data');
const webStream = res.body; // це ReadableStream (Web API)Можна працювати з ним через методи Web Streams, наприклад pipeTo():
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 Streams | Web 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 потоки й назад.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.