#Симптомы и условия возникновения
После добавления «type»: «module» в package.json или переименования файла в .mjs привычный require() и __dirname становятся недоступны в области ES-модуля. Причина — режим загрузки файла, а не поломка установки Node.js. Для начала проверьте используемую версию среды и точный текст ошибки на копии проекта, не меняя рабочий сервер.
#Причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Файл выполняется как ESMВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление. | ReferenceError: require is not defined in ES module scope | Заменить require на import либо явно выделить CommonJS-файл. |
| Перемешаны форматы экспортаВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление. | Ошибка возникает после замены module.exports на export | Согласовать импорт и экспорт вызывающих файлов. |
| Пути строились через __dirnameВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление. | ReferenceError: __dirname is not defined | Использовать import.meta.url и fileURLToPath. |
#Пошаговая диагностика и решение
- 1. Определите формат проблемного файлаОткройте ближайший к скрипту
package.jsonи найдите полеtype. При"type": "module"файлы.jsобрабатываются как ESM;.mjs— ESM всегда,.cjs— CommonJS. На других файлах проект может использовать иной режим.
- 2. Сохраните рабочий вариантВ копии проекта запишите текущие
package.jsonи проблемный файл. Выпишите точную строкуrequireиз стека; не меняйте весь проект массовой заменой без проверки зависимостей.
- 3. Для обычных зависимостей используйте importЕсли файл действительно должен быть ESM, замените
const fs = require("node:fs")наimport fs from "node:fs", аmodule.exportsна согласованныйexport. Для собственных файлов в относительном import укажите расширение.js.
- 4. Если требуется старый синхронный модуль, отделите .cjsЕсли библиотека требует CommonJS, переместите только этот модуль в файл с расширением
.cjsи подключайте его по явному пути. Нельзя просто переименовать файл, который уже содержит операторыimport/export.
- 5. Используйте createRequire для совместимостиВ ESM-коде, где необходим
requireдля поддерживаемого пакета или JSON/нативного дополнения, создайте локальныйrequireчерезcreateRequire(import.meta.url). Убедитесь, что используемая библиотека допускает такой способ загрузки.
- 6. Исправьте вычисление пути к файлуПри ошибке __dirname примените
fileURLToPath(import.meta.url)и dirname изnode:path. Не используйтеprocess.cwd()как безусловную замену: текущая рабочая папка при запуске службы может быть другой.
- 7. Проверьте импорт в тестовой копииЗапустите
node app.jsилиnode app.mjsиз проектной папки. Если появляется ERR_MODULE_NOT_FOUND, проверьте относительное расширение и экспорты пакета; если ошибка сменилась на ERR_REQUIRE_ASYNC_MODULE, используйте асинхронныйimport(). - Пример для файла .mjs или .js внутри пакета с type: module; без повышенных правТекстПример для файла .mjs или .js внутри пакета с type: module; без повышенных прав.
import { createRequire } from 'node:module'; import { fileURLToPath } from 'node:url'; import { dirname } from 'node:path'; const require = createRequire(import.meta.url); const __dirname = dirname(fileURLToPath(import.meta.url)); console.log(__dirname);
#Как проверить результат и что делать, если не помогло
Программа запускается без require is not defined, корректно находит локальные модули и проходит ранее упавший сценарий импорта. При сбое откатите изменённые файлы.
Если неисправность повторилась, выпишите первый код ошибки и действие, на котором она возвращается. Сравните версию Node.js/npm, рабочий каталог, настройки процесса и журнал тестового запуска. Откатите только внесённые изменения из предварительно сохранённой копии, затем разберите причину на отдельной среде.