【问题标题】:"Error: Cannot find module 'less'" Node.js module loading preference/order/cache?“错误:找不到模块‘少’”Node.js 模块加载首选项/顺序/缓存?
【发布时间】:2012-03-08 10:16:59
【问题描述】:

情况是这样的……所以我创建了一个 Node.js 模块,作为一些 Node.js 模板引擎的接口,Shift.js。这包含在另一个 Node.js 模块中,Design.io(它指定了 Design.io 的 package.json dependencies 块)。 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")。字符串已编译。

在我的应用程序(当前工作目录)中,我安装了 less 和 stylus:

npm install less stylus

我遇到的问题是,在从 Shift.js 模块中调用的 步骤 3 中,我收到如下错误:

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 中定义每个依赖项……对于“模板引擎接口”库,这将需要太多应用程序可能永远不会的依赖项正在使用。

感谢您的帮助,希望这有点清楚。

【问题讨论】:

  • 我认为这可能是一个修复...我有一个命令 design.io 我调用,它运行 require('../lib/design.io/process.js') 启动整个观察者进程。如果我将其更改为require('design.io/lib/design.io/process.js'),一切似乎都可以正确加载。很奇怪,b/c require.main.paths 在这两种情况下都是一样的。

标签: node.js module require commonjs


【解决方案1】:

当您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

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2017-02-17
    • 2016-09-18
    • 2016-05-11
    • 2013-02-03
    • 2019-01-31
    相关资源
    最近更新 更多