1.介绍

Node.js 生态系统中,依赖通常安装在项目的 node_modules 文件夹中。然而,这个文件的结构和实际依赖树可能有所区别,因为重复的依赖可以合并到一起。npm 客户端把依赖安装到 node_modules 目录的过程具有不确定性。这意味着当依赖的安装顺序不同时,node_modules 目录的结构可能会发生变化。这种差异可能会导致类似 “我的电脑上可以运行,别人的电脑上不行” (即:完整可运行的项目上传到 git 上,别人 Pull 下来以后,npm install 会报错) 的情况,并且通常需要花费大量时间来解决依赖问题。

Yarn 一开始的主要目标是解决npm中由于语义版本控制而导致的安装不确定性问题。

虽然可以用 npm shrinkwrap 来实现可预测的依赖关系树,但它并不是默认选项,而是取决于所有的开发人员指导并启用这个选项;且npm 5+ 以后的版本加入了 package-lock.json 可以用来锁版本,版本更清楚,但是不向后兼容。(npm-shrinkwrap.json 向后兼容 npm 2-4)

例如,比如在一个空项目里执行以下命令:

npm init -y
npm install globule@0.1.0 -S
npm install babel-generator@6.19.0 -S
npm install babel-helper-define-map@6.18.0 -S

这里安装了 3 个包都依赖于 lodash,不过 globule 依赖 lodash@1.0.3,另外两个依赖 lodash@4.x。现在目录依赖结构如下:
在这里插入图片描述
假设我们在项目里使用 lodash,但是忘记重新安装 lodash

var lodash = require('lodash')
console.log(lodash.VERSION)  // v1.0.3

另一个同事获取项目代码,执行 npm install,这时的目录依赖结构里面,第一层依赖的 lodash 变成了 4.x 版本,这样就造成了依赖版本不一致的问题。而 yarn 则会保证无论怎样引入的顺序,目录依赖结构都是一致的,确保不会发生这样的 BUG


所以 Yarn 就是一个类似于 npm 的包管理工具,它是由 facebook 推出并开源。但它与 npm 相比,yarn 有着众多的优势,主要的优势在于:速度快、离线模式、版本控制

  • npm 会等一个包完全安装完才跳到下一个包,但 yarn 会并行执行包,因此速度会快很多,而且还能并行化操作以最大化资源利用率,安装速度之快前所未有;
  • Yarn 会缓存它下载的每个包,所以无需重复下载,这样做的本质还是会提高安装下载的速度,避免不必要的网络请求;
  • 保证各平台依赖的一致性;
  • 力求网络资源最大利用化,让资源下载完美队列执行,避免大量的无用请求,下载失败会自动重新请求,避免整个安装过程失败;
  • 对于不匹配的依赖版本的包创立一个独立的包,避免创建重复的。对于多个包依赖同一个子包的情况,yarn 会尽量提取为同一个包,防止出现多处副本,浪费空间。

yarn通过生成yarn.lock文件实现版本固定,文件内会描述包自身的版本号,还会锁定所有它依赖的包的版本号,确保从本地开发到生产环境,所有机器上都有精确相同的依赖版本。

但是我们在使用 Yarn 时,依然要访问 npm 仓库,但 Yarn 能够更快速地安装软件包和管理依赖关系,并且可以在跨机器或者无网络的安全环境中保持代码的一致性。

2.安装及配置

可前往官网下载安装,或者更为简便的方式是通过npm直接安装:

npm install -g yarn

关于为什么使用 -g 全局安装,可以参考:https://neveryu.github.io/2017/04/10/npm/;关于 npm 的安装和源配置等可以参考:Node.js在Windows下安装和配置

修改yarn的默认配置路径:

# 改变 yarn 全局bin位置
yarn config set prefix "D:\Develop\nodejs\bin"
# 改变 yarn 全局安装位置
yarn config  set global-folder "D:\Develop\nodejs\node_global"
# 改变 yarn 全局cache位置
yarn config set cache-folder "D:\Develop\nodejs\node_cache"
# 改变 yarn 全局 link 位置
yarn config set link-folder "D:\Develop\nodejs\bin\link"

查看配置的路径:

# 查看 yarn 全局bin位置
yarn global bin
# 查看 yarn 全局安装位置
yarn global dir
# 查看 yarn 全局cache位置
yarn cache dir

使用第三方软件 yrm 快速修改、测试和切换 yarn 镜像源:

# 安装
npm install -g yrm

# 列出当前可用的所有镜像源
yrm ls

# npm -----  https://registry.npmjs.org/
# cnpm ----  http://r.cnpmjs.org/
# taobao --  https://registry.npm.taobao.org/
# nj ------  https://registry.nodejitsu.com/
# rednpm -- http://registry.mirror.cqupt.edu.cn
# skimdb -- https://skimdb.npmjs.com/registry
# yarn ----  https://registry.yarnpkg.com

# 测试访问速度
yrm test taobao

# 使用淘宝镜像源
yrm use taobao

4.常用命令和比较

# install安装是yarn的默认行为
npm install === yarn

# taco包立即被保存到 package.json 中。
npm install taco --save === yarn add taco

npm uninstall taco --save === yarn remove taco

npm install taco --save-dev === yarn add taco --dev

npm update --save === yarn upgrade

npm install taco@latest --save === yarn add taco

# 一如既往,请谨慎使用 global 标记。
npm install taco --global === yarn global add taco

npm init === yarn init

npm init --yes/-y === yarn init --yes/-y

npm link === yarn link

npm outdated === yarn outdated

npm publish === yarn publish

npm run === yarn run

npm cache clean === yarn cache clean

npm login === yarn login

npm test === yarn test

yarn 独有的命令:

# 允许你检查依赖的许可信息
yarn licenses ls
# 自动创建依赖免责声明 license
yarn licenses generate
# 检查为什么会安装 taco,详细列出依赖它的其他包
yarn why taco
# 检查为什么会安装 vuepress,详细列出依赖它的其他包
yarn why vuepress

5.特性

  • 同时兼容 npm 与 bower 工作流,并支持两种软件仓库混合使用;
  • 可以限制已安装模块的协议,并提供方法输出协议信息;
  • 提供一套稳定的共有 JS API,用于记录构建工具的输出信息;
  • 可读、最小化、美观的 CLI 输出信息。

6.Windows下运行报错

Windows下运行yarn命令出现如下错误:
在这里插入图片描述
管理员的身份运行powershell,执行如下命令即可:

set-ExecutionPolicy RemoteSigned

注意:重启命令行!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐