Що робить модуль fs у Node.js?
1. Що таке модуль fs
fs(File System) - вбудований модуль Node.js, який дозволяє виконувати операції з файлами й папками за допомогою JavaScript.
Він працює поверх системних API (Windows, Linux, macOS) і надає два режими роботи:
- синхронний (блокує потік),
- асинхронний (через callback-и, проміси чи
async/await).
2. Підключення модуля
У CommonJS:
const fs = require('fs');У ES Modules:
import fs from 'fs';3. Основні можливості fs
| Категорія | Приклади методів |
|---|---|
| Читання файлів | readFile, readFileSync, createReadStream |
| Запис файлів | writeFile, appendFile, createWriteStream |
| Робота з каталогами | mkdir, readdir, rmdir, rename |
| Видалення | unlink, rm |
| Інформація про файл | stat, lstat, access, existsSync |
| Копіювання / переміщення | copyFile, rename |
| Спостереження за файлами | watch, watchFile |
4. Приклади основних операцій
Читання файлу (асинхронно)
import fs from 'fs';
fs.readFile('./data.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log('Вміст файлу:', data);
});Читання файлу (через проміси)
Сучасний спосіб:
import { readFile } from 'fs/promises';
const text = await readFile('./data.txt', 'utf8');
console.log(text);Модуль fs/promises - це проміс-версія fs, ідеальна для async/await.
Запис у файл
import fs from 'fs';
fs.writeFile('./output.txt', 'Hello, Node.js!', (err) => {
if (err) throw err;
console.log('Файл створено!');
});Якщо файлу немає - буде створений. Якщо є - вміст перезапишеться.
Додавання в кінець файлу
import fs from 'fs';
fs.appendFile('./log.txt', 'Новий запис\n', (err) => {
if (err) throw err;
console.log('Запис додано!');
});Створення папки
import fs from 'fs';
fs.mkdir('./uploads', { recursive: true }, (err) => {
if (err) throw err;
console.log('Папку створено!');
});{ recursive: true } створює всі вкладені директорії, якщо їх немає.
Читання вмісту директорії
import fs from 'fs';
fs.readdir('./', (err, files) => {
if (err) throw err;
console.log('Файли в папці:', files);
});Вивід:
['app.js', 'package.json', 'data.txt']Видалення файлу
import fs from 'fs';
fs.unlink('./output.txt', (err) => {
if (err) throw err;
console.log('Файл видалено!');
});Отримання інформації про файл
import fs from 'fs';
fs.stat('./data.txt', (err, stats) => {
if (err) throw err;
console.log('Розмір:', stats.size);
console.log('Дата зміни:', stats.mtime);
});Приклад об'єкта stats:
Stats {
size: 1024,
isFile: [Function: isFile],
isDirectory: [Function: isDirectory],
mtime: 2025-10-19T10:00:00Z
}5. Потокове читання й запис (Streams)
Для роботи з великими файлами краще використовувати потоки (stream API).
Потокове читання:
const readStream = fs.createReadStream('./bigfile.txt', 'utf8');
readStream.on('data', (chunk) => {
console.log('Частина файлу:', chunk);
});
readStream.on('end', () => {
console.log('Читання завершено!');
});Потоковий запис:
const writeStream = fs.createWriteStream('./output.txt');
writeStream.write('Перший рядок\n');
writeStream.write('Другий рядок\n');
writeStream.end('Файл записано!');Потоки зручні для роботи з величезними файлами - вони не завантажують увесь файл у пам'ять.
6. Спостереження за файлами
fs.watch('./data.txt', (eventType, filename) => {
console.log(`Зміна: ${eventType} у файлі ${filename}`);
});Дозволяє відстежувати зміни - зручно для live-reload, логів, hot-reload серверів тощо.
7. Асинхронний vs синхронний API
Node.js надає обидві версії майже для кожної функції:
| Асинхронна (рекомендується) | Синхронна (блокує потік) |
|---|---|
fs.readFile(path, cb) | fs.readFileSync(path) |
fs.writeFile(path, data, cb) | fs.writeFileSync(path, data) |
fs.mkdir(path, cb) | fs.mkdirSync(path) |
fs.readdir(path, cb) | fs.readdirSync(path) |
Синхронні методи зупиняють виконання решти коду, тому використовуються рідко - наприклад, під час запуску конфігурації.
8. Модуль fs/promises
Сучасна альтернатива:
import { mkdir, readFile, writeFile } from 'fs/promises';
await mkdir('./data', { recursive: true });
await writeFile('./data/info.txt', 'Hello!');
const text = await readFile('./data/info.txt', 'utf8');
console.log(text);Працює повністю на Promise - без callback-ів, ідеально для async/await.
9. Приклад реального сценарію
Копіювання файлу:
import { readFile, writeFile } from 'fs/promises';
async function copyFile(src, dest) {
const data = await readFile(src);
await writeFile(dest, data);
console.log('Файл успішно скопійовано!');
}
await copyFile('./data.txt', './backup.txt');10. Часто вживані методи
| Метод | Призначення |
|---|---|
readFile(path, [options], callback) | Читання файлу |
writeFile(path, data, [options], callback) | Запис файлу |
appendFile(path, data, callback) | Додавання в кінець |
unlink(path, callback) | Видалення файлу |
rename(oldPath, newPath, callback) | Перейменування |
mkdir(path, [options], callback) | Створення папки |
readdir(path, callback) | Читання папки |
stat(path, callback) | Інформація про файл |
watch(path, listener) | Відстеження змін |
Одним реченням
Модуль
fs- це вбудований API Node.js для роботи з файлами й каталогами (читання, запис, копіювання, потоки, спостереження), доступний і в callback-, і в проміс-вигляді.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.