本文介绍: 现代的包管理工具 pnpmperformant npm ),意思是高性能npm它由 npm/yarn 衍生而来,但却解决npm/yarn 内部潜在bug,并且极大了地优化性能

1、pnpm什么

现代的包管理工具 pnpmperformant npm ),意思是高性能npm
它由 npm/yarn 衍生而来,但却解决npm/yarn 内部潜在bug,并且极大了地优化性能

2、特性哪些

(1)速度

官方benchmark 数据是这样的,但是实际使用发现pnpm的第一次下载速度yarn是差不多的,其优势体现在第二次下载相同的包更快

(2)高效利用磁盘空间
pnpm 内部使用基于内容寻址文件系统存储磁盘上所有的文件这个文件系统出色的地方在于
1、不会重复安装一个包。用 npm/yarn时候,如果 100 个项目依赖 lodash,那么 lodash可能就被安装了 100 次,磁盘中就有 100 个地方写入了这部分代码。但在使用 pnpm 只会安装一次磁盘中只有一个地方写入,后面再次使用都会直接使用 hardlink(硬链接
2、即使一个包不同版本pnpm 也会极大程度地复用之前版本代码。举个例子比如 lodash 有 100 个文件更新版本之后多了一个文件,那么磁盘当中并不会重新写入 101 个文件,而是保留原来的 100 个文件的 hardlink,仅仅写入那一个新增的文件

(3)*支持monorepo

随着前端工程的日益复杂,越来越多的项目开始使用 monorepo。之前对于多个项目管理我们一般都是使用多个 git 仓库,但 monorepo 的宗旨就是一个 git 仓库来管理多个子项目,所有的子项目存放根目录packages目录下,那么一个子项目代表一个package

3、pnpm依赖原理

npmyarn安装包问题
pnpm 出现以前,npmyarn 为了提高包的复用率,都采用了扁平化的装包策略。扁平化的安装方式会导致我们node_modules 文件夹package.json 存在很大的出入,比如install一个包 express,但是你的node_modules下会有很多包
这个时候会有一些问题
(1)幽灵依赖
从目前的包引用方式来说,inport时候我们会从node_modules文件夹中寻找,按照上面的图中所示,如果我们在package.json没有accepts其实我们也是可以引用到的,因为她确实存在,这时候我们访问就是未申明npm包,如果某一天express主包不再依赖accepts这个时候项目就会有依赖缺失问题。 我们把这种主包依赖的子包,未被申明而在项目中使用,可以理解成是主包夹带的包,我们称之为 幽灵依赖
(2)包版本不确定性
这个很好理解,如果A、B两个主包都依赖accepts包,但是A依赖accepts@1.0,B依赖accepts@2.0 ,那node_modules下的扁平结构展示1.0 还是 2.0 呢?目前的方式是谁后安装的谁就显示。 这种不确定性开发中引起的问题也不在少数 「别人用这个可以解决这个问题,但是我安装这个包就不能解决」,往往就是这个原因导致的。
(3)依赖重复安装
这个也很好理解,AB都依赖accepts,依赖不同版本,无论node_modules的顶层提升了哪个版本,这个包都是会被安装两次的。

4、pnpm的安装、使用

官网地址https://pnpm.js.org/installation/

// 全局安装
npm install pnpm -g

//查看pnpm config get registry 
//切换淘宝pnpm config set registry https://registry.npmmirror.com/

// 使用
pnpm install 包 // 安装依赖
pnpm i  包      // 安装依赖
pnpm add 包     // -S  默认写入dependencies
pnpm add -D     // -D devDependencies
pnpm add -g     // 全局安装

// 移除
pnpm remove 包               // 移除包
pnpm remove 包 --global      // 移除全局包

// 更新
pnpm up                      // 更新所有依赖项
pnpm upgrade 包              // 更新包
pnpm upgrade 包 --global     // 更新全局

注意:pnpm不会自动下载依赖中使用的其他依赖,npm和cnpm可以自动下载依赖中的其他依赖,这涉及到依赖链的问题,pnpm会先检查共享存储库,如果有该依赖则创建符号链接(即硬链接定位共享存储库中的依赖,不会重复的去下载。npm则是每个项目都是单独下载的依赖。

// 如果希望自动下载依赖中的依赖 则可以使用
pnpm recursive install
// pnpm 还提供了其他一些命令管理依赖,例如:
pnpm recursive add <package>:在项目及其子项目添加依赖
pnpm recursive update更新所有依赖

原文地址:https://blog.csdn.net/qq_45345113/article/details/130680885

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_41482.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注