Web 包管理工具(npm、yarn、cnpm、pnpm)
我们先来熟悉几个概念
模块(module)
通常以单个文件形式存在的功能片段,
入口文件通常称之为入口模块或主模块
一个类、一个函数、一个对象、一个配置等等均可以作为模块,这种细粒度的划分,是开发大型应用的基石
库(library)
以一个或多个模块组成的完整功能块,为开发中某一方面的问题提供完整的解决方案
npm
npm 全称为 node package manager,即 node 包管理器
它运行在 node 环境中,让开发者可以用简单的方式完成包的查找、安装、更新、卸载、上传等操作
npm 要运行在 node 环境,而不是浏览器环境
根本原因是因为浏览器环境无法提供下载、删除、读取本地文件的功能。而 node 属于服务器环境,没有浏览器的种种限制,理论上可以完全掌控运行 node 的计算机。
npm 即是一个包管理器,也是其他包管理的基石
几乎可以这样认为,前端所有的包管理器都是基于 npm 的
npm 的出现,弥补了 node 没有包管理器的缺陷
于是很快,node 在安装文件中内置了 npm,当开发者安装好 node 之后,就自动安装了 npm,
不仅如此,node 环境还专门为 npm 提供了良好的支持,使用 npm 下载的包更加方便了。
npm 由三部分组成
1、registry:入口
可以把它想象成一个庞大的数据库
第三方库的开发者,将自己的库按照 npm 的规范,打包上传到数据库中
使用者通过统一的地址下载第三方包
2、官网
查询包
注册、登录、管理个人信息
3、CLI:command-line interface 命令行接口
安装好 npm 后,通过 CLI 来使用 npm 的各种功能
由于 npm 的官方 registry 服务器位于国外,可能受网速影响导致下载缓慢或失败。
因此,安装好 npm 之后,需要重新设置 registry 的地址为国内地址。
旧版的npm存在的问题
1、依赖目录嵌套层次深
npm 的依赖是嵌套的,这在 windows 系统上是一个极大的问题,由于众所周知的原因,windows 系统无法支持太深的目录
2、下载速度慢
由于嵌套层次的问题,所以npm对包的下载只能是串行的,即前一个包下载完后才会下载下一个包,导致带宽资源没有完全利用
多个相同版本的包被重复的下载
3、控制台输出繁杂
npm 安装包的时候,每安装一个依赖,就会输出依赖的详细信息,导致一次安装有大量的信息输出到控制台,遇到错误极难查看
4、工程移植问题
由于 npm 的版本依赖可以是模糊的,可能会导致工程移植后,依赖的确切版本不一致。
npm6
yarn 的出现给 npm 带来了巨大的压力,npm 学习了 yarn 先进的理念,不断的对自身进行优化,
到了目前的npm6版本,可以说npm已经和yarn非常接近,甚至没有差距了。
很多新的项目,又重新从yarn转回到npm。
1、目录扁平化
2、并行下载
3、本地缓存
4、使用package-lock记录确切依赖
5、增加了大量的命令别名
6、内置了npx,可以启动本地的CLI工具
7、极大的简化了控制台输出
yarn
官网:https://classic.yarnpkg.com/lang/en/
新的 JS 包管理工具
yarn 是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具,
它仍然使用 npm 的registry,不过提供了全新 CLI 来对包进行管理
yarn的出现主要是解决旧版npm存在的问题
解决方法
1、使用扁平的目录结构
2、并行下载
3、使用本地缓存
4、控制台仅输出关键信息
5、使用yarn-lock文件记录确切依赖
优化的内容
1、增加了某些功能强大的命令
2、让既有的命令更加语义化
3、本地安装的CLI工具可以使用 yarn 直接启动
4、将全局安装的目录当作一个普通的工程,生成package.json文件,便于全局安装移植
cnpm
淘宝npm镜像源
为解决国内用户连接npm registry缓慢的问题,淘宝搭建了自己的registry,即淘宝npm镜像源
旧的npm没有提供修改registry的功能
因此,淘宝提供了一个CLI工具即cnpm,它支持除了npm publish以外的所有命令,只不过连接的是淘宝镜像源
新的npm已经支持修改registry了
可能cnpm唯一的作用就是和npm共存,即如果要使用官方源,则使用npm,如果使用淘宝源,则使用cnpm
pnpm
pnpm是一种新起的包管理器
它的实现方式值得主流包管理器学习,某些开发者极力推荐使用pnpm
同于yarn 和 npm
pnpm 仍然使用缓存来保存已经安装过的包,以及使用 pnpm-lock.yaml 来记录详细的依赖版本
不同于 yarn 和 npm
pnpm 使用符号链接和硬链接(可将它们想象成快捷方式)的做法来放置依赖,
1、规避了从缓存中拷贝文件的时间,使得安装和卸载的速度更快
2、可以规避windows操作系统路径过长的问题,因此,它选择使用树形的依赖结果,有着几乎完美的依赖管理。
3、项目中只能使用直接依赖,而不能使用间接依赖
优势
1、安装效率高于npm和yarn的最新版
2、极其简洁的node_modules目录
3、避免了开发时使用间接依赖的问题
4、能极大的降低磁盘空间的占用
参考资料:https://blog.csdn.net/qq_43750501/article/details/107523394