Why is "npm install" really slow?
What am I doing wrong when setting up my packages ? Is there any way to speed this up ?
-
packages.json :
{ "name": "testing node", "version": "0.0.0", "description": "", "main": "app.config.js", "dependencies": { "babel-core": "^6.17.0", "babel-loader": "^6.2.0", "babel-plugin-add-module-exports": "^0.1.2", "babel-plugin-react-html-attrs": "^2.0.0", "babel-plugin-transform-class-properties": "^6.3.13", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-preset-es2015": "^6.3.13", "babel-preset-react": "^6.3.13", "babel-preset-stage-0": "^6.3.13", "react": "^0.14.6", "react-dom": "^0.14.6", "webpack": "^1.12.9", "webpack-dev-server": "^1.14.1", "mysql": "*" }, "devDependencies": {}, "scripts": { "dev": "webpack-dev-server --content-base src --inline --hot", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
When inside the folder if I run
npm install
I get the following which can take hours to fully setup:
This is not a general computing or hardware issue. Comparative speeds are below :
- Run
haversine
to calculate all distances on over 1 million records in a non-index mysql table takes significantly less time. (computational)
- Run
- Download a full install of Linux (Dual Layer DVD ISO) in significantly less time. (bandwidth)
I suspect there is something wrong with my packages.json
or the command I am running npm install
. From the image, it seems there are numerous attempts to retrieve the same file. Possibly there is a way to force npm
to retrieve from a more stable mirror ? Possible the mirror selection it uses by default is wonky ? Just some suggestions -- I don't know the specific cause which is why I am asking.
This problem also occurs on my Linode, Digital Ocean, and VULTR boxes -- so I suspect it is something specific with npm
, the way I am using (something missing), or my packages.json
.
Solution 1:
I was able to resolve this from the comments section; outlining the process below.
From the comments
AndreFigueiredo stated :
I installed modules here in less than 1 min with your package.json with npm v3.5.2 and node v4.2.6. I suggest you update node and npm.
v1.3.0 didn't even have flattened dependencies introduced on v3 that resolved a lot of annoying issues
LINKIWI stated :
Generally speaking, don't rely on package managers like apt to maintain up-to-date software. I would strongly recommend purging the node/npm combo you installed from apt and following the instructions on nodejs.org to install the latest release.
Observations
Following their advice, I noticed that CentOS, Ubuntu, and Debian all use very outdated versions of nodejs
and npm
when retrieving the current version using apt
or yum
(depending on operating systems primary package manager).
Get rid of the outdated nodejs
and npm
To resolve this with as minimal headache as possible, I ran the following command (on Ubuntu) :
apt-get purge --auto-remove nodejs npm
This purged the system of the archaic nodejs
and npm
as well as all dependencies which were no longer required
Install current nodejs
and compatible npm
The next objective was to get a current version of both nodejs
and npm
which I can snag nodejs
directly from here and either compile or use the binary, however this would not make it easy to swap versions as I need to (depending on age of project).
I came across a great package called nvm which (so far) seems to manage this task quite well. To install the current stable latest build of version 7 of nodejs
:
Install nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
Source .bashrc
source ~/.bashrc
Use nvm to install nodejs
7.x
nvm install 7
After installation I was pleasantly surprised by much faster performance of npm
, that it also now showed a pretty progress bar while snagging packages.
For those curious, the current (as of this date) version of npm
should look like the following (and if it doesn't, you likely need to update it):
Summary
DO NOT USE YOUR OS PACKAGE MANAGER TO INSTALL NODE.JS OR NPM - You will get very bad results as it seems no OS is keeping these packages (not even close to) current. If you find that npm
is running slow and it isn't your computer or internet, it is most likely because of a severely outdated version.
Solution 2:
I am using Linux and have nvm
and working with more than 7 version of node
As of my experience I experienced the same situation with my latest project (actually not hours but minutes as I can't wait hours because of hourly project :))
Disclaimer: don't try below option until you know how cache clean works
npm cache clean --force
and then all working fine for me so it's looks like sometimes npm's cache gets confused with different versions of Node.
Official documentation of Npm cache can be found here
Solution 3:
I see from your screenshot that you are using WSL on Windows. And, with Windows, comes virus scanners, and virus scanning can make NPM install very slow!
Adding an exemption or disabling virus scanning during install can greatly speed it up, but potentially this is undesirable given the possibility of malicious NPM packages
One link suggests triple install time https://ikriv.com/blog/?p=2174
I have not profiled extensively myself though
Solution 4:
Problem: NPM does not perform well if you do not keep it up to date. However, bleeding edge versions have been broken for me in the past.
Solution: As Kraang mentioned, use node version manager nvm, with its --lts flag
Install it:
curl -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
Then use this often to upgrade to the latest "long-term support" version of NPM:
nvm install --lts
Big caveat: you'll likely have to reinstall all packages when you get a new npm version.
Solution 5:
I was having this problem and none of the solutions in SO helped. I figured it out so I am posting it here in case any one else has a similar issue.
I was trying to run npm i on an amazon instance. The problem ended up being the fact that linux only opens up a certain amount of ports, and when npm i runs, it opens like more than a thousand connects to the registry to download all the packages. So it would work but then just freeze for like 15 minutes. Then the timeout would occur and it would eventually move on to another port. So in my security group in AWS I added a rule for All TCP at 0.0.0.0/0 in outgoing only, letting npm open as many outgoing connections as it likes and that fixed it.