pnpm v8版本升级变化关注点(前瞻速攻版)
前言
pnpm v8.0.0-alpha.0 版本已经发布,包含少量变化,但其中还是有令人在意的点的。
本文将默认读者拥有大部分 pnpm v7 版本的知识储备,进行 v8 版本的前瞻速攻。
安装方法
目前通过指定 Tag 方式可以安装 v8 alpha 版:
npm i -g pnpm@next-8
所有 Tag 详见:npm > pnpm version
由于距 pnpm v8 正式发布还有一段距离( alpha
> beta
> latest
),本文可能存在部分内容过时,请仔细甄别。
从 v6 升级至 v7
本文是 v7 升级 v8 ,若你需从 v6 升级,可先参考 :
- 聊聊 pnpm v6 升 v7 拥抱的变化和经验谈
正文
下面对 changelog 逐条分析。
auto-install-peers
is true
by default
在 pnpm v7 版本之初,strict-peer-dependencies
是默认打开的,这会导致不安装 peerDependencies
就会安装报错(除非打开 auto-install-peers
),引发了大量社区反馈,极大降低了 pnpm 的易用性,我们在 v6 升级 v7 的文章中也推荐设定 strict-peer-dependencies=false
避免不必要的报错问题。
所以 strict-peer-dependencies
在 v7.13.5
又调整回默认 false
。
v7 的计划失败了,到了 v8 ,可以看出 pnpm 希望通过默认打开 auto-install-peers=true
的方式解决 peerDependencies
的问题,但这会导致在本地 package.json
中的 peerDependencies
也被安装,一个例子如下:
// package.json
{"peerDependencies": {"react": "^18"}
}
此时我们不期望 react
被安装,因为我们没有在 dependencies
/ devDependencies
指明安装他,但由于 auto-install-peers
被默认打开,最终仍然会安装 react
。
进一步,在实际业务中,分情况考虑可能造成的影响:
-
普通场景:在本地开发时,按照开发规范,我们必然对
peerDependencies
的依赖也在devDependencies
指定一份,但不在dependencies
指定,所以该依赖是肯定会被安装的,auto-install-peers
不会对我们造成影响。 -
monorepo 场景:在 monorepo 时我们有 Monorepo丝滑方法论 ,依赖总唯一,所以无需担心
auto-install-peers
问题。
通过分析我们得知 auto-install-peers=true
默认打开一般情况对我们没有实质性影响。
下面我们举两个会存在问题的 case 供参考:
-
npm link
调试等情况,导致peerDependencies
被意外安装,但npm link
早已过时不再使用,这种情况是很少见的。 -
不遵守 npm 包开发规范,导致
peerDependencies
被意外安装,我们也不展开该极少数的情况。
由于 auto-install-peers
几乎不会对我们造成影响,加上使用包管理工具应该向 零配置 靠拢,本文不再推荐手动关闭 auto-install-peers
该选项,而是拥抱变化,若有极少数的特殊需求,你可能需要关闭该行为:
// .npmrc
auto-install-peers=false
The registry field is removed from the resolution object in pnpm-lock.yaml
lock 文件层面格式的优化,对我们使用没有直接影响,可以忽略。
save-workspace-protocol
is rolling
by default
save-workspace-protocol
决定了在 pnpm monorepo 中,手动安装工作区内同名包的版本添加行为:
pnpm add foo
如我们的 workspace 含有 foo
该包,在 v7 我们安装该包得到的是:
"foo": "workspace:^1.0.0"
现在 v8 默认 rolling
策略得到的将是:
"foo": "workspace:^"
由于我们极少在工作区内手动运行安装同名包的命令,往往是手动添加 workspace 内的其他包,并且使用 *
格式:
// package.json// 手动添加要使用的 monorepo 内其他包"foo": "workspace:*"
所以此变化不会影响我们的使用,可以忽略。
When there’s a files
field in the package.json
, only deploy those files that are listed in it
该命令涉及到 pnpm deploy 相关,由于 prune
功能还不够成熟,考虑到没有得到 nextjs 示例项目的推荐,我们几乎不会使用,可以忽略。
Use lockfile v6
by default
v6
是 pnpm 的下一个大版本的 lockfile 格式,目前格式版本是 5.4
:
// pnpm-lock.yaml
lockfileVersion: 5.4// ...
// pnpm-lock.yaml (pnpm v8)
lockfileVersion: '6.0'// ...
6.0
lockfile 格式相比 5.4
有 80% 内容基本一致,变化主要集中在对依赖的 版本描述 上,以下给出一个大致的 demo :
// old 5.4/@ant-design/colors/6.0.0:resolution: { ... }dependencies:'@ctrl/tinycolor': 3.4.0
// new 6.0registry.npmjs.org/react@18.0.0:resolution: { ... }name: reactversion: 18.0.0engines: {node: '>=0.10.0'}dependencies:loose-envify: ...dev: true
可以看出 6.0
新版 lockfile 对依赖的描述从 单行 变成了 多行 ,但对我们实际使用没有影响,运行 pnpm i
刷新 lock 文件即可,该变化可以忽略。
注:pnpm 早在 v7.24.2
就预先放出了该 6.0
lockfile 版本的配置项,同时官方仓库也第一时间使用了 6.0
新版 lockfile 格式,没有 Breaking change ,可以放心使用。
resolve-peers-from-workspace-root
is true
by default
resolve-peers-from-workspace-root
该选项主要用来解决 monorepo peerDependencies 困境 问题,当多子包需要同一个 peerDependencies
时,无需手动配置提升,而是在 root 安装唯一的该依赖,即可保证全局唯一性。
但提升至 root 只适合要求的版本范围全部匹配,可以唯一提升的依赖,不支持精细版本控制,同时会污染 monorepo 根 root ,造成不必要的隐形全局依赖和心智负担,我们在 Monorepo管理方法论和依赖安全 中明确指出 严禁安装 monorepo 全局依赖 ,故此选项不推荐使用,同时我们有 Monorepo丝滑方法论 实现更好的 monorepo 多实例解法,轮不到 resolve-peers-from-workspace-root
发挥作用,可以忽略该变化。
需要注意的是, Monorepo丝滑方法论 往往和框架挂钩,对于小型 monorepo 项目,若支持不了 丝滑方法论 的实现,可以勉强接受
resolve-peers-from-workspace-root
这种解决peerDependencies
困境的方法。
publishConfig.linkDirectory
is true
by default
随着 package.json#exports
的流行,更多的项目会采用非根发布 npm 包(如 jotai 等),publishConfig.linkDirectory
是对于此类项目的优化支持,不会直接影响到我们的使用,可以忽略。
resolution-mode
is lowest-direct
by default
近年 npm 供应链攻击的 case 偶然发生,目前比较好的 被动 管控手法有:
-
预打包依赖:参考 Nextjs / Umi 预打包策略,实现略。
-
pnpm
time-based
:time-based 策略可以基于包的最后发布时间来确保你使用的依赖在某个发布时间前,从而规避供应链发新包导致的攻击问题,但对于非自建 npm registry 需要花费更多时间读取 npm 包元信息,目前 pnpm 官方采用此策略,此处不做展开。 -
pnpm
lowest-direct
:lowest-direct 是另一种 pnpm 推出的 缓解 供应链攻击的手段,他等价于锁定你的直接依赖版本(解析为 semver 的最低依赖版本),比如^1.0.0
也只会安装1.0.0
最低版本,而不是最新的^1
版本,这等价于你锁定该依赖到1.0.0
,若你需要1.2.0
版本也需要写为^1.2.0
或1.2.0
,该行为可以从一定程度上 缓解 供应链发新包导致的攻击,也不会承受time-based
策略拉取 npm 元信息造成的依赖安装变慢。
默认 lowest-direct
策略后,我们可以直接性的 缓解 供应链攻击造成的影响,即使在没有 lock 文件时也可以每次都安装到确定的依赖版本。
但相应的成本是:必须显示的提升依赖版本号来做依赖升级,否则无法安装到最新版本,使用解析到的最低版本极有可能遭受未知的 bug ,从而浪费大量排查时间,请在使用 pnpm v8 时格外注意手动升级依赖至最新版本防止未知的 bug 。
Direct dependencies are deduped. So if the same dependency is both in a project and in the workspace root, then it is only linked to the workspace root
该变动是为了配合 resolve-peers-from-workspace-root
的行为,忽略即可。
Create a lockfile even if the project has no dependencies at all
对我们没有直接影响,忽略。
总结
通过分析 pnpm v8 alpha 的变化我们发现,只要遵守 pnpm v7 我们总结出来的 monorepo 方法论:
-
Monorepo 丝滑方法论:引用模块热更新
-
Monorepo 管理方法论和依赖安全
从 v7 升级至 v8 是几乎无损、水到渠成顺利的。
另外,请留意在 v8 状态下你的依赖是 锁定等价 的最低版本,请定期升级版本防止不必要的 bug ,并在出现 bug 时升级依赖排查。
若你需要进一步了解 monorepo ,提供如下内容参考:
-
monorepo 工作流基础之 changesets 打开与进阶(Speeches)
-
pnpm monorepo 的技术选型临界点(Critical adoption)
-
Monorepo 设计思路(Speeches)
-
turborepo v1.2.0版本升级指南
以上。
相关文章:
pnpm v8版本升级变化关注点(前瞻速攻版)
前言 pnpm v8.0.0-alpha.0 版本已经发布,包含少量变化,但其中还是有令人在意的点的。 本文将默认读者拥有大部分 pnpm v7 版本的知识储备,进行 v8 版本的前瞻速攻。 安装方法 目前通过指定 Tag 方式可以安装 v8 alpha 版: npm…...

Python基础-环境安装
Python安装1.下载PythonPython网址:https://www.python.org/进入Python官网,点击Downloads,选择自己对应的操作系统(此处以Windows为例)在左侧的稳定发行版中,选择一个3.5版本以上的,然后点击对…...
重载、重写、重构概念辨析
首先,重载、重写、重构都表现为方法名相同 重载 重载(overload),表示同一类的方法之间的关系,至少有以下其中一种情况 参数个数不同参数类型不同参数顺序不同 注意,返回值类型不同不能作为重载依据 重…...

第九章 - 多表查询(join,left join 等)与合并查询(union union all)
第九章 - 多表查询(join,left join 等)与合并查询(union)交叉链接(笛卡尔积)内连接查询外连接查询左链接: left join右链接:right join组合查询 union & union all使…...

matplotlib学习笔记(持续更新中…)
目录 1. 安装,导入 2. figure,axes(图形,坐标图形) 2.1 figure对象 2.2 axes对象 2.3 代码演示 2.3 subplot() 方法 3. 图表的导出 3.1 savefig() 方法 3.2 代码演示 1. 安装,导入 pip install m…...

STM32 SystemInit()函数学习总结
拿到程序后如何看系统时钟?User文件夹——system_stm32f4xx程序,先找systemcoreclock(系统时钟)但是这里这么多个系统时钟应该如何选择?点击魔法棒,然后点击C/C可以看到define的是F40_41XXX.USE这一款 ,对应着就找出了…...

【Spring Boot 原理分析】- 自动配置
【Spring Boot 原理分析】- 自动配置 Condition 注解 Condition 是 Spring 4.0 增加的条件判断功能,通过这个功能可以实现选择的创建 Bean 操作 👑 我们在使用 Spring 的时候,只需导入某个依赖的坐标,就可以直接通过 Autwired 注…...
简明易懂的JVM理解
文章目录简明易懂的JVM和GC理解写在前面Java虚拟机(JVM)的组成基本介绍结构类加载子系统(ClassLoader SubSystem)介绍类加载过程类加载过程小结双亲委派模型(Parent-Delegation Model)简介优点Java9的类加载的委派关系变动双亲委派模型小结运行时数据区(Runtime Data Areas)介绍…...

新考纲下的PMP考试有多难?
PMP考试在6月25号考试结束后,在网上引起一片哗然,新考纲领域与考点的转变使得考试难度加大:PMP考试敏捷和混合内容比重大,考试难度加大很多;考题更加注重考生的知识应用能力,领域更宽; 接下来我…...
朗润国际期货:知名投行/大佬打Call记
知名投行/大佬打Call记 2023年知名投行/大佬看好哪些投资标的 中国股市 高盛(2023年1月):将上涨15% 花旗(2023年1月):上半年会成为投资两点 摩根大通(2022年11月):M…...

遗传算法及Python实现
0 建议学时 4学时 1 人工智能概述 2020中国人工智能产业年会在苏州召开,会上发布的《中国人工智能发展报告2020》显示,过去十年(2011-2020) ,中国人工智能专利申请量达389571件,占全球总量的74.7%,位居世界第一。 报…...

零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]
原创首发于CSDN,转载请注明出处,谢谢! 文章目录为何会在Linux下开发单片机个人系统环境与所用开发板安装开源编译器 sdccSTC MCU ISP 闪存工具 stcgal 的安装单片机代码的编译与测试|编写主代码 main.c|使用 sdcc 编译…...

手摸手快速入门 正则表达式 (Vue源码中的使用)
vue2源码 在 vue2 源码的 src\compiler\parser\html-parser.js 文件中 里面有大量的正则表达式,如下图 可以看到非常的长,不是我说,就前几行,如果没有相关的 正则表达式 的工具,我可能就被劝退了😭 这里…...

TCP/IP网络协议族分成及其每层作用
1、可以分为应用层、传输层、网络层、链路层 2、各层的作用 应用层(可以想象成是快递打包过程) 决定了向用户提供应用服务时通信的活动,将要进行的操作或者数据进行一个打包。 传输层(可以理解为选择顺丰、圆通等快递公司) 提供数据传输的方…...
041、子序列类型问题(labuladong)
子序列类型问题 一、经典动态规划:编辑距离 基于labuladong的算法网站,经典动态规划:编辑距离; 总结: 一般来说涉及到两个字符串的问题,需要依赖上一次的各种操作,一般使用dp tableÿ…...

linux系统开机文段释义
第一段Version 2.01.1204. Copyright (C) 2010American Megatrends, Inc.Press <DEL> or <F2> to entersetup. Press <F7> for BBS POPUP Menu.设备上电,提示按DEL键或者F2键进入BIOS设置。按F8可以调出启动设备列表,可以选择性的启动…...

抽奖动画大转盘抽奖思路与做法
抽奖是各类营销活动中最常见的一种形式,本产品需求大致如下:转盘周围跑马灯交替闪烁,点击抽奖,大转盘旋转,调用接口获取抽奖结果,大转盘指针指向对应的奖品。高保如下图12.整体思路本需求要求跑马灯交替闪烁…...
Java实现 - 华为2016研发工程师编程题
文章目录删数字符集合数独删数 题目描述 有一个数组 a[N] 顺序存放 0 ~ N-1 ,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以 8 个数 (N7) 为例 :{ 0,1,2…...
nginx的七层负载均衡
文章目录一、负载均衡介绍二、nginx的配置文件三、实验过程总结一、负载均衡介绍 四层负载均衡 所谓四层负载均衡是指OSI七层模型中的传输层, 那么传输层Nginx已经支持TCP/IP的控制, 所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载, 那么他的好处是性能非常快,…...

信息加密技术
介绍信息加密 信息加密是实现数据保密性的手段。 信息加密(Encryption)是将明文信息转换为密文信息,使之在缺少特殊信息时不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。 现…...
MYSQL(二) ---MySQL 8.4 新特性与变量变更
MySQL 8.4 新特性与变量变更 作者:程序员LSP 分类:MySQL 8.4 教程 / 新特性 / 升级指南 更新时间:2025年6月 📌 前言 MySQL 8.4 是当前最新的稳定版本,相较于 8.0 系列,在审计日志、高可用、性能调优、认证…...
前端面试五之vue2基础
1.属性绑定v-bind(:) v-bind 是 Vue 2 中用于动态绑定属性的核心指令,它支持多种语法和用法,能够灵活地绑定 DOM 属性、组件 prop,甚至动态属性名。通过 v-bind,可以实现数据与视图之间的高效同…...

9.进程间通信
1.简介 为啥要有进程间通信? 如果未来进程之间要协同呢?一个进程要把自己的数据交给另一个进程!进程是具有独立性的,所以把一个进程的数据交给另一个进程----基本不可能!必须通信起来,就必须要有另一个人…...
Langchain学习笔记(十一):Chain构建与组合技巧
注:本文是Langchain框架的学习笔记;不是教程!不是教程!内容可能有所疏漏,欢迎交流指正。后续将持续更新学习笔记,分享我的学习心得和实践经验。 前言 在LangChain的发展过程中,API设计经历了重…...

Python_day47
作业:对比不同卷积层热图可视化的结果 一、不同卷积层的特征特性 卷积层类型特征类型特征抽象程度对输入的依赖程度低层卷积层(如第 1 - 3 层)边缘、纹理、颜色、简单形状等基础特征低高,直接与输入像素关联中层卷积层(…...
# 主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析
主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析 在上一篇文章中,我们对多个主流大语言模型(LLM)进行了中文诱导性提示词的越狱测试,评估其是否能够在面对非法、有害或危险内容请求…...
AI系统应用开发工程师
以下是对AI系统应用开发与运维岗位的梳理整合,从企业、岗位、任务、能力等维度进行分类呈现,便于清晰对比两者的工作侧重: 一、代表性企业对比 分类企业名称应用开发方向中移系统集成有限公司、科大讯飞河北科技有限公司、华为技术服务有限…...

全面理解 Linux 内核性能问题:分类、实战与调优策略
在 Linux 系统(特别是嵌入式或服务器环境)中,性能问题往往错综复杂、表象多变。只有对常见性能问题进行系统归类、理解其症状与根源,才能有效定位和解决。本文将围绕八大类核心性能问题,结合实战示例,逐类分…...
App 上线后还能加固吗?iOS 应用的动态安全补强方案实战分享(含 Ipa Guard 等工具组合)
很多开发者以为 App 一旦上线,安全策略也就定型了。但现实是,App 上线只是攻击者的起点——从黑产扫描符号表、静态分析资源文件、注入调试逻辑,到篡改功能模块,这些行为都可能在你“以为很安全”的上线版本里悄然发生。 本篇文章…...

大语言模型评测体系全解析(下篇):工具链、学术前沿与实战策略
文章目录 一、评测工具链:从手工测试到自动化工程的效率革命(一)OpenCompass:开源评测框架的生态构建1. 技术架构:三层架构实现评测自动化2. 开发者赋能:从入门到进阶的工具矩阵 (二)…...