Пошук уроків, статей та іншого контенту
Ознайомимося з fs, path, events, url та іншими вбудованими модулями без встановлення сторонніх пакетів.
Вбудовані модулі — це модулі, які постачаються разом із Node.js. Їх можна використовувати одразу після встановлення Node.js, без npm install.
Вони надають готові можливості для:
роботи з файлами та папками;
побудови шляхів;
роботи з подіями;
розбору URL;
отримання інформації про операційну систему;
створення HTTP-серверів та іншого.
У Node.js модулі можна підключати за допомогою require:
const fs = require("node:fs");
const path = require("node:path");Префікс node: явно показує, що використовується вбудований модуль Node.js.
Також можна зустріти запис без префікса:
const fs = require("fs");Обидва варіанти працюють для вбудованих модулів, але node: допомагає відрізнити їх від сторонніх пакетів.
fsМодуль fs (file system) призначений для роботи з файловою системою.
За допомогою нього можна:
читати файли;
створювати та змінювати файли;
створювати папки;
перевіряти наявність файлів;
видаляти файли.
const fs = require("node:fs");
fs.writeFileSync("message.txt", "Привіт із Node.js!");
const content = fs.readFileSync("message.txt", "utf8");
console.log(content);Метод writeFileSync записує дані у файл. Якщо файл не існує, Node.js створить його.
Метод readFileSync читає файл. Другий аргумент "utf8" вказує, що результат потрібно повернути як рядок.
Без "utf8" Node.js поверне об'єкт Buffer, який містить байти файлу.
const fs = require("node:fs");
if (!fs.existsSync("data")) {
fs.mkdirSync("data");
}
fs.writeFileSync("data/info.txt", "Дані користувача");
console.log("Файл збережено");existsSync перевіряє, чи існує файл або папка;
mkdirSync створює папку.
Назва Sync означає, що операція виконується синхронно: наступний рядок коду не буде виконано, доки операція не завершиться.
Синхронні методи зручні для невеликих навчальних прикладів і простих скриптів. У серверних застосунках частіше використовують асинхронні методи, щоб не блокувати виконання інших операцій.
Сучасний варіант асинхронної роботи — модуль fs/promises:
const fs = require("node:fs/promises");
async function saveMessage() {
await fs.writeFile("message.txt", "Асинхронний запис");
const content = await fs.readFile("message.txt", "utf8");
console.log(content);
}
saveMessage().catch((error) => {
console.error("Не вдалося опрацювати файл:", error.message);
});Методи writeFile і readFile повертають проміси, тому перед ними використовується await.
pathМодуль path допомагає правильно працювати зі шляхами до файлів і папок.
Роздільник у шляхах залежить від операційної системи:
у Linux і macOS використовується /;
у Windows використовується \.
Методи модуля path враховують цю різницю, тому краще не складати шляхи вручну через рядки.
const path = require("node:path");
const filePath = path.join("data", "users", "user.json");
console.log(filePath);path.join об'єднує частини шляху з правильними роздільниками для поточної операційної системи.
const path = require("node:path");
const filePath = "/projects/app/data/users.json";
console.log(path.basename(filePath)); // users.json
console.log(path.dirname(filePath)); // /projects/app/data
console.log(path.extname(filePath)); // .jsonОсновні методи:
basename повертає останню частину шляху;
dirname повертає шлях до папки;
extname повертає розширення файлу.
const path = require("node:path");
const absolutePath = path.resolve("data", "info.txt");
console.log(absolutePath);path.resolve будує абсолютний шлях від поточної робочої папки.
Поточна робоча папка — це папка, з якої запустили команду node, а не обов'язково папка, де розташований файл скрипту.
fs і pathНа практиці fs часто використовують разом із path.
const fs = require("node:fs");
const path = require("node:path");
const dataDirectory = path.join(__dirname, "data");
const filePath = path.join(dataDirectory, "note.txt");
if (!fs.existsSync(dataDirectory)) {
fs.mkdirSync(dataDirectory);
}
fs.writeFileSync(filePath, "Нотатка з Node.js");
const note = fs.readFileSync(filePath, "utf8");
console.log(note);__dirname — спеціальна змінна CommonJS-модуля, яка містить шлях до папки поточного JavaScript-файлу.
Завдяки цьому шлях до data не залежить від папки, з якої запустили скрипт.
eventsМодуль events дозволяє створювати об'єкти, які можуть:
створювати події;
слухати події;
передавати дані під час подій.
Основний клас цього модуля — EventEmitter.
const EventEmitter = require("node:events");
const emitter = new EventEmitter();
emitter.on("message", (message) => {
console.log("Отримано повідомлення:", message);
});
emitter.emit("message", "Система запущена");Метод on реєструє обробник події.
Метод emit запускає подію та передає її обробнику додаткові аргументи.
Події часто використовують усередині власних класів:
const EventEmitter = require("node:events");
class TaskManager extends EventEmitter {
completeTask(taskName) {
console.log(`Завдання виконано: ${taskName}`);
this.emit("completed", taskName);
}
}
const manager = new TaskManager();
manager.on("completed", (taskName) => {
console.log(`Подія completed для завдання: ${taskName}`);
});
manager.completeTask("Підготувати звіт");Подія повинна бути зареєстрована до виклику emit. Якщо спочатку запустити подію, а потім додати слухача, цей слухач її не отримає.
urlМодуль url надає клас URL для розбору та створення URL-адрес.
const { URL } = require("node:url");
const address = new URL(
"https://example.com/products?category=books&page=2"
);
console.log(address.hostname); // example.com
console.log(address.pathname); // /products
console.log(address.search); // ?category=books&page=2Об'єкт URL розділяє адресу на окремі частини:
protocol — протокол, наприклад https:;
hostname — ім'я хоста;
port — порт;
pathname — шлях;
search — рядок параметрів запиту;
hash — фрагмент після #.
Для параметрів запиту використовується searchParams:
const { URL } = require("node:url");
const address = new URL(
"https://example.com/products?category=books&page=2"
);
console.log(address.searchParams.get("category")); // books
console.log(address.searchParams.get("page")); // 2
address.searchParams.set("page", "3");
console.log(address.toString());
// https://example.com/products?category=books&page=3Значення параметрів URL завжди повертаються як рядки. Якщо значення потрібно використовувати як число, його треба перетворити:
const page = Number(address.searchParams.get("page"));osМодуль os надає інформацію про операційну систему та середовище виконання.
const os = require("node:os");
console.log("Операційна система:", os.platform());
console.log("Домашня папка:", os.homedir());
console.log("Кількість ядер:", os.cpus().length);Корисні методи:
os.platform() повертає назву платформи;
os.homedir() повертає шлях до домашньої папки користувача;
os.cpus() повертає інформацію про процесори;
os.tmpdir() повертає шлях до тимчасової папки.
Результат роботи цих методів може відрізнятися на різних комп'ютерах.
У наступному прикладі використано кілька вбудованих модулів:
fs — для запису та читання файлу;
path — для побудови шляху;
events — для створення події;
url — для читання параметра URL;
os — для отримання назви платформи.
const fs = require("node:fs");
const path = require("node:path");
const EventEmitter = require("node:events");
const { URL } = require("node:url");
const os = require("node:os");
const dataDirectory = path.join(__dirname, "data");
const filePath = path.join(dataDirectory, "request.txt");
if (!fs.existsSync(dataDirectory)) {
fs.mkdirSync(dataDirectory);
}
const requestUrl = new URL(
"https://example.com/search?query=node&page=1"
);
const requestData = {
query: requestUrl.searchParams.get("query"),
page: Number(requestUrl.searchParams.get("page")),
platform: os.platform()
};
fs.writeFileSync(filePath, JSON.stringify(requestData, null, 2));
const savedData = fs.readFileSync(filePath, "utf8");
console.log("Збережені дані:");
console.log(savedData);
const events = new EventEmitter();
events.on("fileSaved", (savedFilePath) => {
console.log(`Файл збережено: ${savedFilePath}`);
});
events.emit("fileSaved", filePath);Збережіть код у файлі app.js і запустіть:
node app.jsПісля запуску в папці скрипту з'явиться папка data з файлом request.txt.
Node.js містить багато інших модулів. Серед них:
http — створення HTTP-серверів;
crypto — криптографічні операції;
util — допоміжні функції;
stream — робота з потоками даних;
assert — перевірка умов у тестах;
child_process — запуск зовнішніх процесів.
Підключаються вони так само:
const http = require("node:http");
const crypto = require("node:crypto");Для використання вбудованих модулів не потрібно створювати файл package.json або встановлювати пакет через npm.
Ненадійний варіант:
const filePath = "data/" + "file.txt";Краще використовувати path.join:
const path = require("node:path");
const filePath = path.join("data", "file.txt");Якщо не вказати "utf8":
const fs = require("node:fs");
const content = fs.readFileSync("message.txt");
console.log(content);результатом буде Buffer, а не звичайний рядок.
Для читання тексту використовуйте:
const content = fs.readFileSync("message.txt", "utf8");Спроба прочитати відсутній файл спричинить помилку. Перед операцією можна перевірити його наявність за допомогою existsSync або обробити помилку через try...catch.
__dirname і поточною папкою__dirname вказує на папку поточного файлу.
Відносний шлях на кшталт "data/file.txt" розраховується від поточної робочої папки, з якої запустили команду node.
Для передбачуваних шляхів використовуйте:
const filePath = path.join(__dirname, "data", "file.txt");Слухача потрібно зареєструвати до виклику emit:
emitter.on("ready", () => {
console.log("Готово");
});
emitter.emit("ready");Методи з суфіксом Sync блокують виконання програми на час операції. Для невеликих скриптів це зазвичай прийнятно, але під час обробки багатьох або великих файлів краще використовувати асинхронні методи з fs/promises.
Вбудовані модулі Node.js доступні без встановлення сторонніх пакетів.
fs використовується для роботи з файлами та папками.
path допомагає будувати кросплатформні шляхи.
events дає змогу створювати та обробляти події.
url допомагає розбирати URL і працювати з параметрами запиту.
os надає інформацію про операційну систему.
Для асинхронної роботи з файлами можна використовувати fs/promises.
Для надійної роботи зі шляхами краще застосовувати path.join і path.resolve, а не об'єднувати рядки вручну.