«Ошибка: не удается найти модуль« меньше »» Параметры загрузки / порядка / кэша модуля Node.js? - PullRequest
9 голосов
/ 17 февраля 2012

Вот ситуация ... Итак, я создал модуль Node.js, который действует как интерфейс для некоторых шаблонизаторов Node.js. Shift.js .Это включено в другой модуль Node.js, Design.io (он указан в блоке package.json dependencies Design.io).Design.io просматривает файлы на предмет изменений.

Затем вы создаете приложение и require('design.io').Вы также устанавливаете, скажем, Less и Stylus в свой проект.

Таким образом, когда вы сохраняете файл .less или .styl, вызывается цепочка методов:

  1. require("design.io") получает уведомление о событии файловой системы.Design.io затем вызывает
  2. require('shift').render(string, extension, callback).Затем Shift.js вызывает
  3. require(moduleFor(extension)) # require("less").Строка скомпилирована.

В моем приложении (текущий рабочий каталог) я установил меньше и стилус:

npm install less stylus

Проблема, с которой я столкнулся, в шаг 3 , который вызывается из модуля Shift.js, я получаю такие ошибки:

Error: Cannot find module 'less'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Less.engine (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift/less.js:6:14)
    at Less.render (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift/less.js:18:21)
    at /Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift.js:69:23
    at /Users/viatropos/Documents/git/plugins/design.io/node_modules/async/lib/async.js:118:13
    at Object.forEachSeries (/Users/viatropos/Documents/git/plugins/design.io/node_modules/async/lib/async.js:134:9)
    at Object.render (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift.js:78:31)

Мой вопрос: почему это происходит?Я думал, что вы можете динамически запрашивать библиотеки из модуля, пока они установлены где-то ... Чего мне не хватает?

Цель состоит в том, чтобы такие библиотеки, как Shift.js, не имели быопределить каждую отдельную зависимость в package.json… Для библиотеки «интерфейса с механизмами шаблонов», которая потребовала бы слишком много зависимостей, которые приложение, вероятно, никогда бы не использовало.

Спасибо за помощь, надеюсь, что это былонесколько ясно.

1 Ответ

25 голосов
/ 17 февраля 2012

Когда вы npm install foo, модуль foo устанавливается в каталог с именем node_modules в текущем рабочем каталоге.

Когда вы устанавливаете эту библиотеку shift, она ищет только те модули, которые требуются в своем собственном каталоге node_modules или в одном из глобальных каталогов require.resolve() поисков.

И это простое решение вашей проблемы:

npm install -g less

И тогда библиотека станет видимой для всех кодов Node.js на вашем компьютере, а не только для кода в текущем рабочем каталоге.

В качестве альтернативы, если вы хотите, чтобы shift только увидел это, сделайте что-то вроде этого:

npm install shift
cd node_modules/shift
npm install less
...