这篇文章会通过以下几个方面介绍yarn的:
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。
现在目录依赖结构如下
这时假设我们在项目里使用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
正确的安装姿势
注意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需要加如下参数
更新依赖
命令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后自动生成锁定文件,简单方便
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
4 NPM 包管理工具 在Node出现之前,我们在做前端的时候经常用到一些开发工具使用ruby和python开发的(比如说sass,一种CSS预编译语言,依赖于ruby;(Pygments)[http://pygments.org/] ,一种代码语法高亮插件,依赖于python),这个时候就会看到gem和pip的身影。熟悉java的同学,应该也对maven如数家珍。和这些语言类似,Node 也提供
本文向大家介绍node.js中npm包管理工具用法分析,包括了node.js中npm包管理工具用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了node.js中npm包管理工具用法。分享给大家供大家参考,具体如下: 现在安装node.js,默认就会帮我们装上了npm包管理工具,npm主要用来下载,安装,管理第三方模块。 创建一个包描述文件: 查看包的信息 查看包的版本信息 安装指定的
npm 全名为 Node Package Manager,是 Node.js 的套件(package)管理工具, 类似 Perl 的 ppm 或 PHP 的 PEAR 等。安装 npm 后,使用 npm install module_name 指令即可安装新套件,维护管理套件的工作会更加轻鬆。 npm 可以让 Node.js 的开发者,直接利用、扩充线上的套件库(packages registry
Package Import Paths # demopkg1/__init__.py import pkgutil import pprint print('demopkg1.__path__ before:') pprint.pprint(__path__) print() __path__ = pkgutil.extend_path(__path__, __name__) print(
0.1 本系列教程说明 本系列教程,采用的大纲母本为《Understanding Network Hacks Attack and Defense with Python》一书,为了解决很多同学对英文书的恐惧,解决看书之后实战过程中遇到的问题而作。由于原书很多地方过于简略,笔者根据实际测试情况和最新的技术发展对内容做了大量的变更,当然最重要的是个人偏好。教程同时提供图文和视频教程两种方式,供不同喜
Truffle 集成 npm ,并且知道项目中的 node_modules 目录(如果存在)。 这意味着我们可以通过 npm 来使用和分发合约、dapps、以太坊的合约库,使我们的代码可供其他人使用,也可以使用其他代码。 包文件布局 使用 Truffle 创建的项目默认具有特定的目录结构,这使得它们可以作为包来使用。 虽然这种目录结构不是必需的,但如果作为通用约定(或“事实上的标准”),那么通过