Web 包管理工具(npm、yarn、cnpm、pnpm)

我们先来熟悉几个概念

模块(module)

通常以单个文件形式存在的功能片段

入口文件通常称之为入口模块或主模块

一个类、一个函数、一个对象、一个配置等等均可以作为模块,这种细粒度的划分,是开发大型应用的基石

库(library)

一个或多个模块组成的完整功能块,为开发中某一方面的问题提供完整的解决方案

npm

官网:https://www.npmjs.com

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

官网:https://npmmirror.com

淘宝npm镜像源

为解决国内用户连接npm registry缓慢的问题,淘宝搭建了自己的registry,即淘宝npm镜像源

旧的npm没有提供修改registry的功能

因此,淘宝提供了一个CLI工具即cnpm,它支持除了npm publish以外的所有命令,只不过连接的是淘宝镜像源

新的npm已经支持修改registry了

可能cnpm唯一的作用就是和npm共存,即如果要使用官方源,则使用npm,如果使用淘宝源,则使用cnpm

pnpm

官网:https://pnpm.js.org

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

posted @ 2022-04-26 17:37  小菜看代码  阅读(895)  评论(0编辑  收藏  举报