Для чего в node.js есть Web Streams API и в чем разница с node:stream?nodejs-45

1. Web Streams API в Node.js

Назначение и происхождение

Web Streams API - это стандартизированный API для работы с потоками данных, который:

  • Пришел из веб-стандартов (WHATWG)
  • Предназначен для унификации работы с потоками между браузерами и Node.js
  • Предоставляет современный Promise-based интерфейс

Базовый пример использования

const { ReadableStream } = require('node:stream/web');

async function processStream() {
  const readable = new ReadableStream({
    start(controller) {
      controller.enqueue('Hello');
      controller.enqueue('Streams');
      controller.close();
    }
  });

  for await (const chunk of readable) {
    console.log(chunk); // 'Hello', затем 'Streams'
  }
}

2. Классический node:stream

Особенности оригинального модуля

node:stream (ранее require('stream')) - это:

  • Оригинальная потоковая реализация Node.js
  • EventEmitter-based подход
  • Более богатая история и интеграция с core-модулями

Пример использования

const { Readable } = require('node:stream');

const readable = new Readable({
  read() {
    this.push('Hello');
    this.push('Classic');
    this.push(null);
  }
});

readable.on('data', (chunk) => {
  console.log(chunk.toString());
});

3. Ключевые различия

Критерий Module-Based Process-Based
Область видимостиЛокальная модуляГлобальная процесса
БезопасностьВысокаяНизкая
Доступ к даннымТолько через экспортПрямой доступ
ИспользованиеДля основной логикиДля конфигурации
ТестируемостьЛегко тестироватьСложнее тестировать

4. Когда что использовать?

Web Streams API предпочтительнее для:

  1. Кросс-платформенного кода (работает и в браузере)
  2. Интеграции с современными веб-API (Fetch, Service Workers)
  3. Когда нужен Promise-based интерфейс
  4. Работы с async итераторами

node:stream лучше подходит для:

  1. Работы с legacy-кодом
  2. Интеграции с core-модулями Node.js (fs, http)
  3. Когда нужен более низкоуровневый контроль
  4. Специфичных Node.js оптимизаций

5. Совместимость и конвертация

Конвертация между API

const { Readable } = require('node:stream');
const { ReadableStream } = require('node:stream/web');

// Из Node.js Stream в Web Stream
const nodeReadable = new Readable();
const webReadableStream = Readable.toWeb(nodeReadable);

// Из Web Stream в Node.js Stream
const webStream = new ReadableStream();
const nodeStream = Readable.fromWeb(webStream);

6. Производительность и особенности

Web Streams API:

  • Более современный и стандартизированный подход
  • Лучше для интеграции с веб-платформой
  • Меньше контроля над внутренней механикой

node:stream:

  • Более зрелая и отлаженная реализация
  • Лучшая интеграция с экосистемой Node.js
  • Больше возможностей для тонкой настройки

7. Практические рекомендации

  1. Новые проекты: Рассмотрите Web Streams API для будущей совместимости
  2. Существующий код: Продолжайте использовать node:stream для поддержки
  3. Миксы: Используйте методы конвертации для постепенного перехода
  4. Библиотеки: Для универсальных библиотек поддерживайте оба API

Резюмируем:

Web Streams API и node:stream представляют два подхода к работе с потоками в Node.js. Web Streams API предлагает стандартизированное, современное и кросс-платформенное решение, в то время как node:stream дает более глубокий контроль и лучше интегрируется с существующей экосистемой Node.js. Выбор между ними должен основываться на требованиях проекта, необходимости кросс-платформенности и используемых зависимостях.