After pulling down a module from GitHub and following the instructions to build it, I try pulling it into an existing project using:
> npm install ../faye
This appears to do the trick:
> npm list
/home/dave/src/server
└─┬ faye@0.7.1
├── cookiejar@1.3.0
├── hiredis@0.1.13
└── redis@0.7.1
But Node.js can’t find the module:
> 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)
I really want to understand what is going on here, but I’m at a bit of a loss as to where to look next. Any suggestions?
Using
npm installinstalls the module into the current directory only (in a subdirectory callednode_modules). Is app.js located underhome/dave/src/server/? If not and you want to use the module from any directory, you need to install it globally usingnpm install -g.I usually install most packages locally so that they get checked in along with my project code.
Update (8/2019):
Nowadays you can use package-lock.json file, which is automatically generated when npm modifies your node_modules directory. Therefore you can leave out checking in packages, because the
package-lock.jsontracks the exact versions of your node_modules, you’re currently using. To install packages frompackage-lock.jsoninstead ofpackage.jsonuse the commandnpm ci.Update (3/2016):
I’ve received a lot of flak for my response, specifically that I check in the packages that my code depends on. A few days ago, somebody unpublished all of their packages (https://kodfabrik.com/journal/i-ve-just-liberated-my-modules) (archived on Wayback Machine) which broke React, Babel, and just about everything else. Hopefully it’s clear now that if you have production code, you can’t rely on NPM actually maintaining your dependencies for you.