【问题标题】:Why is "npm install" really slow?为什么“npm install”真的很慢?
【发布时间】:2017-05-22 08:23:33
【问题描述】:

设置我的包时我做错了什么?有什么办法可以加快速度吗?

  • 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

我得到以下可能需要数小时才能完全设置的信息:

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

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

我怀疑我的packages.json 或我正在运行的命令npm install 有问题。从图像中,似乎有无数次尝试检索相同的文件。可能有办法强制npm 从更稳定的镜像中检索?它默认使用的镜像选择可能是不稳定的?只是一些建议——我不知道我问的具体原因。

这个问题也出现在我的 Linode、Digital Ocean 和 VULTR 盒子上——所以我怀疑这是 npm、我使用的方式(缺少某些东西)或我的 packages.json 所特有的。

【问题讨论】:

  • 当你做npm --loglevel=silly install时有没有更有意义的输出?
  • @hardillb - 我的互联网或机器速度并不是真正的问题。可以比npm install 在同一台计算机上获取一些脚本更快地下载完整安装的 linux。相比之下,可以在 mysql 中超过 100 万条记录的非索引记录集上运行 hasrsine。
  • “我怀疑我的 packages.json 或运行 npm install 的命令有问题” - 我不这么认为。我用你的package.json 用 npm v3.5.2 和 node v4.2.6 在不到 1 分钟的时间内安装了模块。我建议你更新 node 和 npm。
  • 那是一个非常非常老的 npm 版本。如果这是在更高版本中修复的 npm 中的错误,我不会感到惊讶。你能把你的 npm 更新到最新的吗? sudo npm install -g npm@latest
  • 一般来说,不要依赖像apt这样的包管理器来维护最新的软件。我强烈建议您从 apt 中清除您安装的 node/npm 组合,并按照 nodejs.org 上的说明安装最新版本。

标签: node.js npm


【解决方案1】:

我能够从 cmets 部分解决此问题;概述下面的过程。

来自 cmets

AndreFigueiredo 声明:

我用 npm v3.5.2 和 node v4.2.6 用你的 package.json 在不到 1 分钟的时间内安装了模块。我建议你更新 node 和 npm。


v1.3.0 甚至没有在 v3 上引入扁平化的依赖关系,解决了很多烦人的问题

LINKIWI 声明:

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

观察

按照他们的建议,我注意到 CentOS、Ubuntu 和 Debian 在使用 @ 检索 当前 版本时都使用 very 过时版本的 nodejsnpm 987654332@ 或 yum(取决于操作系统的主包管理器)。

摆脱过时的nodejsnpm

为了尽可能减少头痛来解决这个问题,我运行了以下命令(在 Ubuntu 上):

apt-get purge --auto-remove nodejs npm

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

安装当前nodejs和兼容npm

下一个目标是获得nodejsnpm 的当前版本,我可以直接从here 获取nodejs 并编译或使用二进制文件,但这并不容易交换我需要的版本(取决于项目的年龄)。

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

安装nvm

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

来源.bashrc

source ~/.bashrc

使用nvm安装nodejs7.x

nvm install 7

安装后,npm 的性能快得多让我惊喜不已,它现在在抓取包时也显示了一个漂亮的进度条。

对于那些好奇的人,npm 的当前(截至此日期)版本应该如下所示(如果不是,您可能需要更新它):

总结

不要使用你的操作系统包管理器来安装 NODE.JS 或 NPM - 你会得到非常糟糕的结果,因为似乎没有操作系统保持这些包(甚至不接近)最新。如果您发现npm 运行缓慢,并且不是您的计算机或互联网,很可能是因为版本严重过时。

【讨论】:

  • 不错。 n 值得考虑作为nvm 的更简单替代品,可与curl -L https://git.io/n-install | bash 一起安装
  • 我强烈建议使用 nvm 来调整您正在运行的节点版本。 github.com/creationix/nvm
  • 对于当前版本,只需添加一个 repo,as specified on the Node.js site
  • 我同意 nvm 的建议,尤其是 --lts 标志,它将让您随时更新到最新的“长期支持”版本的 npm,它应该是最新的和稳定的。
  • 将 shell 脚本从互联网管道传输到 bash 并不是一件好事。
【解决方案2】:

我注意到的一件事是,如果您在新项目(文件夹)中工作,则必须为特定路径重新配置代理设置

  1. Cd(将终端窗口路径更改为目标文件夹。

  2. npm config set proxy http://(ipaddress):(port)

  3. npm config set https-proxy http://(ip 地址):(端口)

  4. npm install -g @angular/cli

【讨论】:

  • 您不应该为全局脚本安装设置项目特定的配置。该配置也将与项目的 package.json 文件一起分发。
【解决方案3】:

问题:如果你不及时更新 NPM,它的表现就不会很好。 但是,过去对我来说,最前沿的版本已经被打破了。

解决方案:正如 Kraang 提到的,使用节点版本管理器 nvm 及其 --lts 标志

安装它:

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

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

nvm install --lts

大警告:当您获得新的 npm 版本时,您可能必须重新安装所有软件包。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,我在nodejs version: 8.9.4npm version: 5.6.0 上。 我在网上尝试了很多解决方案,包括这篇文章中的那些,没有一个对我有用,然后我发现 yarn package manager 为我解决了这个问题,所以如果都失败了,我认为“纱线”值得一试。

    编辑:

    npm 过时时似乎有问题,更新它也对我有帮助。

    【讨论】:

      【解决方案5】:

      我正在使用 Linux 并且拥有 nvm 并使用超过 7 个版本的节点 根据我的经验,我在最新项目中遇到了同样的情况(实际上不是几个小时,而是几分钟,因为我不能等待几个小时,因为每小时的项目:))

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

      npm cache clean --force

      然后对我来说一切正常,所以看起来有时 npm 的缓存会与不同版本的 Node 混淆。

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

      【讨论】:

      • 我在 npm 的初始“加载”时遇到问题。第一条消息会持续 15-30 秒,然后就会消失。运行命令后,它解决了问题!现在它像往常一样立即开始 nodejs v8.11.3npm 5.6.0 Windows 7 x64
      • 我认为在这里添加一个关于缓存清理工作原理的简要说明(或至少一个链接)会更好
      【解决方案6】:

      我从您的屏幕截图中看到您在 Windows 上使用 WSL。而且,Windows 自带病毒扫描器,病毒扫描会导致 NPM 安装速度非常慢!

      在安装过程中添加豁免或禁用病毒扫描可以大大加快速度,但考虑到恶意 NPM 包的可能性,这可能是不可取的

      一个链接建议三倍安装时间https://ikriv.com/blog/?p=2174

      虽然我并没有对自己进行广泛的介绍

      【讨论】:

      • 我可以确认禁用实时扫描确实会提高npm install的速度。
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        我遇到了这个问题,SO 中的任何解决方案都没有帮助。我想通了,所以我把它贴在这里,以防其他人有类似的问题。

        我试图在亚马逊实例上运行 npm i。问题最终是因为 linux 只打开了一定数量的端口,当 npm i 运行时,它打开了像一千多个连接到注册表以下载所有包的事实。所以它会起作用,但然后只需冻结 15 分钟。然后会发生超时,它最终会移动到另一个端口。因此,在 AWS 的安全组中,我为 All TCP at 0.0.0.0/0 添加了一条规则,仅用于传出,让 npm 打开任意数量的传出连接并修复它。

        【讨论】:

        • 你是怎么做到的?
        【解决方案9】:

        这个链接帮助了我boost npm installs。 强制 npm 在 https 上使用 http 并禁用进度显示。

        【讨论】:

          【解决方案10】:

          我也有类似的问题。我也对一些解决方案感到困惑,让我为不同的用户显示不同的版本。 如果您有任何问题,我会首先检查您使用任何节点实现的每个帐户

          最后,这个解决方案似乎 100% 解决了这个问题,让我相信无论我想使用什么用户权限,我的版本都是通用的:

              sudo yum update
          
              sudo yum install build-essential checkinstall libssl-dev
          
              curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.1/install.sh | bash
          
              (sudo) nvm --version
          
              (sudo) nvm ls-remote
          
              (sudo) nvm install [version.number] 
          

          1

          如果您仍有问题,请尝试查看您的 /usr/local/bin 目录。如果您发现名为 node 的大型二进制文档或名为 npm 的文件夹,请删除它们。

              rm /usr/local/bin/node
          
              rm -r /usr/local/bin/npm
          

          就我个人而言,在我删除这些之前,我的两个用户帐户正在使用通过 nvm 正确安装的最新版本的 node/npm,而我的第三个帐户仍然很固执,显然仍然使用更旧的 node 和 npm 安装位于我的 /usr/local/bin/ 目录中。一旦我使用上述两个命令删除了它们,那个有问题的用户帐户就会隐式开始运行正确的安装,所有三个帐户都具有预期的版本。

          (在使用 Centos 7 Blank x64 时实现。上面使用的一些源代码最初由 'phoenixNAP Global IT services' 1 提供)

          【讨论】:

            【解决方案11】:

            我们也遇到过类似的问题(我们使用的是公司代理)。至少在我们的 jenkins 构建中更改为 yarn 产生了巨大的变化。

            “npm install”和“yarn install”之间的结果有一些细微差别——但没有什么会伤害我们。

            【讨论】:

              【解决方案12】:

              安装 nvm 并尝试它应该会有所帮助,使用以下命令:-

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

              【讨论】:

              • 你能简要解释一下这是什么,以及它将如何解决问题中的问题。
              【解决方案13】:

              我在 Windows 中找到了这个解决方案:

              第一步:使用淘宝定制的cnpm命令行工具替换默认安装的npm

              npm install -g cnpm --registry=https://registry.npm.taobao.org
              

              第二步:将npm的默认下载地址改为淘宝镜像:

              npm config set registry https://registry.npm.taobao.org/
              

              请注意,如果您以后需要发布自己的包,则需要回滚此更改:

              npm config set registry https://registry.npmjs.org/
              

              【讨论】:

                【解决方案14】:

                这对我来说效果不佳(没有删除所有内容):

                npm cache clean --force
                

                但这确实解决了我的问题:

                rm -rf ~/.npm/
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-11-06
                  • 2022-11-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-07-12
                  • 2019-10-02
                  相关资源
                  最近更新 更多