不可错过的包管理工具 - yarn

快速、可靠、安全的依赖管理工具前端

Nodejs 嫡系包管理工具

随着前端工程化体系的不断完善和"大前端"概念的丰富和发展,仅前端开发用到 Nodejs 的地方也愈来愈多,各大前端团队基于 Nodejs 的工具链建设也不断推进着前端开发走向新的高度;说到 Nodejs,天然离不开其官方的包管理工具 npm;目前,npm 已经成为世界上最大的包管理器,在其仓库中托管着超过 100 万个包,且还不包括企业内部的 npm 私服;node

npm5 之前,npm CLI 在使用功能及体验上存在一些不尽如人意的地方,好比不太好用的版本锁定功能、安装速度慢、没有离线缓存功能等;直到 npm5 之后,借鉴 Yarn 的优点使得 npm 的使用体验获得大幅提高,好比:算法

  1. 引入 package-lock.json,锁定当前项目安装包的版本,避免同一个项目在不一样地方安装会出现版本冲突的问题;
  2. 安装包时默认指定 --save
  3. 改进缓存系统和离线安装能力,即使是在无网络的环境下,也能够经过本地缓存安装已安装过的包;

不只如此,npm 安装的速度也有大幅提高,而且加强了安全性能,一系列的优化和改进促使如今最新的 npm 更加好用和易用;npm

异军突起的 Yarn

npm CLI 一家独大的大环境下,为何只有 Yarn 可以异军突起呢?json

Yarnfacebook 开源的一个快速、可靠、安全的依赖管理工具,用其官网上的话说是:它及其快速,安装速度之快史无前例!因为 Yarn 可以缓存已下载过的包,使得下次安装时无需重复下载,即使后续在无网络的环境下也可以安装成功,而且能够并行化操做,所谓“天下武功,惟快不破!”,光这一点就可以俘获大多数用户的心;加上 Yarn 会在每一个安装包执行前校验其完整性,从而避免了潜在的一些安全风险;经过 lockfile 和肯定性算法来安装依赖,以确保安装过的包在不一样系统之间可以表现一致;能够看出来,Yarn 团队深深识意到了 npm CLI 的痛点,而且试图从新设计一个 npm 客户端:windows

  1. 从根本上改写包的安装方式,展示稳定性与速度优点;
  2. 简化经常使用命令,优化使用体验;
  3. 自动化管理 lockfile,避免版本冲突与系统间的不肯定性;

既生瑜何生亮?

非也!前端工程化

首先,没必要担忧 npmyarn 的兼容问题,由于 Yarn 自己不具备侵入性,几乎能够无缝从 npm 切换到 Yarn,固然,你依然能够同时使用 npm,毕竟 Yarn 没有实现 npm 全部的命令,可是平常用到的绝大多数均可以经过 Yarn 更加高效的完成;缓存

其次,两者都是遵循同一个 package.json 文件,即使 Yarn 会重组 node_modules 里的文件,但也是和 npm 的方式是兼容的,在项目里初次运行 yarn( install) 后,就会生成 yarn.lock 文件,只需提交该文件,团队之间便可无差异的使用相同的软件包,若是以前使用了 npm-shrinkwrap.jsonpackage-lock.json,那么锁定的版本可能依然存在冲突的可能,这时须要团队之间同时切换到 Yarn安全

再者,npmNodejs 官方的包管理工具,而且不断的改进和发展,不少实际标准仍是得以 npm 为准,因此 Yarn 应该能够说是 npm 的阶段性补充,虽然到目前为止,Yarn 在某些方面依然具备优点;网络

安装及使用

通常状况下可使用 npm i -g yarn 的方式安装,可是 npm 安装是非肯定性的,程序包没有签名,而且 npm 除了作了基本的 SHA1 哈希以外不执行任何完整性检查,这给安装系统程序带来了安全风险;因此推荐使用安装系统软件的方式安装 Yarn,好比你是 mac 用户,可使用 brew install yarn --without-node 来安装 Yarn,或者你是 windows 用户,能够直接下载 msi 文件来安装 Yarn,而后配置好环境变量便可开始使用了;

Yarn CLI 介绍

  1. 对于常常用到的项目初始化,对包的安装、卸载、升级、发布等操做,Yarn 都提供了丰富而简洁的命令:
    • yarn add <package...> [option]:为当前正在开发的包新增一个依赖包,默认添加到 dependencies 中;
    • yarn global <add/bin/list/remove/upgrade> [--prefix]:yarn global 注意,这两个词总体做为一个命令前缀;
    • yarn init:交互式建立或更新 package.json 文件;
    • yarn [install]:安装 package.json 文件里定义的全部依赖包;
    • yarn publish:发布一个包到包管理器;
    • yarn remove:从当前包里移除一个未使用的包;
  2. 当咱们在 package.json 中自定义 scripts 时,使用 npm 时,咱们须要 npm run script 来执行,一样,Yarn 也支持该方式,同时 run 能够省略,直接 yarn script,很是方便;
  3. 经过设置环境变量 process.env.CHILD_CONCURRENCY= number,控制并行执行的子进程数以构建节点模块,能够避免在 Windows 中使用 node-gyp 时出现连接器错误;
  4. yarn link 使用系统连接的方式连接本地包,而非拷贝文件的方式,很是快;
  5. 支持以工做区(workspace)的方式来管理项目

划重点的功能:workspace

工做区是设置你的软件包体系结构的一种新方式,它容许你可使用这种方式安装多个软件包。

对于大型代码库,咱们通常会将某些独立的功能抽离出去单独开发,并做为独立的包来发布和管理,一方面便于平常维护,另外一方面也方便模块间的依赖与引用;Yarn1.0 开始支持引 入工做区的方式来管理软件包;

  1. 使用 workspace 的好处:

    • 在工做区范围内连接全部的包,包括工做区内的代码库及其依赖包,因此,未发布的包也能跟发布后同样直接调用;
    • 工做区内全部的代码库及其依赖统一安装到根目录的 node_modules 里,而且只生成一份 yarn.lock,下降版本冲突的风险;
    • 代码结构更加清晰、易于维护,减小不一样模块之间没必要要的共同依赖;
  2. 如何开始使用:

    • 首先咱们来新建工做区目录,并在该目录中添加 package.json,必须包含 private: true (确保工做区不被发布出去)和 workspace 两个字段;
    • 而后在工做区中分别建立 workspace-aworkspace-b 两个项目目录,并使用 yarn init 初始化生成相应项目的 package.json
    • 最后,咱们即可以 开始在相应项目下开始工做了,跟通常的时候同样执行安装、升级、删除、发布相关操做;
  3. Yarn 只提供工做区相关的基础功能,而且提供了其余工具使用的底层实现机制,关于工做区的高级功能使用能够关注 Lerna

    yarn workspace 的目录结构图:

离线安装策略:

当你安装某个包时,Yarn 会将其缓存下来,下次再安装这个包时无需重复下载;

  • --offline 从本地缓存中安装某个包,没有可用的则会报错;
  • --prefer-offline 优先从本地缓存安装某个包,没有可用的则从从新下载最新的;
  • yarn cache [ls|list|clean|dir] [flags] 经过 yarn cache 咱们能够进行设置缓存目录、清除缓存、查看已缓存的包等操做;
  • yarn config set yarn-offline-mirror ./npm-packages-offline-cache 经过该命令咱们能够设置离线镜像的目录, 为了保持该目录的及时更新,咱们还须要设置一下,yarn config set yarn-offline-mirror-pruning true,之后安装某个包时便会将该包的 .tar.gz 压缩包下载到该目录,供离线安装时使用;

pnp

warning Plug'n'Play on Windows doesn't support the cache and project to be kept on separate drives

Plug'n'Play 简称 pnp,是为了提供一种更加高效的模块查找机制,消除了项目中的 node_modules 目录,取而代之的是 .pnp 目录和 .pnp.js,在该模式下,yarn 会将全部的包缓存到一个目录里面,经过 .pnp.js 告诉 node 在没有 node_modules 的状况下如何去查找模块;咱们试想一下,我们的项目里之后不会出现 node_modules 了,而且全部的依赖包都在一个公共的目录里面,即使同一个包的多个版本也能安然无事的并存,那么当咱们安装项目时,速度将大大提高;同时经过 .pnp.js 告诉 node 依赖包的具体位置,那么引用查询模块的效率也将大大提高,而且少了不少可能的文件查找过程;

目前仍是实验性特性,而且还不支持 windows,从1.12之后的版本开始,咱们可使用 --pnp--enable-pnp 来体验该特性;

因为该机制改变了原来 node 查找依赖模块的方式,因此一些开源项目在未适配该机制时可能会出先找不到模块的错误,能够在 npm 上查询 pnp 找相应的适配包来解决;

总结

以上,咱们对 Yarn 的使用体验及速度优点有了初步了解,在实际工做中,咱们能够根据实际状况灵活的选择使用 npm 命令仍是 yarn 命令;在我看来,至少目前来讲,Yarn 在实际使用的某些方面是依然具备优点的,因此,还等什么呢?

相关文章
相关标签/搜索