Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як Node.js підтримує Web Streams API?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Node.js реалізує стандартний WHATWG Web Streams API через модуль `node:stream/web` (`ReadableStream`, `WritableStream`, `TransformStream`) і надає методи `Readable.toWeb()` / `Readable.fromWeb()` для конвертації в обидва боки з класичними Node.js-потоками. **Ключове:** тіло вбудованого `fetch()` (`res.body`) - це вже `ReadableStream` веб-стандарту, тож той самий потоковий код працює і в браузері, і в Node.js.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняУ 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 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 потоки й назад.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.