Чем отличаются fs.readFile и fs.createReadStream?
Потоки и буферы
`readFile` загружает весь файл в память целиком, `createReadStream` читает его порциями.
Когда что выбрать
readFileудобен для небольших файлов: конфигов, шаблонов, JSON. Код проще, результат сразу весь.createReadStreamнужен для больших файлов и раздачи по сети: память расходуется по чанкам, ответ клиенту начинается сразу.
import { readFile } from 'node:fs/promises';
import { createReadStream } from 'node:fs';
import { pipeline } from 'node:stream/promises';
// Небольшой файл
const text = await readFile('./settings.json', 'utf8');
// Большой файл в HTTP-ответ
app.get('/video', async (req, res) => {
await pipeline(createReadStream('./video.mp4'), res);
});Подвохи
readFileна файле в гигабайты вызовет рост памяти и может упасть.- Для потока важно обработать ошибку: без
pipelineили обработчикаerrorона станет необработанным исключением. - Синхронные
readFileSyncблокируют Event Loop и допустимы только при старте приложения.
Коротко для собеседования
Малое читаем целиком, большое потоком. В обоих случаях используем асинхронный API.