自2016年Facebook发布纱线以来,它已成为开发人员的重要工具。根据Stack Overflow的2022年对70,000名开发人员的调查,其中27%的受访者使用纱线。 Yarn引入锁定文件和并行下载,推动了JavaScript依赖管理工具可以做什么的信封。版本2的发行版(称为Yarn Modern或Yarn Berry)与Zero-Installs一起引入了Plug'n'Play。在本文中,我将引导您使用现代纱线创建一个项目,并在我们使用时添加插件和零安装。
什么是插头播放和零装置?
插件播放是安装项目依赖项的策略。零安装是纱线功能的集合,用于使您的项目尽可能快,稳定。
您是否遇到了仅用rm -rf node_modules
解决的项目依赖性问题?还是在计算机上运行节点脚本可行,但是同样的脚本无法在同事的上运行?纱线文档将其称为“node_modules problem”。
node_modules问题是指使用Node Resolution Algorithm查找项目依赖性而引起的效率低下。节点分辨率算法查找require
d或import
d的文件,递归(和不加代)一直搜索到正在运行的计算机的主目录。随着安装文件的量以及不同的stat
和readdir
调用,这种传统方法在时空的昂贵。每分钟在安装节点模块和引导您的应用程序上花费的每一分钟都是从某人的口袋里拿出的钱。< / p>
Plug'n'play和Zero-installs提供了一个解决方案:用拉链的加速文件替换大型node_modules
下载。
用纱线现代建立一个新项目
首先,我们需要升级到最新版本的纱线。
npm i yarn -g
我们将创建一个新文件夹,并在其中使用纱线设置Git回购。
mkdir yarn-modern
cd yarn-modern
git init
yarn init -y
运行ls -l
应该向我们显示以下文件:
.editorconfig
.gitignore
README.md
package.json
yarn.lock
我们需要设置我们的项目,以在node_modules
文件夹中安装依赖项。我们可以通过从终端运行yarn config set nodeLinker: node-modules
来做到这一点。这向我们显示了以下输出:
➤ YN0000: Successfully set nodeLinker to 'node-modules'
运行该命令创建一个带有以下内容的.yarnrc.yml
文件:
nodeLinker: node-modules
我们想提交这些文件。这样做将使我们能够运行git status
以查看随后的隔离变化。在此之前,我们需要更改.gitignore
。
让我们首先看一下.gitignore
的内容:
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
# Swap the comments on the following lines if you don't wish to use Zero-Installs
# Documentation here: https://yarnpkg.com/features/Zero-Installs
!.yarn/cache
#.pnp.*
我们不想忽略许多.yarn
文件夹。他们可以实现目的,但它们超出了本文的范围。查看底部,有以下评论:
如果您不想使用零安装词,请在以下行上交换评论
通过遵循这些说明,我们将关闭零安装,这是我们运行yarn init -y
时为我们设置的。现在将其关闭将有助于我们更好地了解零启动时的工作方式。
将.gitignore
的底部更新为:
#!.yarn/cache
.pnp.*
也将node_modules
添加到.gitignore
。
完成此操作后,提交更改。
让我们添加lodash
作为依赖关系。
yarn add lodash
运行git status
我们应该看到一个熟悉的景象:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: package.json
modified: yarn.lock
运行ls -l
,我们看到一个node_modules
文件夹。我们还有一个.yarn
文件夹。 .yarn
文件夹带有一个cache
文件夹,以及一个install-state.gz
文件夹。我们不会介绍install-state.gz
的作用,但是you can find out more about the files and folders that can end up in your koude13 folder here. .yarn/cache
拥有我们项目依赖性的本地缓存副本。
ls -ls .yarn/cache
将向我们展示类似的东西:
lodash-npm-4.17.21-6382451519-eb835a2e51.zip
如果要删除node_modules
并重新运行yarn install
,它将从.yarn/cache
加载它,而不是从远程存储库中获取它。这是一个不错的触摸。
接下来,我们将在项目的根部创建一个小文件,该文件加载lodash
,index.js
。
const _ = require('lodash');
console.log(_.camelCase('FOO_BAR_BAZ'));
运行node index.js
我们得到以下内容:
fooBarBaz
正如预期的那样,我们正在加载node_modules
的lodash
。提交此更改。接下来,我们将启用插件。
添加插件
要添加插件,我们需要更改nodeLinker
配置值。在您的终端中运行以下命令:
yarn config set nodeLinker pnp
成功完成,将输出以下内容:
➤ YN0000: Successfully set nodeLinker to 'pnp'
您还可以通过打开.yarnrc.yml
并将nodeLinker
更改为pnp
:
来手动更改此设置
nodeLinker: pnp
运行yarn install
。您应该在输出中的某个地方看到以下行:
➤ YN0031: │ One or more node_modules have been detected and will be removed. This operation may take some time.
运行ls -l
应该表明不再有node_modules
目录。让我们确保我们的index.js
文件仍在工作:
node index.js
嗯!我们有一个错误,看起来像这样:
node:internal/modules/cjs/loader:942
throw err;
^
Error: Cannot find module 'lodash'
Require Stack:
...
使用插件播放需要使用yarn
二进制文件,就像这样:
yarn node index.js
它有效!运行yarn node index.js
,我们可以从index.js
文件中看到console.log
。而不是node_modules
,我们的依赖项是从.yarn/cache
加载。
零安装
要使用插件实现零安装状态,我们需要对.gitignore
进行更新,用以下内容替换其内容:
.yarn/*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
运行git status
,您会看到先前忽略的纱线缓存文件以及.pnp.cjs
显示为未跟踪的文件。我们将将这些文件提交给回购。通过将.yarn/cache
文件与.pnp.cjs
文件一起添加到存储库中,我们如何实现零安装。 Yarn's website has a good description of what the koude54 file is used for:
.pnp.cjs文件包含各种地图:一个链接的软件包名称和版本到磁盘上的位置,另一个链接的软件包名称和版本与其依赖性列表。使用这些查找表,纱线可以立即告诉Node在哪里可以访问任何包装,只要它们是依赖树的一部分,并且只要此文件加载到您的环境中。
将您的依赖性添加到您的存储库中可能会感到很奇怪,但是您很快就会习惯它。
如果您将插件播放到一个新项目中,则可能会遇到一些挑战。与其他JavaScript软件包经理相比,Plug'n'play更严格。这是设计。第三方软件包可能没有以符合插件的严格性质的方式列出其依赖项。这要么是其他软件包经理工作方式的功能或错误。这完全取决于您如何看待它。 Yarn Modern提供了应对这些挑战的工具:yarn patch
,yarn patch-commit
和packageDependencies
。 There is also some additional work needed to get your IDE to work with Plug'n'Play.我将在以后的帖子中介绍这些主题。
带有插件的纱线和零安装程序是包装管理器景观的令人兴奋的补充。跳过需要在每个构建上安装节点模块的需求,都会更快地部署。获得最新的依赖关系就像运行git pull
一样简单。虽然起初似乎是非常规的,但一旦采用,它就会提高团队的整体生产力。