为什么“npm install”非常缓慢?

110

当我设置我的软件包时,我做错了什么?有没有办法加快这个过程?

  • 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"
}

进入文件夹后运行以下命令:

npm install

我得到了下面的内容,完全设置可能需要数小时:

npm install stuck

这不是一般的计算机或硬件问题。以下是比较速度:

    1. 在非索引mysql表上运行haversine来计算超过100万条记录的所有距离需要的时间明显少。 (计算)
    1. 以显着较短的时间下载完整的Linux安装(双层DVD ISO)。 (带宽)

我怀疑我的packages.json或我正在运行的npm install命令有问题。从图像中可以看出,有许多尝试检索相同的文件。 可能有一种方法可以强制npm从更稳定的镜像中检索? 可能它默认使用的镜像选择有问题? 这些只是建议--我不知道具体原因,这就是为什么我在问的原因。

这个问题也发生在我的Linode、Digital Ocean和VULTR盒子上--所以我怀疑它是与npm、我正在使用的方式(某些东西丢失)或我的packages.json有关。


13
@hardillb - 这并不是因为我的网络或机器速度的问题。在同一台电脑上,下载完整版的Linux要比使用“npm install”获取几个脚本更快。相比之下,可以在MySQL的非索引记录集上运行Haversine算法,处理超过100万条记录比这个过程更快。 - Kraang Prime
1
"我怀疑我的packages.json或者我运行的npm install命令有问题" - 我觉得不是这个原因。我用你的package.json在npm v3.5.2和node v4.2.6下不到1分钟就安装好了模块,建议你升级node和npm。" - Andre Figueiredo
10
这是一个非常老的npm版本。我不会感到惊讶,如果这是npm中的一个错误,并且在以后的版本中得到了修复。你可以将npm更新到最新版吗?请运行sudo npm install -g npm@latest - user5224313
@AndreFigueiredo - 听起来可能是版本问题。在此之后,将测试LINKIWI的更新方法。不知道为什么npm的存储库是如此过时的版本:S - Kraang Prime
1
一般来说,不要依赖像apt这样的软件包管理器来维护最新的软件。我强烈建议您清除从apt安装的node/npm组合,并按照nodejs.org上的说明安装最新版本。 - user5224313
显示剩余15条评论
18个回答

56

我能够从评论部分解决这个问题,以下是步骤概述。

来自评论

AndreFigueiredo 说:

我使用您的 package.json 在 npm v3.5.2 和 node v4.2.6 下不到1分钟就安装了模块。我建议您更新 node 和 npm。


v1.3.0 没有引入在 v3 中解决许多烦人问题的扁平化依赖项

LINKIWI 说:

一般来说,不要依赖像 apt 这样的包管理器来维护最新软件。我强烈建议卸载通过 apt 安装的 node/npm 组合,并按照 nodejs.org 上的说明安装最新版本。

观察

遵循他们的建议,我注意到 CentOS、Ubuntu 和 Debian 在使用 aptyum(取决于操作系统主要的包管理器)检索 当前 版本时,都使用非常过时的 nodejsnpm

丢弃过时的 nodejsnpm

为了尽可能少地出现问题,我在 Ubuntu 上运行了以下命令:

apt-get purge --auto-remove nodejs npm

这清除了系统中陈旧的nodejsnpm以及不再需要的所有依赖项

安装当前版本的nodejs和相应的npm

下一个目标是获得当前版本的nodejsnpm。我可以直接从这里获取nodejs,然后编译或使用二进制文件,但这样不容易切换版本(根据项目的年龄需要)。

我发现了一个很棒的软件包叫做nvm,它(到目前为止)似乎很好地管理了这个任务。要安装nodejs版本7的当前稳定最新版本:

安装nvm

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash

源自.bashrc

source ~/.bashrc

使用 nvm 安装 nodejs 7.x

nvm install 7

安装后,我惊喜地发现npm的性能明显提升,而且在获取软件包时也显示了一个漂亮的进度条。

如果你好奇,当前(截至本文发布日期)版本的npm应该如下所示(如果不是这样,你可能需要更新它):

current npm running

总结

请不要使用操作系统的软件包管理器来安装Node.js或NPM - 这样会得到非常糟糕的结果,因为似乎没有任何操作系统能够保持这些软件包的最新状态。如果你发现npm运行缓慢,并且不是因为电脑或网络的问题,那么很可能是因为它的版本过于陈旧


1
不错。n 值得考虑作为 nvm 的更简单的替代品,可以通过 curl -L https://git.io/n-install | bash 安装。 - mklement0
1
我强烈建议使用nvm来调整你正在运行的node版本。https://github.com/creationix/nvm - user1969453
1
对于当前版本,可以按照 Node.js 网站上的说明添加仓库。 - E. Sundin
我赞同nvm的建议,特别是使用--lts标志,它将使您保持更新到npm的最新“长期支持”版本,这应该既是当前的,也是稳定的。 - moodboom
对我来说,问题的根本原因也是NodeJS/NPM版本过旧。在我的情况下,Linux发行版是SLE 15 SP2。几天后,SLE提供了一个NodeJS/NPM更新,这为我解决了问题。 - user3405291
显示剩余4条评论

16

我正在使用Linux系统,使用nvm工具,并且正在使用7个以上的Node版本。 根据我的经验,我曾在最新项目中遇到了相同的情况(实际上不是一小时而是几分钟,因为这个项目是每小时更新 :))

免责声明:在了解清空缓存的工作原理之前,请勿尝试下面的选项

npm cache clean --force

然后对我来说一切都正常了,看起来有时候npm的缓存会因为不同版本的Node而变得混乱。

Npm缓存的官方文档可以在这里找到 here


1
我在使用npm时遇到了问题。初始的“加载”过程会停留15-30秒,然后才能继续。但是在运行您的命令之后,问题得到了解决!现在它像往常一样立即启动,nodejs v8.11.3npm 5.6.0Windows 7 x64上。 - Nathan Goings
22
在这里加上一个关于缓存清理如何工作的简要说明(��至少提供一个链接)会更好。 - Art3mix
现在,npm缓存被认为非常稳定。而且,我无法想象删除并重新下载缓存数据如何能以任何方式加快npm的速度。 - Monkey Supersonic

10
我从你的截图中看到你正在Windows上使用WSL。而且,随着Windows的使用,会有病毒扫描程序,病毒扫描可能会使NPM安装非常缓慢!
在安装期间添加豁免或禁用病毒扫描可以大大加快速度,但考虑到恶意NPM软件包的可能性,这可能是不可取的。
一个链接建议三倍的安装时间 https://ikriv.com/blog/?p=2174 我自己没有进行详细的分析。

1
我可以确认禁用实时扫描确实可以提高 npm install 的速度。 - Kennith Nichol
1
这是一个非常被忽视的问题,很高兴你在这里提出它。谢谢。 - Kris Boyd

4

我曾遇到这个问题,但 Stack Overflow 上的解决方案都没有帮助到我。后来我自己找到了解决方法,现在把它发出来,以便其他人如果出现类似的问题时也能参考。

我试图在亚马逊实例上运行 npm i。问题最终是由于 Linux 只会打开一定数量的端口,在运行 npm i 时,它会打开超过一千个连接到注册表以下载所有包。所以它可以工作,但随后就会冻结大约 15 分钟。然后超时会发生,进而转移到另一个端口。所以在 AWS 中的安全组中,我添加了一个仅对外的 All TCP 规则,允许 npm 打开尽可能多的出站连接,并解决了该问题。


你是怎么做到的? - Mattia Rasulo

4

问题: 如果你不及时更新NPM,它的表现会很差。然而,最新版本过于前沿可能会出现问题。

解决方案: 如Kraang所述,使用Node版本管理器nvm,并加上--lts标志。

安装它:

curl -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash

然后经常使用它来升级到最新的NPM“长期支持”版本:

nvm install --lts

需要注意的是:当你安装新版本npm时,很可能需要重新安装所有包。


2

2

我在Debian上遇到了同样的问题,yarn 对我来说是解决方案。


2
在@Colin D有关病毒扫描程序和Windows框的答案基础上,还有一个元素使NPM变得缓慢。Windows在下载文件时非常耗费资源,这通常不会被注意到,因为大多数情况下我们只是从单个源和文件下载单个文件或文件夹。但是使用npm时,我们要下载成千上万个文件,总下载量很容易达到GB级别。过去有人这样描述过给我听,可能有点过于简单,但是对我来说有道理:Windows下载的每个文件都包装在所使用的任何网络协议(TCP)中,然后通过Windows网络运行。通常这是可以忽略不计的,但是对于这些微小的1KB文件,它会爆炸。

希望我能提供更多正式的来源,如果有人能帮助我提供,我将不胜感激。我找到的最好的资料是这个:https://with.raidrive.com/t/very-slow-download-speed-with-small-files/3423/4

对我来说,我就是这个来源,因为我们很久以前使用SVN时遇到了这个问题。它非常缓慢,我们发现是网络数据包和病毒扫描程序的组合问题。

希望这能有所帮助。


2
我遇到了同样的问题,我使用的是nodejs版本:8.9.4npm版本:5.6.0 。 我尝试了很多在线解决方案,包括这篇文章中的方法,但都没有解决我的问题。后来我发现了yarn包管理器,这个工具解决了我的问题,所以如果所有方法都失败了,我认为值得一试的是 "yarn" 。 编辑: 看起来当npm过时时会出现问题,更新npm也有帮助。


1

我们也遇到了类似的问题(我们在企业代理后面)。在我们的Jenkins构建中改用yarn至少有很大的改善。

"npm install"和"yarn install"之间的结果存在一些细微差异,但没有什么影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接