yarn 迁移 pnpm 记录

迁移步骤

1.全局安装pnpm
npm -g i pnpm
2. 使用 pnpm import 由yarn.lock导出pnpm.lock
3. 添加 scriptpackage.json 确保pnpm唯一包管理
"scripts": {"preinstall": "npx only-allow pnpm", ...
}
4. 更换.yarnrc.npmrc
5. 运行 pnpm i 安装依赖
6. 将脚本的指令由 yarn 更换为 pnpm
7. 对应ci构建的脚本更改
8. 删除yarn.lock文件(需先删除node_modules)
9. 根据测试方案进行测试
10. 最后效果汇总

迁移风险

一、幽灵依赖问题

由于 yarn/npm 的扁平化包管理,导致项目中存在许多幽灵依赖的使用问题,直接切换pnpm而不处理,会导致项目直接运行失败

解决方案

使用自开发的幽灵依赖扫描工具@winches/ghost

幽灵扫描原理

基于AST和正则对项目中的require(), import(), import/export from xxx, @import进行扫描

将扫描出的包名与项目中的package.json对比,并过滤不合法包名,路径别名,内置nodejs包

以发掘出项目中存在的幽灵依赖

以下为使用工具扫描出目前项目中存在的幽灵依赖

编译时报错(依赖中的幽灵依赖):tslib@2.4.0tsconfig.jsonimportHelpers配置开启后需要)

幽灵依赖的处理

1、 .npmrc 中添加 public-hoist-pattern[]='package name' 将对应的包提示至顶层目录

2、pnpm add 对应版本的依赖

3、shamefully-hoist=true 将所有依赖都提升至根目录(不推荐)。

二、peerDependencies

安装第三方包的时候,可能出现该包 A peerDependencies 包 B 的错误

这通常表示尝试安装的包 A 需要另一个包 B 作为其依赖项才能正常工作。

解决方案

1、 直接显式安装本地,按照报错提示,先安装包 B,然后再安装包 A

2、使用 packageExtensions 处理

三、Conflicting

解决方法

1、--force 强制安装冲突的包

2、如果你在使用一个 monorepo 管理多个项目,可以使用 pnpm recursive 命令,在整个 monorepo 中安装/更新包,以解决依赖冲突

3、使用 pnpm dedupe 命令,它会自动检测并解决依赖冲突。

四、unmet peer dependencies

非可选对等依赖项打印出来的警告,包可以在没有对等依赖的情况下工作则可忽略对应的提示

1、配置peerDependencyRules忽略对应的警告提示

{"pnpm": {"peerDependencyRules": {"allowAny": ["eslint"]}}
}

2、.npmrc 配置文件中添加 strict-peer-dependencies=false ,关闭严格的对等依赖模式


测试方案

1. 依次运行package.json里的scripts命令
2. 触发各流水线检查功能是否正常
3. 页面检查

最后效果

性能对比

yarn

第一次安装用时 242.09s

存在缓存时用时 161.93s

pnpm

第一次安装用时 93.00 s

存在缓存时用时 60.00 s

内存对比

yarn

pnpm

安全性对比

yarn

扁平化依赖虽然解决了不少问题,但是随即带来了依赖非法访问的问题,项目代码在某些情况下可以在代码中使用没有被定义在 package.json 中的包,这种情况就是我们常说的幽灵依赖

pnpm

默认情况下禁止幽灵依赖,pnpm 的依赖文件结构与 package.json 中的声明保持一致,因此,我们将不能再访问 package.json 中未声明的包。 这解决了 npm / yarn 一直依赖的幽灵依赖问题,提升了依赖访问的安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础入门篇——赋值运算符(九)

赋值运算符的作用是将一个数值、变量或者表达式的值赋给某一个变量。在赋值过程中,运算顺序从右往左,将右边表达式的结果赋值给左边的变量。 一、赋值运算符 【】赋值,用法:a10,将10赋值给变量a; 【】相…

ETCD备份还原

备份只需要在一个节点上备就可以了,每个节点上的数据是同步的;但是数据恢复是需要在每个主节点上进行 1.查看证书位置 #查看etcd证书 [rootk8s-master01 manifests]# cat /etc/kubernetes/manifests/kube-apiserver.yaml |grep etcd- --etcd-cafile/et…

【果树农药喷洒机器人】Part5:基于深度相机与分割掩膜的果树冠层体积探测方法

文章目录 一、引言二、树冠体积测量对比方法2.1冠层体积人工测量法2.2冠层体积拟合测量法 三、基于深度相机与分割掩膜探测树冠体积方法3.1像素值与深度值的转换3.2树冠体积视觉探测法3.3实验分析 总结 一、引言 果树靶标探测是实现农药精准喷施的关键环节,本章以果…

Syncfusion Essential Edit for WPF Crack

Syncfusion Essential Edit for WPF Crack 在任何WPF应用程序中启用语法高亮显示。 Syncfusion Essential Edit for WPF是一款具有所有基本功能的编辑器,如文本编辑、剪切、复制和粘贴。它允许用户从各种文件格式打开文件并将其保存为各种文件格式。Syncfusion Esse…

java.lang.IllegalStateException: 不允许修改锁定的参数映射

问题描述: 这个问题是在我写javaweb项目,做敏感词过滤时出现的 需求是:如果是由 getParameter(String s) 得到的数据,可以直接修改value值,将含有敏感词的部分替换为 *** request.getParameterMap() 方法返回一个包…

2023牛客暑期多校第三场部分题解

索引 ABDEGHIJ A 直接输出两个数的差即可。再判一下无解的情况。 B 其实思路还挺顺的,首先拿的牌肯定是一段增一段减一段增一段减……的序列,并且 > n >n >n 的开头和 ≤ n \leq n ≤n 的开头两种序列是对称的,我们随便考虑一种…

Windows命名管道学习记录

前言 编程菜鸟,第一次接触进程间通信,网上windows命名管道的资料太少了,很多还是错的,学起来很费劲,现在也只能说跑的通程序了,记录一下防止忘记,理解没有很深,可能会有错误&#x…

我维护电脑的方法

无论是学习还是工作,电脑都是IT人必不可少的重要武器,一台好电脑除了自身配置要经得起考验,后期主人对它的维护也是决定它寿命的重要因素! 你日常是怎么维护你的“战友”的呢,维护电脑运行你有什么好的建议吗&#xff…

1749. 任意子数组和的绝对值的最大值

诸神缄默不语-个人CSDN博文目录 力扣刷题笔记 文章目录 1. 暴力搜索2. 动态规划3. 前缀和 1. 暴力搜索 直接用2个指针从索引0开始找到最后一个索引,时间复杂度大概是 O ( n 2 ) O(n^2) O(n2)吧,总之这么搞不行,以下是我用Python写的一些典型…

设计模式之六:命令模式(封装调用)

命令模式可以将请求的对象和执行请求的对象解耦(实际上是通过命令对象进行沟通,即解耦)。(个人感觉,这章讲的很一般) 按个人理解来讲: 假如需要一个遥控器,遥控器有一个插口可以插上…

【JAVA】有关时间的操作在编程中如何实现?

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言Date 类Date 类方法Data的缺陷实例获取当前日期时间日期比较java中设置date数据的显示格式 前言 在许多应用程序中,日期和时间的处理是必不可少的。Java提供了一…

【80天学习完《深入理解计算机系统》】第二天 2.2 整数的表示【有符号数,无符号数,符号数的扩展,有无符号数的转变】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

【Matlab】Elman神经网络遗传算法(Elman-GA)函数极值寻优——非线性函数求极值

往期博客👉 【Matlab】BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值 【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值 【Matlab】RBF神经网络遗传算法(RBF-GA)函数极值寻优——非线性函数求极值 本篇博客将主要介绍Elman神…

【数据结构】“单链表”的练习题

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

Unity之ShaderGraph 节点介绍 数学节点

数学 高级Absolute(绝对值)Exponential(幂)Length(长度)Log(对数)Modulo(余数)Negate(相反数)Normalize(标准化矢量&…

Django Rest_Framework(二)

文章目录 1. http请求响应1.1. 请求与响应1.1.1 Request1.1.1.1 常用属性1).data2).query_params3)request._request 基本使用 1.1.2 Response1.1.2.1 构造方式1.1.2.2 response对象的属性1).data2).status_code3&…

技术应用:Docker安全性的最佳实验|聊聊工程化Docker

🔥 技术相关:《技术应用》 ⛺️ I Love you, like a fire! 文章目录 首先,使用Docker Hub控制访问其次,保护密钥写在最后 不可否认,能生存在互联网上的软件都是相互关联的,当我们开发一款应用程序时&#x…

Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》

一、查看可安装的版本 docker search prom/prometheus 二、拉取镜像 docker pull prom/prometheus 三、查看镜像 docker images 四、书写配置文件-以及创建挂载目录 宿主机挂载目录位置: 以及准备对应的挂载目录: /usr/local/docker/promethues/se…

字节C++后端面试总结

字节的面经,技术栈是 C++ 后端。 计算机网络 UDP和TCP区别 先说了概念一个是面向连接的基于字节流的可靠连接,一个是不需要连接的基于数据报的不可靠传输 然后说了几个小点,比如首部长度、应用场景、服务对象什么的。 补充: 还有一个很重要的点:UDP 的实时性比 TCP 好…

Kotlin基础(十一):反射和注解

前言 本文主要讲解kotlin反射和注解。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 kotlin反射 1.1.1 kotlin反射概念和常见使用场景 在Kotlin中,反射是一种能够在运行时动态地获取、检查和操作类、属性、方法等结构的能力。Kotlin为反射提供了一…