npm / yarn install 期间的 "Linking Dependencies" 到底做了什么?

What does "Linking Dependencies" during npm / yarn install really do?

对于大型网络应用程序 npm install yarn install 确实需要很多时间,主要是在称为 Linking Dependencies 的步骤中。这里发生了什么?它是在获取依赖项的依赖项吗?或者完全不同的东西?在此步骤中创建了哪些文件?

链接阶段主要分为 3 个大步骤:

  1. 找到每个需要在 node_modules
  2. 中的文件
  3. 检查此列表与已有的列表,找出需要复制的内容 从缓存到 node_modules
  4. 复制

也许 Github 上的这个问题会对您有所帮助。

https://github.com/yarnpkg/yarn/issues/1496

当您调用 yarn install 时,会依次发生以下事情:

  1. 解决方案:Yarn starts 通过向注册表发出请求并递归查找每个依赖项来解决依赖项。

  2. Downloading/Fetching:接下来,Yarn 在全局缓存目录中查找是否已经下载了所需的包。如果没有,Yarn 会获取包的 tarball 并将其放在全局缓存中,这样它就可以离线工作并且不需要多次下载依赖项。依赖项也可以作为 tarballs 用于完全离线安装。

  3. Linking:最后,Yarn 将所有需要的文件从全局缓存复制到本地 node_modules 目录,然后识别出什么已经存在,还有什么不存在。


yarn install does take a lot of time, mostly in a step called Linking Dependencies

您应该注意到 Step 3: Linking 比实际下载发生的 Step 1: ResolutionStep 2: Fetching 花费更多的时间。在这一步中我们已经准备好并下载了我们需要的东西,那为什么要花这么长时间,我们错过了什么吗?

是,COPY 到本地项目到 node_modules 文件夹...!这样做的原因是这个副本不等同于复制一个 4.7GB 的大 ISO 文件。相反,它是多个超级小文件(当我说多个时不要轻视它,它可以是 15k+ 文件 :P ),因此需要花费很多时间来复制。 (另外,重要的是要注意,当你下载包时,你会为每个包下载一个大的 tar 文件,然后将其内容提取到缓存中,这也需要时间)

由于

速度较慢
  • 防病毒软件:你的防病毒软件处于中间位置,对每个正在尝试的文件进行快速检查(除了我们的 yarn 检查它是否已经存在)复制将其速度降低这么多。如果您使用 Windows,请尝试将项目的父文件夹添加为 Windows Defender 的例外。
  • 存储介质的传输速率:SSD 可以极大地提高这个速度(抱歉,SSHD 和 FireCudas 也无济于事,这是一次)。

但这有效率吗?我可以从全局 node_modules 中获取它吗(在创建一个之后)?

两个问题都没有。由于节点的工作方式,每个包只能找到与其自身位置相关的依赖项。也因为每个项目可能希望使用同一包的不同版本以确保其正常工作并且不会被包更新破坏。

理想情况下,项目文件夹应该是精简的。一种有效的方法是创建一个 global node_modules 文件夹。如果不存在并从该位置使用,则下载任何和所有请求的包。实际上 Ruby 是这样做的。这是我的全局 Ruby 相当于 node_modules 文件夹。请注意在不同项目中使用同一包的不同版本。

但请记住,这会降低项目的可移植性。这是任何管理器(无论是 rubygems 还是节点模块)都必须做出的权衡。我可以只复制节点项目文件夹(这实际上可能需要几个小时,因为您也将复制(本地)node_modules 文件夹,但如果我只有那个项目文件夹,我可以期望它可以工作,而不是复制一个 ruby 项目只需要几秒钟到几分钟,因为没有本地包(或他们所说的 gems)文件夹,但是 运行 不同系统上的项目需要这些包存在于全局 gems 文件夹中。

可在此处找到 yarn install 的文档。

您可以使用命令

yarn install --verbose

Show additional logs while installing dependencies

输出将显示 yarn/npm 安装正在做什么。

在进程失败或花费很长时间的情况下有利于调试。