Yarn 构建工具基础
npm是一个非常优秀全面且广受欢迎的包管理工具,yarn就是一个类似于npm的包管理工具,它是由facebook推出并开源。鉴于facebook在前端界的影响力,yarn一面世就很受瞩目,受到了前端界的广泛欢迎。
与npm相比,yarn主要的优势在于:速度快、离线模式、版本控制
为什么快
npm会等一个包完全安装完才跳到下一个包,但yarn会并行执行包,因此速度会快很多。
离线模式
安装过的包会被保存进缓存目录,以后安装就直接从缓存中复制过来,这样做的本质还是会提高安装下载的速度,避免不必要的网络请求。
版本控制
- npm一个痛点是:当包的依赖层次比较深时,版本控制不够精确。npm可能导致两台拥有相同
package.json
文件的机子安装了不同版本的包,这可能导致一些错误。你可以使用npm-shrinkwrap来实现版本固化,版本信息会写入npm-shrinkwrap.json
文件中,但它毕竟不是npm的标准配置。 - 而yarn天生就能实现版本固化。会生成一个类似npm-shrinkwrap.json的
yarn.lock
文件,文件内会描述包自身的版本号,还会锁定所有它依赖的包的版本号 yarn.lock
存储这你的每个包的确切依赖版本,能确保从本地开发到生产环境,所有机器上都有精确相同的依赖版本。
- npm一个痛点是:当包的依赖层次比较深时,版本控制不够精确。npm可能导致两台拥有相同
基本使用
安装
1
npm install yarn -g]
初始化新项目
1
yarn init
初始化后会生成一个yarn-error.log文件
添加依赖包
1
2
3yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]将依赖项添加到不同依赖项类别
1
2
3yarn add [package] --dev
yarn add [package] --peer
yarn add [package] --optional分别添加到 devDependencies、peerDependencies 和 optionalDependencies.
升级依赖包
1
2
3yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]移除依赖包
1
yarn remove [package]
安装项目的全部依赖
1
2
3yarn
或者
yarn install
如果你刚从github/coding上clone了一个项目,你需要yarn install 项目所有的依赖包。Yarn会从 package.json 中读取依赖,并将依赖信息存储到yarn.lock中。
其他安装命令
安装所有的包:yarn / yarn install
安装一个且只有一个版本的包: yarn install –flat
强制重新下载所有包:yarn install –force
只安装生产环境依赖:yarn install –production
Yarn vs npm: CLI 的差异
除了一些功能差异,Yarn 命令也存在一些区别。例如移除或修改了一些 npm 命令以及添加了几个有趣的命令。
yarn global
不像 npm 添加 -g
或 --global
可以进行全局安装,Yarn 使用的是 global
前缀。不过与 npm 类似,项目依赖不推荐全局安装。
global
前缀只能用于 yarn add
, yarn bin
, yarn ls
和 yarn remove
,除yarn add
外,这些命令都和 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 licenses [ls|generate-disclaimer]
npm 没有类似命令来方便编写自己的包。yarn licenses ls
列出所有已安装包的许可协议。yarn licenses generate-disclaimer
生成包含已安装包许可协议的免责声明。某些协议要求使用者必须在项目中包含该协议,这时候该命令将变得非常好用。
yarn why
该命令会查找依赖关系并找出为什么会将某些包安装在你的项目中。也许你明确为什么添加,也许它只是你安装包中的一个依赖,yarn why
可以帮你弄找出。
yarn upgrade
该命令会根据符合 package.json
设定的规则而不是 yarn.lock
定义的确切版本来将包更新到最新版本。如果想用 npm 来实现相同目的,可以这样执行:
1 | rm -rf node_modules |
不要将该命令与 npm update
混淆,它指的是更新到自己的最新版。
yarn generate-lock-entry
yarn generate-lock-entry
会基于 package.json
设置的依赖生成 yarn.lock
文件,该命令与 npm shrinkwrap
类似,但应该小心使用,因为通过 yarn add
和 yarn upgrade
命令添加或更新依赖时会自动更新生成该锁文件。
下面介绍一些常用的命令:
yarn
和yarn install
,这两个命令的效果是一样的,等同于npm install
,使用这个命令会在该目录生成一个yarn.lock的文件。yarn add koa
,安装koa
模块并更新package.json和yarn.lock文件,等同于npm install koa --save
。也可以使用yarn global add koa
,等同于npm install koa -g
,将模块直接安装到全局环境变量里,方便使用。yarn list
,根据当前项目的package.json查看模块的依赖及版本。yarn info koa
,查看koa
模块的详细信息,类似于npm view koa
。yarn init
,初始化项目package.json文件,等同于npm init
。yarn run
,运行package.json中的script
。
注意 : 之前说了npm存在一些历史遗留问题 比如说你的项目模块依赖是图中描述的,@1.2.1
代表这个模块的版本。在你安装A的时候需要安装依赖C和D,很多依赖不会指定版本号,默认会安装最新的版本,这样就会出现问题:比如今天安装模块的时候C和D是某一个版本,而当以后C、D更新的时候,再次安装模块就会安装C和D的最新版本,如果新的版本无法兼容你的项目,你的程序可能就会出BUG,甚至无法运行。这就是npm的弊端,而yarn为了解决这个问题推出了yarn.lock的机制,这是作者项目中的yarn.lock文件。大家会看到,这个文件已经把依赖模块的版本号全部锁定,当你执行yarn install
的时候,yarn会读取这个文件获得依赖的版本号,然后依照这个版本号去安装对应的依赖模块,这样依赖就会被锁定,以后再也不用担心版本号的问题了。其他人或者其他环境下使用的时候,把这个yarn.lock拷贝到相应的环境项目下再安装即可,注意:这个文件不要手动修改它,当你使用一些操作如yarn add
时,yarn会自动更新yarn.lock。