Yarn 构建工具基础

npm是一个非常优秀全面且广受欢迎的包管理工具,yarn就是一个类似于npm的包管理工具,它是由facebook推出并开源。鉴于facebook在前端界的影响力,yarn一面世就很受瞩目,受到了前端界的广泛欢迎。

与npm相比,yarn主要的优势在于:速度快、离线模式、版本控制

  • 为什么快

    npm会等一个包完全安装完才跳到下一个包,但yarn会并行执行包,因此速度会快很多。

  • 离线模式

    安装过的包会被保存进缓存目录,以后安装就直接从缓存中复制过来,这样做的本质还是会提高安装下载的速度,避免不必要的网络请求。

  • 版本控制

    1. npm一个痛点是:当包的依赖层次比较深时,版本控制不够精确。npm可能导致两台拥有相同 package.json 文件的机子安装了不同版本的包,这可能导致一些错误。你可以使用npm-shrinkwrap来实现版本固化,版本信息会写入npm-shrinkwrap.json文件中,但它毕竟不是npm的标准配置。
    2. 而yarn天生就能实现版本固化。会生成一个类似npm-shrinkwrap.json的yarn.lock文件,文件内会描述包自身的版本号,还会锁定所有它依赖的包的版本号
    3. yarn.lock存储这你的每个包的确切依赖版本,能确保从本地开发到生产环境,所有机器上都有精确相同的依赖版本。

基本使用

  1. 安装

    1
    npm install yarn -g]
  2. 初始化新项目

    1
    yarn init

    初始化后会生成一个yarn-error.log文件

  3. 添加依赖包
    1
    2
    3
    yarn add [package]
    yarn add [package]@[version]
    yarn add [package]@[tag]
  4. 将依赖项添加到不同依赖项类别

    1
    2
    3
    yarn add [package] --dev
    yarn add [package] --peer
    yarn add [package] --optional

    分别添加到 devDependencies、peerDependencies 和 optionalDependencies.

  5. 升级依赖包

    1
    2
    3
    yarn upgrade [package]
    yarn upgrade [package]@[version]
    yarn upgrade [package]@[tag]
  6. 移除依赖包

    1
    yarn remove [package]
  7. 安装项目的全部依赖

    1
    2
    3
    yarn
    或者
    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 lsyarn remove,除yarn add 外,这些命令都和 npm 等效。

yarn install

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

  1. yarn install 文档
  2. npm install 文档

yarn add [–dev]

npm install 类似,yarn add 允许你添加与安装模块,就像命令的名称一样,添加依赖意味着也会算定将依赖写入 package.json,类似 npm 的 --save 参数;Yarn 的 --dev 参数则是添加开发依赖,类似 npm 的 --save-dev 参数。

  1. yarn add 文档
  2. npm install 文档

yarn licenses [ls|generate-disclaimer]

npm 没有类似命令来方便编写自己的包。yarn licenses ls 列出所有已安装包的许可协议。yarn licenses generate-disclaimer 生成包含已安装包许可协议的免责声明。某些协议要求使用者必须在项目中包含该协议,这时候该命令将变得非常好用。

  1. yarn licenses 文档

yarn why

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

  1. yarn why 文档

yarn upgrade

该命令会根据符合 package.json 设定的规则而不是 yarn.lock 定义的确切版本来将包更新到最新版本。如果想用 npm 来实现相同目的,可以这样执行:

1
2
rm -rf node_modules
npm install

不要将该命令与 npm update 混淆,它指的是更新到自己的最新版。

  1. yarn upgrade 文档

yarn generate-lock-entry

yarn generate-lock-entry 会基于 package.json 设置的依赖生成 yarn.lock 文件,该命令与 npm shrinkwrap 类似,但应该小心使用,因为通过 yarn addyarn upgrade 命令添加或更新依赖时会自动更新生成该锁文件。

  1. yarn generate-lock-entry 文档
  2. npm shrinkwrap 文档

下面介绍一些常用的命令:

  • yarnyarn 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。