美文网首页
Yarn入门介绍

Yarn入门介绍

作者: 梅_梅 | 来源:发表于2018-05-12 16:51 被阅读26次

    概述

    yarn

    在2016年10月11日facebook 公开了新的javascript包管理工具 yarn, 用来替代目前被广泛使用的npm(nodejs 自带的包管理工具),本文将介绍yarn工具带来的优点和使用入门,以及对比npm解决了什么问题,带来哪些便利。有需要的朋友们下面来一起看看吧。

    Yarn与npm对比

    • 离线模式
      yarn会有一个缓存目录,会缓存以前安装过的软件包,再次安装时就不必从网络下载了,大大加速安装速度。
      这一点很重要,npm 饱受诟病的一点就是,每次安装依赖,都需要从网络下载一大堆东西,而且是全部重新下载,工程多的时候比较烦人。
      我司部署node项目,是需要在发布机上install所有的依赖而且发布机的网络环境不是很好(不给搭梯子),导致安装慢不说还经常失败(部分包需要联网编译)。更换yarn后只需将yarn的cache目录缓存起来,install能更快。

    • 依赖关系确定性
      在每一台机器上针对同一个工程安装依赖时,生成的依赖关系顺序和版本是一致的。
      之前 npm 在这里有一个处理得不好的地方 。举例来说,我写的工程依赖 A, B, C 三个库,我在编写 package.json 的时候,给 A, B, C 都指定了版本号。但是 A 库可能又依赖 D, E, F 库,D 库又依赖 G, H 库。这么多关联依赖关系中,很可能某个库在指定依赖时,没有指定版本号。
      于是,这就导致了一个问题。如果我在另一台机器上对同样的工程安装依赖,或者把这台机器工程下的 node_modules 目录删除来重新安装依赖。由于关联依赖中,没有指定版本号的库,发生了版本更新,就会导致再次安装的依赖,其中具体某些软件包的版本是不一致的。在这种情况下,你会发现原来能够正常运行的程序,忽然变得不能工作或一堆 BUG.
      npm对包引入顺序也十分的敏感,比如在一个空项目里执行以下命令

    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。
    现在目录依赖结构如下


    npm依赖嵌套.png

    这时假设我们在项目里使用lodash,但是忘记重新安装lodash

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

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

    • 网络性能优化
      下载软件时会优化请求顺序,避免请求瀑布发生
    • 网络回弹
      yarn在某个安装包请求失败时不会导致安装失败,它会自动去尝试重新安装。而npm则会毫不犹豫的失败,导致得再来一次,耗费时间
    • 多注册来源
      所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致。
    • 扁平模式
      对于多个包依赖同一个子包的情况,yarn会尽量提取为同一个包,防止出现多处副本,浪费空间。比如1.2中,yarn会为babel-generator和babel-helper-define-map 创建同一个lodash子依赖,这样就节约一份的空间。

    yarn 的安装配置

    安装

    npm install -g yarn
    

    配置源

    这里使用淘宝源

    yarn config set registry https://registry.npm.taobao.org -g
    
    yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass  -g
    
    

    命令

    初始化项目

    yarn init
    

    会在根目录下生成一个package.json,与npm类似

    添加包

    添加包:yarn add [pkg-name] ,会自动安装最新版本,会覆盖指定版本号

    yarn add jquery
    

    添加多个包

    一次性添加多个包:yarn add [pkg-name1] [pkg-name2]

    yarn add bootstrap zepto
    

    更新包

    将包更新到指定版本:yarn upgrade [pkg-name]@ver

    yarn upgrade jquery@3.0.0
    

    更新包到最新版本

    将包更新到最新版本:yarn upgrade –latest [pkg-name]

    yarn upgrade –latest jquery
    

    删除包

    删除包:yarn remove [pkg-name]

    yarn remove jquery
    

    一次删除多个包

    一次删除多个包:yarn remove [pkg-name1] [pkg-name2]

    yarn remove bootstrap zepto
    

    安装项目依赖包

    用于根据安装package.json里所有包,并将包及它的所有依赖项保存进 yarn.lock

    yarn install                      
    yarn install --flat           //安装一个包的单一版本
    yarn install --force           //强制重新下载所有包
    yarn install --production   //只安装dependencies里的包
    yarn install --no-lockfile  //不读取或生成yarn.lock
    yarn install --pure-lockfile //不生成yarn.lock
    

    yarn.lock 自动锁定安装包版本

    Npm 有一个名为 shrinkwrap 的特性,其目的是在生产环境中使用时锁定包依赖。shrinkwrap 的挑战是每个开发者都必须手动运行 npm shrinkwrap 生成 npm-shrinkwrap.json 文件。
    使用 Yarn,则截然不同。在安装过程中,会自动生成一个 yarn.lock 文件,yarn.lock 会记录你安装的所有大大小小的。有点类似 PHP 开发者们所熟悉的 composer.lock。yarn.lock 锁定了安装包的精确版本以及所有依赖项,只要你不删除 yarn.lock 文件,再次运行 yarn install 时,会根据其中记录的版本号获取所有依赖包。有了这个文件,你可以确定项目团队的每个成员都安装了精确的软件包版本,部署可以轻松地重现,且没有意外的 bug。你可以把 yarn.lock 提交到本库里,这样其他签出代码并运行 yarn install时,可以保证大家安装的依赖都是完全一致的。

    相关文章

      网友评论

          本文标题:Yarn入门介绍

          本文链接:https://www.haomeiwen.com/subject/xkufdftx.html