从GitHub下载模块并按照说明进行构建后,我尝试使用以下方法将其拉入现有项目:

> npm install ../faye

这似乎起到了作用:

> npm list
/home/dave/src/server
└─┬ faye@0.7.1
  ├── cookiejar@1.3.0
  ├── hiredis@0.1.13
  └── redis@0.7.1

但是Node.js找不到模块:

> node app.js
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'faye'
    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 Object.<anonymous> (/home/dave/src/server/app.js:2:12)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)

我真的很想了解这里发生了什么,但我有点不知所措,不知道下一步该去哪里。有什么建议吗?


当前回答

显然,从这个问题来看,有很多可能的原因。

也许这会对某人有所帮助,希望没有人像我一样愚蠢地使用这种技术:

检查文件夹树中是否有node_modules文件夹。

场景1:如果您有一个项目文件夹,在多个项目之间共享了node_modules文件夹,那么您可能没有遇到任何问题

|- projects
| |- node_modules     <- OK
| |- project1         <- No node_modules folder
| | |- package.json
| |- project2         <- No node_modules folder
| | |- package.json

场景2:如果添加不同性质的第三个项目,则可以选择在该项目中保留node_modules文件夹:

|- projects
| |- node_modules     <- Can be used by project 3
| |- project1         <- No node_modules folder
| | |- package.json
| |- project2         <- No node_modules folder
| | |- package.json
| |- project3
| | |- node_modules   <- Packages for project 3 only
| | |- package.json

我猜项目3的node-modules文件夹中的一些包依赖于它在父文件夹的node_modules文件夹中找到(或找不到)的包。尽管您希望在项目3的node_modules文件夹中找到依赖项。也许是因为导入和引用某些包的方式?

不用说,这是一场即将发生的灾难:)

其他回答

也许像我一样,您将express中的“视图引擎”设置为不存在的引擎,或者尝试使用未注册的模板引擎。确保使用:app.engine('引擎名称',引擎)app.set(“查看引擎”,“引擎名称”)

使用npm install仅将模块安装到当前目录中(位于名为node_modules的子目录中)。app.js是否位于home/dave/src/server/下?如果没有,并且您想从任何目录中使用该模块,则需要使用npm install-g全局安装该模块。

我通常在本地安装大多数软件包,以便将它们与我的项目代码一起签入。

更新(8/2019):

现在,您可以使用package-lock.json文件,该文件在npm修改node_modules目录时自动生成。因此,您可以省去签入包,因为package-lock.json跟踪您当前使用的node_module的确切版本。要从package-lock.json而不是package.json安装包,请使用命令npmci。

更新(2016年3月):

我的回答遭到了很多批评,特别是我检查了我的代码所依赖的包。几天前,有人发布了他们所有的包(https://kodfabrik.com/journal/i-ve-just-liberated-my-modules)这打破了React、Babel和其他一切。希望现在很清楚,如果你有生产代码,你不能依赖NPM来维护你的依赖关系。

我可以再加一个地方检查;我尝试使用的软件包是我自己发布给私人NPM回购的另一个软件包。我忘记正确配置package.json中的“main”属性。因此,该包位于消费包的node_modules文件夹中,但我得到的是“找不到模块”。我花了几分钟才意识到自己的错误-(

我试图发布自己的包,然后将其包含在另一个项目中。我遇到这个问题是因为我是如何构建第一个模块的。我使用ES2015导出来创建模块,例如,假设模块看起来像这样:

export default function(who = 'world'){
    return `Hello ${who}`;
}

与Babel一起编译后,发布前:

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

exports.default = function () {
    var who = arguments.length <= 0 || arguments[0] === undefined ? 'world' : arguments[0];


    return 'Hello ' + who;
};

因此,在另一个项目(无ES2015)中安装npm模块名称后,我不得不做

var-hello=require('module-name').default;

真的把包裹进口了。

希望这有帮助!

如果所有其他方法都不适合你。。。尝试

npm link package_name

e.g

npm link webpack
npm link autoprefixer

e.t.c公司