纱线现代带有插头和“零安装”的纱线
#javascript #tooling #yarn #plugnplay

自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的文件,递归(和不加代)一直搜索到正在运行的计算机的主目录。随着安装文件的量以及不同的statreaddir调用,这种传统方法在时空的昂贵。每分钟在安装节点模块和引导您的应用程序上花费的每一分钟都是从某人的口袋里拿出的钱。< / 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加载它,而不是从远程存储库中获取它。这是一个不错的触摸。

接下来,我们将在项目的根部创建一个小文件,该文件加载lodashindex.js

const _ = require('lodash');

console.log(_.camelCase('FOO_BAR_BAZ'));

运行node index.js我们得到以下内容:

fooBarBaz

正如预期的那样,我们正在加载node_moduleslodash。提交此更改。接下来,我们将启用插件。

添加插件

要添加插件,我们需要更改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 patchyarn patch-commitpackageDependenciesThere is also some additional work needed to get your IDE to work with Plug'n'Play.我将在以后的帖子中介绍这些主题。

带有插件的纱线和零安装程序是包装管理器景观的令人兴奋的补充。跳过需要在每个构建上安装节点模块的需求,都会更快地部署。获得最新的依赖关系就像运行git pull一样简单。虽然起初似乎是非常规的,但一旦采用,它就会提高团队的整体生产力。