适用于大型网络应用npm install
。 yarn install
确实需要花费大量时间,主要是在Linking Dependencies
的步骤中。这里发生了什么?它是否获取依赖项的依赖项?还是完全不同的东西?在此步骤中创建了哪些文件?
答案 0 :(得分:15)
当您致电yarn install
时,会按顺序执行以下操作:
解决方案:Yarn通过向注册表发出请求并以递归方式查找每个依赖项来开始解析依赖项。
下载/获取:接下来,Yarn查找全局缓存目录以查看是否已下载所需的包。如果它还没有,Yarn会获取包的tarball并将其放在全局缓存中,这样它就可以脱机工作,并且不需要多次下载依赖项。依赖关系也可以作为tarball用于完全脱机安装。
链接:最后,Yarn在识别出已经存在的内容和内容之后,将全局缓存中所需的所有文件复制到本地node_modules目录中,从而将所有文件链接在一起。不在那里。
的步骤中
yarn install
确实需要花费大量时间,主要是在名为Linking Dependencies
您应该注意到Step 3: Linking
所花费的时间超过实际下载所需的Step 1: Resolution
和Step 2: Fetching
。在这一步中,我们已经有了我们需要准备和下载的东西,那么为什么它需要很长时间,我们是否错过了什么?
是, COPY 到本地项目进入node_modules
文件夹......!原因是此副本不等同于复制一个大的4.7GB ISO文件。取而代之的是它的多个超级小文件(当我说多个文件时,它不能点亮它,它可能是15k +文件:P),因此需要花费大量时间来复制。 (另外,请务必注意,下载软件包时,每个软件包下载一个大的 tar 文件,然后将其内容提取到缓存中,这也需要时间)
由于
而变慢但这有效吗?我是否可以从全局node_modules中获取它(在创建一个之后)?
两个问题都没有。由于节点的工作方式,每个包只能相对于自己的位置找到它的依赖关系。此外,因为每个项目可能希望使用相同软件包的不同版本,以确保其正常工作,而不会因软件包更新而中断。
理想情况下,项目文件夹应该是精简的。这样做的有效方法是拥有全局 node_modules
文件夹。如果尚未提供任何和所有请求的包,则从该位置使用并使用。实际上Ruby
就是这样做的。这是我的全球 Ruby 等同于node_modules
文件夹。请注意同一个包的不同版本的存在,以便在不同的项目中使用。
但请记住,它会降低项目的可移植性。任何经理(无论是rubygems还是节点模块)必须做出的权衡取舍。我可以复制节点项目文件夹(实际上可能需要几个小时,因为你将复制(本地)node_modules
文件夹,但是如果我只有那个项目文件夹,我可以期待它工作复制ruby项目只需几秒到几分钟,因为没有本地包(或称为他们称之为宝石)文件夹,但在不同系统上运行项目将需要这些包存在于全局gems文件夹中。 / p>
答案 1 :(得分:0)
链接阶段基本上分三个步骤:
也许Github上的这个问题会帮助你。
答案 2 :(得分:0)
您可以使用命令
yarn install --verbose
检查yarn / npm安装的实际作用