Для чего нужны классы Blob и File из node:buffer?nodejs-46

1. Класс Blob

Основное назначение

Blob представляет собой неизменяемый объект для работы с бинарными данными, который:

  • Хранит сырые данные в буфере
  • Может содержать данные разных типов (текст, изображения и т.д.)
  • Поддерживает "нарезку" (slicing) без копирования данных

Создание и использование

const { Blob } = require('node:buffer');

// Создание Blob из текста
const textBlob = new Blob(['Hello, Node.js!'], { type: 'text/plain' });

// Создание Blob из бинарных данных
const binaryBlob = new Blob([new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f])]);

Основные методы

  • slice() - создает новый Blob, содержащий часть данных
  • arrayBuffer() - возвращает Promise с ArrayBuffer
  • text() - возвращает Promise с текстовым содержимым
  • stream() - возвращает ReadableStream

2. Класс File

Особенности и отличие от Blob

File наследуется от Blob и добавляет:

  • Имя файла (name)
  • Метаданные о времени последнего изменения (lastModified)
  • Информацию о пути (webkitRelativePath в браузерах)

Создание File объекта

const { File } = require('node:buffer');

const file = new File(
  ['File content'],
  'example.txt',
  {
    type: 'text/plain',
    lastModified: Date.now()
  }
);

3. Основные сценарии использования

1. Работа с Fetch API

const blob = new Blob(['{"data": "example"}'], { type: 'application/json' });

fetch('https://api.example.com', {
  method: 'POST',
  body: blob
});

2. Эмуляция файловых операций браузера

// Создание файла для тестирования
const testFile = new File(['test content'], 'test.txt');

// Эмуляция загрузки файла
formData.append('file', testFile, 'test.txt');

3. Потоковая обработка данных

async function processBlob(blob) {
  const stream = blob.stream();
  for await (const chunk of stream) {
    console.log('Received chunk:', chunk);
  }
}

4. Интеграция с другими API Node.js

Преобразование в Buffer

const blob = new Blob(['Node.js']);
blob.arrayBuffer()
  .then(buf => Buffer.from(buf))
  .then(buffer => console.log(buffer.toString()));

Работа с файловой системой

const { Blob } = require('node:buffer');
const { writeFile } = require('node:fs/promises');

const blob = new Blob(['File content']);
blob.arrayBuffer()
  .then(buf => writeFile('output.txt', Buffer.from(buf)));

5. Отличия от Buffer

Характеристика AsyncResource AsyncLocalStorage
Уровень контроляНизкоуровневыйВысокоуровневый
СложностьВышеПроще
ИспользованиеДля библиотекДля прикладного кода
ПроизводительностьБолее затратенОптимизирован

6. Ограничения и особенности

  1. Размер: Blob может быть больше, чем максимальный размер Buffer
  2. Производительность: Для частых операций Buffer может быть эффективнее
  3. Совместимость: Blob/File лучше для кода, который должен работать и в браузере
  4. Методы: Не все методы Blob доступны в Node.js (например, URL.createObjectURL)

Резюмируем:

Классы Blob и File в Node.js предоставляют Web-совместимый API для работы с бинарными данными, особенно полезный при:

  • Интеграции с браузерными API
  • Работе с Fetch и другими веб-стандартами
  • Эмуляции файловых операций браузера
  • Создании универсального кода для сервера и клиента

Хотя Buffer остается основным инструментом для работы с бинарными данными в Node.js, Blob и File незаменимы для сценариев, требующих совместимости с веб-стандартами.