Выбор ответа Middle Модули обновлено

__dirname в ES-модуле Node

Вопрос

Код перенесли из CommonJS в ESM (.mjs) в Node.js 22. Что будет со строкой path.join(__dirname, 'data.json')?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: ReferenceError: dirname нет; замена: import.meta.dirname. dirname, filename, require, module и exports это параметры обёртки CommonJS-модуля, в ESM их нет, и обращение бросает ReferenceError.

Варианты ответа

  1. Всё работает как прежде: Node подставит путь к файлу
  2. __dirname будет пустой строкой, и путь станет относительным
  3. ReferenceError: __dirname нет; замена: import.meta.dirnameправильный ответ
  4. __dirname укажет на корень проекта, где лежит package.json

Разбор

__dirname, __filename, require, module и exports это параметры обёртки CommonJS-модуля, в ESM их нет, и обращение бросает ReferenceError. В Node 20.11+ есть import.meta.dirname и import.meta.filename; универсальный вариант: fileURLToPath(new URL('.', import.meta.url)). Пустой строки или подстановки корня проекта не происходит.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.