Сегодня я начал писать новый проект на Node.js и при первом же запуске получил ошибку:

const express = require('express');
                ^
ReferenceError: require is not defined
    at ModuleJob.run (node:internal/modules/esm/module_job:152:23)
    at async Loader.import (node:internal/modules/esm/loader:166:24)
    at async Object.loadESM (node:internal/process/esm_loader:68:5)

Первым делом я проверил установленную версию Node.js:

node -v

Тут проблем не было

v15.5.1

Выглядело это довольно странно и раньше в серверных приложениях я такой ошибкой не сталкивался.

Быстрый поиск на stackoverflow нашел несколько тем, в которых говорят, что require не работает в браузере и советуют использовать webpack или browserify.

Еще несколько минут и я нашел то, что мне было нужно. Похоже, что в версиях Node.js 14+ ошибка ReferenceError: require is not defined может встречаться и на сервере.

Проблема в том, что в файле package.json была такая строка:

"type": "module",

С ее помощью активируется подключение npm модулей через ключевое слово import.

Решение

Чтобы избавиться от ошибки require is not defined в Node.js можно сделать 3 вещи:

  • изменить тип модулей в package.json на commonjs:

    "type": "commonjs"
    
  • удалить строку "type": "module" из файла package.json

  • изменить тип подключения модулей на import:

    // const express = require('express');
    import express from 'express';