npm与yarn存在的问题
- 幽灵依赖,比如A包依赖了B包,只安装A包,B包也会到node_modules目录下,因为他们包是扁平化结构
- 重复安装,比如你电脑上又10份代码都依赖了A包,就需要安装10份,所以占用空间较大
- 安装速度,虽然npm和yarn都有做相应的缓存,但是如果包比较多还是要做大量的复制移动操作,所以速度比较慢
pnpm
1. 彻底解决幽灵依赖问题,
下面是安装element-plus包,npm安装的包包括element-plus依赖的包都会扁平化铺在根目录下, 而pnpm安装的包只会将安装的包显式放在node_modules目录下,其它的依赖包会放在.pnpm目录下,然后通过链接的方式链接到element-plus的包里面,这样就彻底解决了幽灵依赖的问题,就引入不到element-plus依赖的包了
- pnpm安装目录
- npm安装目录
2. 磁盘的节省
pnpm会再电脑中创建一个全局内容寻址存储区,你电脑中所有的依赖都会在这个仓库里面存一份,比如当多个项目中都需要lodash包的时候,pnpm不会去复制一份,而是通过硬链接的方式,从全局仓库里面链接一份,硬链接基本不占用磁盘空间,就算100个项目用到这个包,在电脑上也只会占用一分硬链接的空间。
3. 急速的安装
因为pnpm很多依赖都是通过链接的方式来管理的,而不是复制,所以在安装依赖的时候,大大减少磁盘的I/O操作,提升了安装速度。通过add安装的包,会存储在全局存储中,下次还需要这个包的时候,不会重新下载,可以看到下面的速度提升很多
package.json里面的符合表示什么意思
1.2.0解释
主版本号.次版本号.修订号
- ^1.2.0:^允许安装最新的次版本和修订版本,但不更新主版本,^1.2.0表示可以安装2.0.0>version>=1.2.0.
- ~1.2.0:~允许安装最新的修订版本,但不更新次版本和主版本, ~1.2.0表示可以安装1.3.0>version>=1.2.0
dependencies,devDependencies, peerDependencies
dependencies
生产依赖,npm install <package_name> --save来安装包,从npm5+版本开始,--save是默认携带的不需要写这个参数。
含义:项目在生产环境所必需要的包
devDependencies
开发依赖,npm install <package_name> --save-dev/npm install <package_name> -D局执行npm install 的时候才会安装这部分
含义:项目在开发阶段所需要的包,用来辅助开发
比如:sass,vite,webpack,typescript,cross-env等等需要的包
peerDependencies
对等依赖,永远不会自动安装,仅仅表示一个声明,一般库/包一般就是声明你这个包使用者需要安装某个特定
如果使用你这个包的人没有安装指定的包,npm就会爆警报
比如你开发某个webapck的loader,则必须要依赖webpack
硬链接、软链接(符号链接)
- 比如安装一个element-plus包,会再根目录下添加一个element-plus
- 然后.pnmp下面会有对应版本的包,还有间接依赖的版本包,
- 根目录的那个element-plus软链接到.pnpm下的对应版本的包的node_modules下的对应的包,
- 然后.pnpm下会有很多直接依赖和间接依赖,这些就像一个快捷方式,硬链接到磁盘存储的真实位置。
- 就像element-plus也依赖lodash,在.pnpm/node_modules/loadsh又软连接到.pnpm下对应版本的loadsh