接触 node 以后,一直使用npm包管理工具, cnpm 一开始会用一些,可是并无以为比 npm 快得多,使用 cnpm 的时候还常常安装不成功,只能再用 npm 安装一遍,渐渐的就弃用了 cnpm 。html
最近在看《MongoDB高级技术栈全覆盖前端 Vue+Node+MongoDB高级全栈开发》课程,才知道还有其余包管理工具,借此机会,好好的整理一下各个包管理工具之间的区别和联系。前端
npm 是 Node.js 可以如此成功的主要缘由之一。npm 团队作了不少的工做,以确保 npm 保持向后兼容,并在不一样的环境中保持一致。node
npm是围绕着 语义版本控制(semver)的思想而设计。git
给定一个版本号:主版本号.次版本号.补丁版本号, 如下这三种状况须要增长相应的版本号:github
package.json
的文件,用户能够经过npm install --save
命令把项目里全部的依赖项保存在这个文件里。例如,运行npm install --save lodash
会将如下几行添加到package.json
文件中。npm
解析,json
^
字符,告诉npm,安装主版本等于4的任意一个版本便可package.json
文件,在他们本身的机器上也可能会安装同一个库的不一样种版本,这样就会存在潜在的难以调试的错误和“在个人电脑上…”的情形。大多数npm库都严重依赖于其余npm库,这会致使嵌套依赖关系,并增长没法匹配相应版本的概率。缓存
虽然能够经过npm config set save-exact true
命令关闭在版本号前面使用^
的默认行为,但这个只会影响顶级依赖关系。因为每一个依赖的库都有本身的package.json
文件,而在它们本身的依赖关系前面可能会有^
符号,因此没法经过package.json
文件为嵌套依赖的内容提供保证。安全
为了解决这个问题,npm提供了shrinkwrap
命令。此命令将生成一个npm-shrinkwrap.json
文件,为全部库和全部嵌套依赖的库记录确切的版本。服务器
然而,即便存在npm-shrinkwrap.json
这个文件,npm也只会锁定库的版本,而不是库的内容。即使npm如今也能阻止用户屡次重复发布库的同一版本,可是npm管理员仍然具备强制更新某些库的权力。
这是引用自shrinkwrap
文档的内容:
若是你但愿锁定包中的特定字节,好比是为了保证能正确地从新部署或构建,那么你应该在源代码控制中检查依赖关系,或者采起一些其余的机制来校验内容,而不是靠校验版本。
npm 2
会安装每个包所依赖的全部依赖项。若是咱们有这么一个项目,它依赖项目A,项目A依赖项目B,项目B依赖项目C,那么依赖树将以下所示:
这个结构可能会很长。这对于基于Unix的操做系统来讲只不过是一个小烦恼,但对于Windows来讲倒是个破坏性的东西,由于有不少程序没法处理超过260个字符的文件路径名。
npm 3
采用了扁平依赖关系树来解决这个问题,因此咱们的3个项目结构如今看起来以下所示:
这样,一个原来很长的文件路径名就从./node_modules/package-A/node_modules/package-B/node-modules/some-file-name-in-package-c.js
变成了/node_modules/some-file-name-in-package-c.js
。
这种方法的缺点是,npm必须首先遍历全部的项目依赖关系,而后再决定如何生成扁平的node_modules
目录结构。npm必须为全部使用到的模块构建一个完整的依赖关系树,这是一个耗时的操做,是npm安装速度慢的一个很重要的缘由。
想固然的觉得每次运行npm install
命令时,NPM都得从互联网上下载全部内容。
可是,npm是有本地缓存的,它保存了已经下载的每一个版本的压缩包。本地缓存的内容能够经过npm cache ls
命令进行查看。本地缓存的设计有助于减小安装时间。
总而言之,npm是一个成熟、稳定、而且有趣的包管理器。
Yarn发布于2016年10月,截至当前2018年7月,在Github上拥有了32.2k个Star。而npm只有16.8k个Start。这个项目由一些高级开发人员维护,包括了Sebastian McKenzie(Babel.js)和Yehuda Katz(Ember.js、Rust、Bundler等)。
Yarn一开始的主要目标是解决上一节中描述的因为语义版本控制而致使的npm安装的不肯定性问题。虽然可使用npm shrinkwrap
来实现可预测的依赖关系树,但它并非默认选项,而是取决于全部的开发人员知道而且启用这个选项。
Yarn采起了不一样的作法。每一个yarn安装都会生成一个相似于npm-shrinkwrap.json
的yarn.lock
文件,并且它是默认建立的。除了常规信息以外,yarn.lock
文件还包含要安装的内容的校验和,以确保使用的库的版本相同。
yarn是通过从新设计的崭新的npm客户端,它能让开发人员并行处理全部必须的操做,并添加了一些其余改进。
一般状况下不建议经过npm进行安装。npm安装是非肯定性的,程序包没有签名,而且npm除了作了基本的SHA1哈希以外不执行任何完整性检查,这给安装系统程序带来了安全风险。
npm install -g yarn
强烈建议你经过最适合于你的操做系统的安装方法来安装yarn,进官网下载对应版本
yarn官方地址:https://yarnpkg.com/zh-Hans/ 点击打开连接
可阅读pnpm的做者Zoltan Kochan发表的“为何要用pnpm?”
与君共勉:再牛逼的梦想,也抵不住傻逼般的坚持!