当前位置: 首页 > news >正文

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-dependenciesv7.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

进一步,在实际业务中,分情况考虑可能造成的影响:

  1. 普通场景:在本地开发时,按照开发规范,我们必然对 peerDependencies 的依赖也在 devDependencies 指定一份,但不在 dependencies 指定,所以该依赖是肯定会被安装的,auto-install-peers 不会对我们造成影响。

  2. monorepo 场景:在 monorepo 时我们有 Monorepo丝滑方法论 ,依赖总唯一,所以无需担心 auto-install-peers 问题。

通过分析我们得知 auto-install-peers=true 默认打开一般情况对我们没有实质性影响。

下面我们举两个会存在问题的 case 供参考:

  1. npm link 调试等情况,导致 peerDependencies 被意外安装,但 npm link 早已过时不再使用,这种情况是很少见的。

  2. 不遵守 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 偶然发生,目前比较好的 被动 管控手法有:

  1. 预打包依赖:参考 Nextjs / Umi 预打包策略,实现略。

  2. pnpm time-based :time-based 策略可以基于包的最后发布时间来确保你使用的依赖在某个发布时间前,从而规避供应链发新包导致的攻击问题,但对于非自建 npm registry 需要花费更多时间读取 npm 包元信息,目前 pnpm 官方采用此策略,此处不做展开。

  3. pnpm lowest-direct :lowest-direct 是另一种 pnpm 推出的 缓解 供应链攻击的手段,他等价于锁定你的直接依赖版本(解析为 semver 的最低依赖版本),比如 ^1.0.0 也只会安装 1.0.0 最低版本,而不是最新的 ^1 版本,这等价于你锁定该依赖到 1.0.0 ,若你需要 1.2.0 版本也需要写为 ^1.2.01.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&#xff…...

linux系统开机文段释义

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

抽奖动画大转盘抽奖思路与做法

抽奖是各类营销活动中最常见的一种形式&#xff0c;本产品需求大致如下&#xff1a;转盘周围跑马灯交替闪烁&#xff0c;点击抽奖&#xff0c;大转盘旋转&#xff0c;调用接口获取抽奖结果&#xff0c;大转盘指针指向对应的奖品。高保如下图12.整体思路本需求要求跑马灯交替闪烁…...

Java实现 - 华为2016研发工程师编程题

文章目录删数字符集合数独删数 题目描述 有一个数组 a[N] 顺序存放 0 ~ N-1 &#xff0c;要求每隔两个数删掉一个数&#xff0c;到末尾时循环至开头继续进行&#xff0c;求最后一个被删掉的数的原始下标位置。以 8 个数 (N7) 为例 :&#xff5b; 0&#xff0c;1&#xff0c;2…...

nginx的七层负载均衡

文章目录一、负载均衡介绍二、nginx的配置文件三、实验过程总结一、负载均衡介绍 四层负载均衡 所谓四层负载均衡是指OSI七层模型中的传输层, 那么传输层Nginx已经支持TCP/IP的控制, 所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载, 那么他的好处是性能非常快,…...

信息加密技术

介绍信息加密 信息加密是实现数据保密性的手段。 信息加密&#xff08;Encryption&#xff09;是将明文信息转换为密文信息&#xff0c;使之在缺少特殊信息时不可读的过程。只有拥有解密方法的对象&#xff0c;经由解密过程&#xff0c;才能将密文还原为正常可读的内容。 现…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...