Skip to main content

Yarn 管理 JavaScript 模块

发布于2021-11-26 14:18:24阅读 1210

Yarn 简介

Yarn 是 Facebook 开发的一款新的 JavaScript 包管理工具, 作为 NPM 的替代产品,主要是为了解决下面两个问题:

  • 安装的时候无法保证速度/一致性
  • 安全问题,因为 NPM 安装时允许运行代码

Yarn vs NPM

速度快

相比于 NPM,Yarn 的速度更快,Yarn 会把使用过的模块在本地缓存一份,如果下次还要用到相同版本的模块,那么将会直接使用本地的而不是访问网络重新获取一份。而 NPM 使用的时候,如果不全局安装那么每个项目都要重新下载一次包,浪费时间和资源。

安全性

Yarn 在安装模块之前会验证文件完整性。

并行安装

每当 NPM 或 Yarn 需要安装一个包时,它会进行一系列的任务。在 NPM 中这些任务是按包的顺序一个个执行,这意味着必须等待上一个包被完整安装才会进入下一个;Yarn 则并行的执行这些任务,提高了性能。

输出清晰

NPM 安装包的时候输出惨不忍睹,而 Yarn 的输出就清晰多了。

;

使用

常用命令对照表

作用NPM 命令Yarn 命令
初始化npm inityarn init
安装 package.json 中的包npm installyarn
安装某个包npm install xxx --saveyarn add xxx
删除某个包npm uninstall xxx --saveyarn remove xxx
开发模式下安装某个包npm install xxx --save-devyarn add xxx -dev
更新npm update --saveyarn upgrade
全局安装npm install xxx –globalyarn global add xxx
清除缓存npm cache cleanyarn cache clean
查看模块信息npm info xxxyarn info xxx
运行scriptnpm runyarn run
测试npm testyarn test

yarn.lock 文件

在使用 NPM 管理 JavaScript 模块的时候,可以用比较宽松的方式定义某个模块的版本信息,如

*: 任意版本
~1.1.0: >=1.1.0 && < 1.2.0
^1.1.0: >=1.1.0 && < 2.0.0
>= 1.0.0: >= 1.0.0
3.x: 任意 3 版本

复制

理想状态下使用语义化版本发布补丁不会包含大的变化,但不幸的很多时候并非如此。NPM 的这种策略可能导致两台拥有相同 package.json 文件的电脑安装了不同版本的包,这可能导致一些错误。很多模块的安装错误和环境问题都是由于这个原因导致。

为了避免包版本的错误匹配,一个确定的安装版本被固定在一个锁文件中。每次模块被添加时,Yarn 就会创建(或更新) yarn.lock 文件,这样你就可以保证其它电脑也安装相同版本的包,同时包含了 package.json 中定义的一系列允许的版本。

在 npm 中同样可以使用 npm shrinkwrap 命令来生成一个锁文件,这样在使用 npm install 时会在读取 package.json 前先读取这个文件,就像 Yarn 会先读取 yarn.lock 一样。这里的区别是 Yarn 总会自动更新 yarn.lock,而 npm 需要你重新操作。

yarn install

npm install 命令会根据 package.json 安装依赖以及允许你添加新的模块; yarn install 仅会按照 yarn.lock 或 package.json 里面的依赖顺序来安装模块。

yarn add [–dev]

与 npm install 类似,yarn add 允许你添加与安装模块,添加依赖的同时也会将依赖写入 package.json,类似 npm 的 --save 参数;Yarn 的 --dev 参数则是添加开发依赖,类似 npm 的 --save-dev 参数。

yarn global

不像 npm 添加 -g 或 --global 可以进行全局安装,Yarn 使用的是 global 前缀(yarn global add xxx)。global 前缀只能用于 yarn add, yarn bin, yarn ls 和 yarn remove。

yarn why

该命令会查找依赖关系并找出为什么会将某些包安装在你的项目中。也许你知道为什么添加,也许它只是你安装包中的一个依赖,yarn why 可以帮你找出。

;

总结

相比 NPM,Yarn 可以方便生成锁文件,安装模块时非常迅速并且会将依赖自动添加进 package.json,模块可以并行安装。不过个人认为,Yarn 的优势不是绝对的,毕竟 NPM 久经考验,或许不久的将来,NPM 也会拥有这些特性。