JS新包管理工具yarn和npm的对比与使用入门


Posted in Javascript onDecember 09, 2016

这篇文章会通过以下几个方面介绍yarn的:

  1. yarn对比npm解决了什么问题,带来哪些便利。
  2. 获取yarn的正确姿势
  3. yarn的使用入门(介绍一些常用的命令
  4. 个人使用心得

yarn对比npm的优点

根据官方文档yarn具有6大优点

1、离线模式

yarn会有一个缓存目录,会缓存以前安装过的软件包,再次安装时就不必从网络下载了,大大加速安装速度。

这一点很重要,npm 饱受诟病的一点就是,每次安装依赖,都需要从网络下载一大堆东西,而且是全部重新下载,工程多的时候比较烦人。

我司部署node项目,是需要在发布机上install所有的依赖而且发布机的网络环境不是很好(不给搭梯子),导致安装慢不说还经常失败(部分包需要联网编译)。更换yarn后只需将yarn的cache目录缓存起来,每次install嗷嗷的快,麻麻再也不用担心发布失败了。

2、依赖关系确定性

在每一台机器上针对同一个工程安装依赖时,生成的依赖关系顺序和版本是一致的。

之前 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。

现在目录依赖结构如下

JS新包管理工具yarn和npm的对比与使用入门

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

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

另一个同事获取项目代码,执行npm install , 这时的目录依赖结构为

可以看到第一层依赖的lodash变成了4.x版本,这样就造成了依赖版本不一致的问题。而yarn则会保证无论怎样引入的顺序,目录依赖结构都是一致的,确保不会发生这样的BUG。

3、网络性能优化

下载软件时会优化请求顺序,避免请求瀑布发生

4、网络回弹

yarn在某个安装包请求失败时不会导致安装失败,它会自动去尝试重新安装。而npm则会毫不犹豫的失败,导致得再来一次,耗费时间

5、多注册来源

所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致。

6、扁平模式

对于多个包依赖同一个子包的情况,yarn会尽量提取为同一个包,防止出现多处副本,浪费空间。比如1.2中,yarn会为babel-generator和babel-helper-define-map 创建同一个lodash子依赖,这样就节约一份的空间。

更多的emojis

表情包大战o(?□?)o

JS新包管理工具yarn和npm的对比与使用入门

正确的安装姿势

注意yarn依赖node运行环境,官网提供了不同环境下的N种安装方法,点我查看。其中最重要的也是最通用的当然是npm install yarn -g,也不知道官网搞那么多幺蛾子的安装方式干嘛又是brew又是yum,还折腾半天。

yarn常用命令介绍

创建项目

命令yarn init,详细介绍

跟npm一样,会出现一个交互式的窗口,问一些package相关的问题

question name (testdir): my-awesome-package
question version (1.0.0): 
question description: The best package you will ever find.
question entry point (index.js): 
question git repository: https://github.com/yarnpkg/example-yarn-package
question author: Yarn Contributor
question license (MIT): 
success Saved package.json
✨ Done in 87.70s.

当然可以加参数 --yes/-y 来自动回答所有的问题(yes),便捷的生成一个package.json

管理依赖

注意,以下的命令都会自动更新你的package.json和yarn.lock文件

添加依赖

命令yarn add [package]@[version/tag] ,详细介绍

这会自动把包添加到package.json里的dependencies,也同时会更新yarn.lock

{
 "name": "my-package",
 "dependencies": {
+ "package-1": "^1.0.0"
 }
 }

添加到不同的dependencies需要加如下参数

  1. yarn add --dev/-D 添加到devDependencies
  2. yarn add --peer/-P 添加到peerDependencies
  3. yarn add --optional/-O 添加到optionalDependencies

更新依赖

命令yarn upgrade [package]@[version/tag] ,详细介绍

更新某个依赖的版本,并自动更新package.json和yarn.lock文件

{
 "name": "my-package",
 "dependencies": {
- "package-1": "^1.0.0"
+ "package-1": "^2.0.0"
 }
 }

删除依赖

命令yarn remove [package]

删除某个依赖,并自动更新package.json和yarn.lock文件

安装依赖

命令 yarn install ,详细介绍

会从package.json里提取所有的依赖并安装,然后生成yarn.lock锁定所有的依赖版本,别人执行yarn install时会根据yarn.lock安装依赖,保证不同的电脑安装的依赖目录结构完全一致。

可选参数

yarn install --flat 有且仅有一个依赖的版本被允许,多依赖会出现一个交互式窗口,让使用者选择某一个版本安装

yarn install --force 强制重新下载所有的依赖包

yarn install --production 只下载dependencies下的依赖

全局命令

在yarn命令前加一个global修饰,可以将命令变为全局的,支持的命令有 add,bin,ls,remove,upgrade

例如npm install gulp -g ,可以用yarn global add gulp来替代

个人使用心得

更换安装源,使用阿里提供的npm register加速, yarn config set registry 'https://registry.npm.taobao.org',当然如果npm已经配置过,yarn就无需再配置了。

yarn还有许多小问题,不过官方也在努力修复中,建议时不时使用yarn self-update来更新版本

以前包锁定是使用npm shrinkwrap命令,感觉繁琐且难维护,使用yarn后自动生成锁定文件,简单方便

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
获得所有表单值的JQuery实现代码[IE暂不支持]
May 24 Javascript
javascript数据结构与算法之检索算法
Apr 04 Javascript
JS中创建函数的三种方式及区别
Mar 13 Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
Nov 21 Javascript
js 奇葩技巧之隐藏代码
Aug 11 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
Jan 22 Javascript
详解webpack 热更新优化
Sep 13 Javascript
vue动态绑定class选中当前列表变色的方法示例
Dec 19 Javascript
史上最为详细的javascript继承(推荐)
May 18 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
Jun 06 jQuery
js实现限定区域范围拖拉拽效果
Nov 20 Javascript
清除浏览器缓存的几种方法总结(必看)
Dec 09 #Javascript
vue.js绑定class和style样式(6)
Dec 09 #Javascript
浅析JavaScript动画模拟拖拽原理
Dec 09 #Javascript
JS定时器实现数值从0到10来回变化
Dec 09 #Javascript
原生js实现查询天气小应用
Dec 09 #Javascript
JS实现太极旋转思路分析
Dec 09 #Javascript
学习使用bootstrap的modal和carousel
Dec 09 #Javascript
You might like
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
Vue表单实例代码
2016/09/05 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python模块学习 re 正则表达式
2011/05/19 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
python Canny边缘检测算法的实现
2020/04/24 Python
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
中层干部岗位职责
2013/12/18 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
小学教师管理制度
2014/01/18 职场文书
小学社团活动总结
2014/06/27 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫