Streams

Тема дорожной карты · Node.js

Потоки — это первоклассная абстракция в среде выполнения Node.js для обработки данных, поступающих или производимых инкрементально с течением времени, обеспечивающая память-эффективную обработку больших файлов, сетевых ответов и конвейеров данных реального времени без загрузки целых наборов данных в память. Модуль stream Node.js определяет четыре основных типа потоков: Readable (источник), Writable (сток), Duplex (и чтение, и запись) и Transform (чтение-запись с модификацией данных), — все они наследуют от EventEmitter и разделяют общий механизм backpressure. Потоки Node.js широко используются в стандартной библиотеке — http.IncomingMessage является Readable, http.ServerResponseWritable, zlib.createGzip()Transform, а net.SocketDuplex, — что означает: понимание потоков открывает возможности для эффективного HTTP, файлового I/O и сжатия в серверной разработке. Утилита stream.pipeline() (и её вариант promises) является рекомендуемым способом соединения нескольких потоков в Node.js, поскольку обрабатывает распространение ошибок и освобождение ресурсов, тогда как старый метод pipe() требует ручной обработки ошибок во избежание утечек файловых дескрипторов. Потоки являются краеугольным камнем производительности экосистемы Node.js, а TypeScript-типизация потоков через @types/node предоставляет строго типизированные интерфейсы для всех событий и методов потоков.

Как это работает

Streams в Node — это unix-pipe-подобные абстракции для инкрементальных данных: Readable, Writable, Duplex, Transform. Используйте, когда данные большие (GB-файлы, сетевые загрузки) или бесконечные (логи, websockets). Современный Node поддерживает stream/promises и pipeline() для безопасной композиции с обработкой ошибок и cleanup. Web Streams API (ReadableStream, WritableStream) доступен с Node 18 — тот же shape, что в браузере.

Когда применять

Streams — когда payload может превысить RAM: загрузки файлов, большие выборки из БД, CSV-импорт. pipeline() (не сырой .pipe()) — чтобы ошибки пробрасывались, ресурсы закрывались. Для HTTP-ответов можно return res.pipe(stream) — forward без буферизации. Пропустите streams для маленьких in-memory данных — overhead API больше выгоды; берите buffer или string.

Типичные ошибки

Ловушки Streams: забытый backpressure (медленный consumer, быстрый producer = раздутая память); .pipe() без error-обработчиков (тихий провал); смешение object-mode и binary-mode streams; конверсия stream → Buffer ради JSON.parse (теряет смысл). for await (const chunk of stream) в современном Node — читается чище, чем event-обработчики.

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…