Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Пути: 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(), а не сложением строк.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.