Пути: node:path и import.meta.dirname
Путь — адрес файла на диске, например data/posts.json или C:\blog\data\posts.json. В Windows части пути разделяет обратная косая черта, в Linux и macOS — прямая. Встроенный модуль node:path собирает и разбирает пути так, чтобы код одинаково работал в любой системе.
Сборка пути
Функция path.join() склеивает части пути и ставит правильный разделитель:
import path from 'node:path';
const file = path.join('data', 'posts', 'first.json');
console.log(file);В Linux и macOS выведется data/posts/first.json, в Windows — data\posts\first.json. Лишние разделители и .. функция тоже убирает.
Разбор пути
import path from 'node:path';
const file = '/home/anna/blog/data/posts.json';
console.log(path.basename(file)); // posts.json
console.log(path.extname(file)); // .json
console.log(path.basename(file, '.json')); // posts
console.log(path.dirname(file)); // /home/anna/blog/data| Функция | Возвращает |
|---|---|
path.basename(p) | Имя файла |
path.extname(p) | Расширение с точкой |
path.dirname(p) | Папку, в которой лежит файл |
path.join(...) | Склеенный путь |
path.resolve(...) | Абсолютный путь — от корня диска |
Относительно чего считается путь
Относительный путь вроде data/posts.json Node.js отсчитывает от текущей папки терминала — process.cwd(), а не от папки, где лежит файл с кодом. Если запустить программу из другой папки, файл не найдётся.
Папка текущего модуля
Чтобы путь не зависел от того, откуда запущена программа, его строят от папки самого модуля. В ES-модулях она хранится в import.meta.dirname, а полный путь к файлу — в import.meta.filename:
import path from 'node:path';
const dataFile = path.join(import.meta.dirname, 'data', 'posts.json');
console.log(path.isAbsolute(dataFile)); // true
console.log(path.basename(import.meta.filename));Первая строка выведет true: путь начинается от корня диска. Вторая — имя файла, в котором записан код.
В проекте блога
Модуль, который работает со статьями, лежит в src/posts.js, а данные — в data/posts.json в корне. Путь к данным строят так:
// src/posts.js
import path from 'node:path';
const DATA_FILE = path.join(import.meta.dirname, '..', 'data', 'posts.json');
export { DATA_FILE };.. поднимает на одну папку вверх — из src в корень проекта. Теперь node src/server.js и npm start из любой папки найдут один и тот же файл.
Частая ошибка
В старых статьях путь строят через __dirname. Эта переменная есть только в CommonJS, а в ES-модуле код упадёт:
// src/posts.js
const file = __dirname + '/data/posts.json';
// ReferenceError: __dirname is not defined in ES module scopeИспользуйте import.meta.dirname — он появился в Node.js 20.11 и работает во всех версиях, на которые рассчитан курс. И собирайте пути через path.join(), а не сложением строк.