yarn、npm、cnpm三者区别
放一张实验室的合照压压惊,有点想实验室的兄弟们了~~~
一、原理分析
npm
(1)npm 是Node.js
能够如此成功的主要原因之一。npm 团队做了很多的工作,以确保 npm
保持向后兼容,并在不同的环境中保持一致。
(2)npm是围绕着 语义版本控制(semver
)的思想而设计。
-
给定一个版本号:主版本号.次版本号.补丁版本号, 以下这三种情况需要增加相应的版本号:
-
主版本号: 当API发生改变,并与之前的版本不兼容的时候
-
次版本号: 当增加了功能,但是向后兼容的时候
-
补丁版本号:当做了向后兼容的缺陷修复的时候
npm 2
安装每一个包所依赖的所有依赖项。如果我们有这么一个项目,它依赖项目A,项目A依赖项目B,项目B依赖项目C,那么依赖树将如下所示:
node_modules
- package-A
-- node_modules
--- package-B
----- node_modules
------ package-C
-------- some-really-really-really-long-file-name-in-package-c.js
缺点:
这个结构可能会很长。这对于基于Unix的操作系统
来说只不过是一个小烦恼,但对于Windows
来说却是个破坏性的东西,因为有很多程序无法处理超过260个字符
的文件路径名
npm 3
采用了扁平依赖关系树来解决这个问题,所以我们的3个项目结构现在看起来如下所示:
node_modules
- package-A
- package-B
- package-C
-- some-file-name-in-package-c.js
优点:
存了已经下载的每个版本的压缩包。本地缓存的内容可以通过npm cache ls
命令进行查看。本地缓存的设计有助于减少安装时间。
缺点:
(1)npm
必须首先遍历所有的项目依赖关系,然后再决定如何生成扁平的node_modules
目录结构。npm必须为所有使用到的模块构建一个完整的依赖关系树,这是一个耗时的操作,是npm安装速度慢的一个很重要的原因
(2)想当然的以为每次运行npm install
命令时,NPM都得从互联网上下载所有内容
(npm
是有本地缓存的,它保存了已经下载的每个版本的压缩包。本地缓存的内容可以通过npm cache ls
命令进行查看。本地缓存的设计有助于减少安装时间。)
cnpm
(1) cnpm
跟npm
用法完全一致,只是在执行命令时将npm改为cnpm
。
(2) npm
安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,于是淘宝团队干了这事。来自官网:“这是一个完整 npmjs.org
镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
配置:
npm install -g cnpm --registry=https://registry.npm.taobao.org
Yarn
(1) Yarn
一开始的主要目标是解决上一节中描述的由于语义版本控制而导致的npm安装的不确定性问题。虽然可以使用npm shrinkwrap
来实现可预测的依赖关系树,但它并不是默认选项,而是取决于所有的开发人员知道并且启用这个选项.
(2) yarn.lock
文件,而且它是默认创建的。除了常规信息之外,yarn.lock
文件还包含要安装的内容的校验和,以确保使用的库的版本相同。
(3)像npm一样,yarn使用本地缓存。与npm不同的是,yarn无需互联网连接就能安装本地缓存的依赖项,它提供了离线模式
。
(4)运行速度得到了显著的提升,整个安装时间也变得更少.
二、yarn 和 npm 对比
三、yarn 的优点
速度快 。
速度快主要来自以下两个方面:
(1)并行安装:
无论 npm
还是Yarn
在执行包的安装时,都会执行一系列任务。npm
是按照队列执行每个package
,也就是说必须要等到当前package
安装完成之后,才能继续后面的安装。而 Yarn
是并行执行所有任务,提高了性能。
(2)离线模式:
如果之前已经安装过一个软件包,用Yarn
再次安装时之间从缓存中获取,就不用像npm
那样再从网络下载了。