zaLinux.ru

Куда npm устанавливает пакеты. Ошибка «Error: Cannot find module» даже после установки модуля


Оглавление

  1. Ошибка «Error: Cannot find module» даже после установки модуля
  2. Где node ищет установленные модули при указании относительного пути в методе require()
  3. Почему возникает ошибка «Error: Cannot find module» при перемещении файла .js на другой диск
  4. Где находятся модули Node.js, которые я установил с помощью npm
  5. Как проверить, где находятся модули Node.js, которые я установил с помощью npm
  6. Можно ли одновременно устанавливать один и тот же пакет глобально и локально
  7. Как указывать путь до модуля в методе require()
  8. Официальная документация по загрузке модулей из файлов и папок

Ошибка «Error: Cannot find module» даже после установки модуля

При импортировании модуля с помощью метода require() вы можете столкнуться с ошибкой:

node:internal/modules/cjs/loader:1244
  throw err;
  ^

Error: Cannot find module 'puppeteer'
Require stack:
- /mnt/disk_d/Share/Dev/suip/!files/test.js
    at Function._resolveFilename (node:internal/modules/cjs/loader:1241:15)
    at Function._load (node:internal/modules/cjs/loader:1066:27)
    at TracingChannel.traceSync (node:diagnostics_channel:322:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:220:24)
    at Module.require (node:internal/modules/cjs/loader:1327:12)
    at require (node:internal/modules/helpers:136:16)
    at Object.<anonymous> (/mnt/disk_d/Share/Dev/suip/!files/test.js:1:19)
    at Module._compile (node:internal/modules/cjs/loader:1566:14)
    at Object..js (node:internal/modules/cjs/loader:1718:10)
    at Module.load (node:internal/modules/cjs/loader:1305:32) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/mnt/disk_d/Share/Dev/suip/!files/test.js' ]
}

Ключевой информацией здесь является то, что импортируемый модуль не найден.

Очевидно, что прежде чем импортировать модуль, его необходимо установить. Но вы можете получать сообщение об этой ошибке даже после того, как установили модуль. Дело в том, что по умолчанию npm устанавливает модули локально (причём может установить как в текущую рабочую папку, так и в одну из родительских папок).

Кроме локальной установки модулей, также имеется глобальный вариант установки модулей — он включается при добавлении к команде опции -g.

Итак, чтобы исправить эту ошибку, нужно правильно указать путь до модуля в методе require().

Где node ищет установленные модули при указании относительного пути в методе require()

  1. По умолчанию node ищет папку node_modules в текущей директории.
  2. Если папка node_modules не найдена, то она ищется в родительской директории.
  3. Если папка node_modules не найдена и в родительской директории, то она ищется выше по дереву директорий, вплоть до корня диска.

Почему возникает ошибка «Error: Cannot find module» при перемещении файла .js на другой диск

Вы могли обратить внимание, что код в файле .js является рабочим, но если перенести файл на другой диск и запустить, то возникнет ошибка из-за того, что не найден импортируемый модуль. Это возникает по той причине, что:

1) при удачных запусках требуемый модуль присутствовал в node_modules локальной папке или в одной из папок node_modules в родительских директориях.

2) при неудачных запусках папка node_modules с модулем отсутствует во всех родительских папках на диске, с которого запускается файл .js.

Где находятся модули Node.js, которые я установил с помощью npm

При глобальной установке модуля (с опцией -g)

Если вы установили модуль используя опцию -g, например:

sudo npm i -g puppeteer

То расположение модулей различается на разных дистрибутивах Linux, например, это могут быть директории:

/usr/lib/node_modules/
/usr/local/lib/node_modules/

При локальной установке модуля

Если вы установили модуль не используя опцию -g, например:

npm i puppeteer

То расположение модуля выбирается исходя из следующих правил:


1) В текущей папке ищется директория node_modules. Если директория найдена, то в неё устанавливается модуль

2) Если на предыдущем шаге директория node_modules не найдена, то она ищется во всех родительских папках, вплоть до корня. Если директория найдена, то в неё устанавливается модуль

3) Если на предыдущих двух шагах не найдена директория node_modules, то в текущей рабочей папке создаётся директория node_modules и в неё устанавливается модуль

Как проверить, где находятся модули Node.js, которые я установил с помощью npm

Где находятся модули Node.js установленный глобально с помощью npm

Чтобы проверить, где находится папка с модулями, выполните команду:

npm root -g

Чтобы узнать расположение папки node_modules, выполните команду:

npm list -g | head -1

Чтобы получить список модулей, установленных глобально, выполните:


npm list -g

Если вы хотите получить только список главных модулей (без подмодулей) установленных глобально, выполните команду:

npm list -g --depth=0

Где находятся модули Node.js установленный локально с помощью npm

Папка node_modules может находится в любой директории, где вы выполнили установку модулей. Но обычно такая папка имеется в домашней директории пользователя:

~/node_modules/

Следующая команда будет искать папку node_modules в локальной директории, а также во всех родительских и выведет путь до неё, если найдёт:

npm root

Обратите внимание, что в разных директориях, а особенно на разных дисках вывод предыдущей команды будет различаться.

Чтобы вывести список модулей, установленных локально, выполните команду:

npm list

Чтобы вывести список только главных модулей (без подмодулей), установленных локально, выполните команду:

npm list --depth=0

Можно ли одновременно устанавливать один и тот же пакет глобально и локально

Один и тот же пакет может быть установлен и глобально и локально. Причём локально он может быть установлен множество раз.


Как указывать путь до модуля в методе require()

Путь до модуля в методе require() можно указать как:

1) Полный (абсолютный) путь до директории с модулем

2) Имя модуля — соответствует имени папки, в которой находятся файлы модуля

Примеры указания абсолютного пути до модуля (на разных дистрибутивах Linux):

const puppeteer = require('/usr/lib/node_modules/puppeteer');
const puppeteer = require('/usr/local/lib/node_modules/puppeteer');

Пример указания названия папки модуля:

const puppeteer = require('puppeteer');

При указании относительного пути, будет выполнен поиск в текущей папке, где запущен скрипт .js, а также в папках node_modules в родительских директориях.

Официальная документация по загрузке модулей из файлов и папок

На самом деле, процесс поиска импортируемых папок и файлов сложнее, чем описано выше. Больше подробностей вы сможете найти в официальной документации:


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *