Node.js LinuxWindowsNode.js

Node.js: После смены CommonJS на ESM перестал работать require

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

После добавления «type»: «module» в package.json или переименования файла в .mjs привычный require() и __dirname становятся недоступны в области ES-модуля. Причина — режим загрузки файла, а не поломка установки Node.js.

В этой статье
  1. Симптомы и условия возникновения
  2. Причины и как их отличить
  3. Пошаговая диагностика и решение
  4. Как проверить результат и что делать, если не помогло

#Симптомы и условия возникновения

После добавления «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. 1. Определите формат проблемного файлаОткройте ближайший к скрипту package.json и найдите поле type. При "type": "module" файлы .js обрабатываются как ESM; .mjs — ESM всегда, .cjs — CommonJS. На других файлах проект может использовать иной режим.
  1. 2. Сохраните рабочий вариантВ копии проекта запишите текущие package.json и проблемный файл. Выпишите точную строку require из стека; не меняйте весь проект массовой заменой без проверки зависимостей.
  1. 3. Для обычных зависимостей используйте importЕсли файл действительно должен быть ESM, замените const fs = require("node:fs") на import fs from "node:fs", а module.exports на согласованный export. Для собственных файлов в относительном import укажите расширение .js.
  1. 4. Если требуется старый синхронный модуль, отделите .cjsЕсли библиотека требует CommonJS, переместите только этот модуль в файл с расширением .cjs и подключайте его по явному пути. Нельзя просто переименовать файл, который уже содержит операторы import/export.
  1. 5. Используйте createRequire для совместимостиВ ESM-коде, где необходим require для поддерживаемого пакета или JSON/нативного дополнения, создайте локальный require через createRequire(import.meta.url). Убедитесь, что используемая библиотека допускает такой способ загрузки.
  1. 6. Исправьте вычисление пути к файлуПри ошибке __dirname примените fileURLToPath(import.meta.url) и dirname из node:path. Не используйте process.cwd() как безусловную замену: текущая рабочая папка при запуске службы может быть другой.
  1. 7. Проверьте импорт в тестовой копииЗапустите node app.js или node app.mjs из проектной папки. Если появляется ERR_MODULE_NOT_FOUND, проверьте относительное расширение и экспорты пакета; если ошибка сменилась на ERR_REQUIRE_ASYNC_MODULE, используйте асинхронный import().
  2. Пример для файла .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, рабочий каталог, настройки процесса и журнал тестового запуска. Откатите только внесённые изменения из предварительно сохранённой копии, затем разберите причину на отдельной среде.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.