pnpm v8版本升级变化关注点(前瞻速攻版)

这篇具有很好参考价值的文章主要介绍了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.0

  registry.npmjs.org/react@18.0.0:
    resolution: { ... }
    name: react
    version: 18.0.0
    engines: {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 Beta 版追加

Date:2023-03-07

pnpm v8.0.0-beta.0 已经释出,新增了 dedupe-peer-dependents 选项,用于缓解 peerDependencies 重复问题,现在以下配置搭配将在 v8 中默认开启:

# 优先从 root 解析 peerDependencies ,尽可能的提升唯一性
resolve-peers-from-workspace-root=true
# 去除重复的 peerDependencies ,尽可能减少重复性
dedupe-peer-dependents=true

pnpm 通过这两个配置,可以尽力而为的缓解 peerDependencies 多实例、重复对项目造成的致命问题。

但他仍然无法像 alias 重定位一样彻底保证项目单实例,同时无法解子包调试热更新问题,所以此处更推荐优先使用 Monorepo 丝滑方法论 ,由于丝滑方法论需要在 webpack 或内置于框架中实现,在 pnpm >= 7.29.0 版本下,若你环境受限无法落地丝滑方法论但又遭遇 peerDependencies 问题时,可以打开这两个选项缓解 peerDependencies 问题。文章来源地址https://www.toymoban.com/news/detail-460264.html

到了这里,关于pnpm v8版本升级变化关注点(前瞻速攻版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pnpm 升级

    1. 在以下路径下删除pnpm包 2. 执行which pnpm,在结果目录中删除pnpm 3. sudo npm install -g pnpm 重新安装,node默认使用16

    2024年02月09日
    浏览(24)
  • Electron 30.0.0 发布,升级 Node 和 V8 引擎

    近日,Electron 30.0.0 正式发布!你可以通过 npm install electron@latest 进行安装,或者从 Electron 的发布网站下载,继续阅读了解此版本的详细信息。 Windows 上支持 ASAR 完整性融合。如果未正确配置,启用 ASAR 完整性的现有应用程序可能在 Windows 上无法正常工作。使用 Electron 打包工

    2024年04月29日
    浏览(32)
  • ChatGPT热度再升级,AIGC的投资人开始关注“文生图”了

    (图片来源:Pixabay) AIGC是一场老互联网人的豪赌,一次美元基金的狂欢,一个时代的进击。   @数科星球 原创 作者丨科科  编辑丨十里香   在2023年的第一季度,ChatGPT以“狂飙”姿态火速出圈,由这款产品所带动的AIGC行业也屡屡登上热搜。 时至今日,有些人开始“唱空”

    2024年02月09日
    浏览(32)
  • nvm 管理node版本后 pnpm --version ‘pnpm‘ 不是内部或外部命令,也不是可运行的程序

    问题:电脑使用nvm管理版本后 安装pnpm成功后 使用pnpm --version 检查是否安装成功,结果却报错 pnpm --version ‘pnpm’ 不是内部或外部命令,也不是可运行的程序。搞了小半天终于ok了。原来是npm全局包路径、缓存路径的问题。 一、安装pnpm,安装时先看下与node的兼容性、我使用的

    2024年02月09日
    浏览(51)
  • Stable Diffusion 免费升级 SDXL 1.0,哪些新特性值得关注?体验如何?5 分钟带你体验!

    7 月 26 日,Stability AI 发布了 SDXL 1.0,号称目前为止,最厉害的开放式图像生成大模型。 它到底有没有网上说的那么炸裂?真的已经实现了像 midjourney 一样 靠嘴出图 的功能吗?相对于之前的版本,增加了哪些新特性? 今天体验了一把,一起来看看! 大家都知道,目前的绘画

    2024年02月05日
    浏览(58)
  • 人机识别技术再升级,AIGC为验证码带来万亿种新变化

    网上输入“破解验证码”,会出现1740万个搜索结果。“验证码识别、轻松破解、暴力破解、逻辑漏洞破解、简单破解”等等各类的内容,不一而足,关于“如何用破解某某验证码”的帖子更是多如牛毛。 搜索引擎的相关结果 2017年,绍兴警方成功破获了全国首例

    2024年02月09日
    浏览(37)
  • ubuntu18.04复现yolo v8环境配置之CUDA与pytorch版本问题以及多CUDA版本安装及切换

    最近在复现yolo v8的程序,特记录一下过程 环境:ubuntu18.04+ros melodic 小知识:GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA,不必删除之前的CUDA,可以实现多版本的CUDA切换 一、查看当前PyTorch使用的CUDA版本: 注意

    2024年02月11日
    浏览(41)
  • 从Vue 2到Vue 3:深入了解路由配置的变化与升级建议

    🎬 岸边的风 :个人主页  🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️生活的理想,就是为了理想的生活! 目录 📘 前言 vue2路由配置 📟 一、控制台安装vue路由 📟 二、项目src文件夹下创建router文件夹,并在router文件夹下创建index.js文件  📟 三、在index.js文件夹下进行vue路由

    2024年02月15日
    浏览(21)
  • autox.js的三个版本universal、armeabi-v7a、arm64-v8a的区别

    universal : 通用版(不在乎安装包大小/懒得选就用这个版本,包含以下2种CPU架构so) armeabi-v7a : 32位ARM设备(备用机首选) arm64-v8a : 64位ARM设备(主流旗舰机) ABI 在Android 系统上,每个不同的CPU支持不同的指令集,CPU与指令集的组合都有对应的二进制接口,即ABI armeabi 是第5、

    2024年02月05日
    浏览(37)
  • Web3中文|倒计时26天:上海升级已定,以太坊将发生哪些重大变化?

    3月16日,据以太坊核心开发者Tim Beiko 的推文,以太坊基金会核心开发团队已经确认上海升级将于网路区块高度6209536 时进行,具体为UTC 时间4月12日晚上22:27:35。 上海升级临近,在网上各篇文章中,出现了Shapella、ShanghaiUpgrade、上海Shapella升级、Sepolia的Shapella 升级等词,对于不

    2023年04月23日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包