yarn 官网:https://www.yarnpkg.com/zh-Hans/

    yarn 是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具,它仍然使用 npm 的registry(数据库),不过提供了全新 CLI 来对包进行管理

    过去,yarn 的出现极大的抢夺了 npm 的市场,甚至有人戏言,npm 只剩下一个 registry 了。
    之所以会出现这种情况,是因为在过去,老版本的npm 存在下面的问题

    1. 依赖目录嵌套层次深:过去,npm 的依赖是嵌套的,这在 windows 系统上是一个极大的问题,由于window的目录路径(如:d:\demo\demo_child\demo.txt)最长只能支持256个字符的原因,windows 系统无法支持太深的目录
    2. 下载速度慢
      1. 由于嵌套层次的问题,所以npm对包的下载只能是串行的,即前一个包下载完后才会下载下一个包,导致带宽资源没有完全利用
      2. 多个相同版本的包被重复的下载
    3. 控制台输出繁杂:过去,npm 安装包的时候,每安装一个依赖,就会输出依赖的详细信息,导致一次安装有大量的信息输出到控制台,遇到错误极难查看
    4. 工程移植问题:由于 npm 的版本依赖可以是模糊的,可能会导致工程移植后,依赖的确切版本不一致。


      针对上述问题,yarn **从诞生那天就已经解决,它用到了以下的手段**:

    • 使用扁平的目录结构
    • 并行下载
    • 使用本地缓存
    • 控制台仅输出关键信息
    • 使用yanr-lock文件记录确切依赖

    不仅如此,yarn**还优化了以下内容**:

    • 增加了某些功能强大的命令
    • 让既有的命令更加语义化
    • 本地安装的CLI工具可以使用 yarn 直接启动
    • 将全局安装的目录当作一个普通的工程,生成package.json文件,便于全局安装移植


      yarn 的出现给 npm 带来了巨大的压力,很快,npm 学习了 yarn 先进的理念,不断的对自身进行优化,到了目前的npm6版本,npm几乎完全解决了上面的问题:

    • 目录扁平化

    • 并行下载
    • 本地缓存
    • 使用package-lock记录确切依赖
    • 增加了大量的命令别名(解决命名不够语义化的问题)
    • 内置了npx,可以启动本地的CLI工具
    • 极大的简化了控制台输出


      总结:
      npm6 之后,可以说npm已经和yarn非常接近,甚至没有差距了。很多新的项目,又重新从yarn转回到npm。
      这两个包管理器是目前的主流,都必须要学习。