Yarn:Node.js 的包管理器
包管理器
Yarn 介绍
Yarn是 Facebook 于 2016 年 10 月与 Exponent、Google 和 Tilde 合作发布的。
Facebook Code上有一篇帖子描述了构建这个新包管理器的原因。
以下是一些亮点:
... 当我们进行内部扩展时,我们在不同的机器和用户上安装依赖项时面临一致性问题,提取依赖项所需的时间,并且 npm 客户端自动执行某些依赖项的代码的方式存在一些安全问题。
我们还必须解决 npm 的 shrinkwrap 功能的问题,我们用它来锁定依赖版本。
...根据语义版本规则,使用 npm 更新单个依赖项也会更新许多不相关的依赖项。
Yarn 的许多优点尚未为人们所熟知。本指南将探讨 Yarn 相对于 npm 的优势,并介绍一些基本命令,帮助新用户习惯定期使用 Yarn。
这是Yarn 的 Github 页面。这是一个非常受欢迎的项目;在撰写本文时,它有 21,500 个星标和 500 多个未解决的问题。Yarn 与 npm 注册表兼容,具有与 npm 相同的功能集,但运行速度更快,更可靠。让我们来看看。
安装
您可以使用 npm 安装 yarn,但不建议这样做:
npm install -g yarn
相反,如果您使用的是 Windows,请下载安装程序(您需要安装 Node.js)。
如果你使用的是 iOS 或 Unix 环境,最简单的方法是通过 shell 脚本:
curl -o- -L https://yarnpkg.com/install.sh | bash
您可以在此页面找到更多信息和其他安装方法。
工作原理
我们知道,Node.js 依赖项放在项目的node_modules目录中。
这些依赖项以非确定性的方式安装,这意味着目录结构和依赖项树取决于依赖项的安装顺序。这种依赖项是有问题的,因为它可能因机器而异。
为了解决这个问题,Yarn 使用锁文件(yarn.lock )来确保每个人都拥有每个文件的相同版本,从而导致所有机器上的node_modules目录的文件结构完全相同。
解析依赖项后,Yarn 首先在本地(全局)缓存中查找包是否已下载。 借助 Yarn 高效排队和并行处理请求的能力,Yarn 的速度比 npm 更快。
因此让我们测试一下。
NPM 与 Yarn
这里概述的比较是使用 npm 4.05 和 Yarn 0.18.1 进行的。
要使用 npm 初始化项目,我们使用npm init:
Yarn 具有相同的init命令,但问题和答案略有不同:
要安装依赖项并将其保存到package.json,例如express(它有 20 多个依赖项),我们在 npm 中执行:
npm install --save express
使用纱线:
yarn add express
使用 Yarn 的一个小优点是你需要输入的内容更少。好吧,只要你不使用像npm i -S express这样的别名。
但是让我们对这些命令的执行进行计时。
Npm:
纱:
从图片中可以看出,npm 花费了 3.120 秒,而 Yarn 花费了 2.588 秒。
您还可以看到 Yarn 的输出更具描述性且更漂亮。不过表情符号仅在 Mac 上可用。
现在,让我们删除node_modules目录并重复测试以查看 Yarn 的缓存实际作用:
这次,Yarn 耗时 1.455 秒,比上次执行节省了 44%。比 npm 节省了 53%。
当然,您可能会得到不同的结果,但Yarn 每次都会击败 npm。
我们还可以看到生成了一个yarn.lock文件(为简洁起见省略了一些部分):
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
accepts@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
dependencies:
mime-types "~2.1.11"
negotiator "0.6.1"
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
content-disposition@0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b"
content-type@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
cookie-signature@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
cookie@0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
debug@~2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
dependencies:
ms "0.7.1"
depd@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
encodeurl@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
etag@~1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8"
express@^4.14.0:
version "4.14.0"
resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66"
dependencies:
accepts "~1.3.3"
array-flatten "1.1.1"
content-disposition "0.5.1"
content-type "~1.0.2"
cookie "0.3.1"
cookie-signature "1.0.6"
debug "~2.2.0"
depd "~1.1.0"
encodeurl "~1.0.1"
escape-html "~1.0.3"
etag "~1.7.0"
finalhandler "0.5.0"
fresh "0.3.0"
merge-descriptors "1.0.1"
methods "~1.1.2"
on-finished "~2.3.0"
parseurl "~1.3.1"
path-to-regexp "0.1.7"
proxy-addr "~1.1.2"
qs "6.2.0"
range-parser "~1.2.0"
send "0.14.1"
serve-static "~1.11.1"
type-is "~1.6.13"
utils-merge "1.0.0"
vary "~1.1.0"
...
vary@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140"
请注意,Yarn 使用https://registry.yarnpkg.com而不是https://registry.npmjs.org。
在NodeUp 的播客节目中(大约 40:30 处),James Kyle(Yarn 的主要开发人员之一)表示,目前,registry.yarnpkg.com只是一个 CNAME 记录,它会转到Cloudflare网络并重定向到 NPM 注册表以用于实验目的,并添加一些性能功能。
现在将其与执行npm shrinkwrap时生成的文件npm-shrinkwrap.json(其用途与yarn.lock类似)进行比较(为简洁起见,省略了一些部分):
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~