pnpm替换lerna+yarn的踩坑记录

2023-11-02

如果有使用monorepo的需求,lerna+yarn会是很多开发者的选择,然而在实际开发中,lerna的很多功能我们并不需要,同时它也存在着一定的上手学习成本,而且 yarn也会存在一些问题比如多个项目会重复安装依赖、幽灵依赖等,这时候不妨考虑用更加轻便高效的pnpm

pnpm

pnpmyarn/npm一样是一款包管理工具,不同于yarn/npm的扁平化的依赖管理机制,pnpm采用软硬链接的机制实现依赖的管理和引用,不仅安装速度极快,高效利用磁盘空间,也解决了幽灵依赖的问题,而且pnpm workplace 提供了monorepo的支持,我们完全可以用pnpm替换lerna+yarn

如何替换

  1. 全局安装pnpm
 npm install -g pnpm    
复制代码
  1. 先配置pnpm workspace,在项目根目录新建一个pnpm-workspaceyaml 输入如下代码
packages:

 \- 'packages/*'   
复制代码
  1. 删除项目中已有的lerna.json, 用pnpm的 workspace 来替代lerna实现monorepo的包管理方式
  2. 执行pnpm install安装项目需要的依赖(安装过程中可能出现卡住的情况,可能是因为在内网环境下源不稳定重新安装即可) 安装成功后如果是Windows环境会在你当前项目所在硬盘的根目录下新增了一个.pnpm-store文件夹,刚刚装的依赖文件都在里面
  3. 把项目中的package-lock.jsonyarn.lock删掉,所有锁都由 pnpm-lock.yaml来提供,至此pnpm的替换工作结束
  4. 替换掉脚本命令,与yarn相关的命令替换为: pnpm 或者 pnpm run
  5. 调整 pipeline、以及Dockfile或者其他CI/CD配置文件里面的依赖安装命令

遇到的坑和解决方式

1、vite打包失败

Error:[vite]:Rollup failed to resolve import "vue-property-decorator" from "../shared/xxx/index.ts".This is most likely unintended because it can break your application at runtime.If you do want to externalize this module explicitly add it tobuild.rollupoptions.external'
复制代码

执行打包指令后会遇到一些导入依赖失败的问题,这是因为pnpm的依赖引用是根据package.json中是否有正确声明依赖来实现的,比如你要在packages/shared里声明vue-property-decorator,那必须要在packages/shared/package.json中有声明这个依赖,而现在shared中并没有package.json文件,所以无法引入。 所以建议去除每个子项目的共同依赖,比如vue,lodash等,然后统一放入顶层的package.json

解决办法

  1. 在各子模块的package.json搜索导入失败的依赖XXX,确认它们版本号是否统一,如果是的话,直接执行pnpm add XXX -w在根目录添加这个依赖再pnpm rm XXX -F {package}, 如果版本不一致就不要rm这一步
  2. 重复第一步,直到所有有问题的依赖重新安装好

2、vue页面空白

初步判断是由于import { Vue } from 'vue-property-decorator'; 引入异常导致的 在vite.config中设置了vue的别名, 在引入vue的时候没有按pnpm规则走软硬链接的方式,而是去直接读取了根目录下node_modules/vue/dist/vue.js,所以没有正确取到真正的存在store下的vue依赖包

resolve: {
    alias: [
        ...
       { find: 'vue', replacement: lernaRootPath('node_modules/vue/dist/vue.js') },
   ],
},
复制代码

解决办法:

  • 修改vue指向, 把vue指向vue/dist/vue.esm.js
resolve: {
    alias: [
        ...
        { find: 'vue', replacement: 'vue/dist/vue.esm.js' },
   ],
},
复制代码

3、部分依赖需要预编译

因为ViteDevServer是基于浏览器的Natvie ES Module实现的,所以对于使用的依赖如果是CommonJSAMD的模块,则须要进行模块类型的转化,比如依赖中使用到了echarts4.6.0,它属于CommonJS的模块,需要进行预编译对它进行模块类型的转化

// vite.config.ts
const { merge } = require('webpack-merge');

export default defineConfig(({ mode }) => {
    return merge(common({ mode }), {
        optimizeDeps: {
            entries: ['./vite/entry.ts'],
            include: ['需要预编译的依赖'],
        },
        ....
    });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pnpm替换lerna+yarn的踩坑记录 的相关文章

随机推荐

  • Nginx禁止某IP(段)访问的两种方法

    修改Nginx配置文件nginx conf Nginx配置访问IP可以修改nginx conf文件 只需要在server中添加allow和deny的IP即可 如下 server listen 80 server name localhost
  • 数据加载的时候出现RuntimeError: Pin memory thread exited unexpectedly

    很有可能是因为num workers太大导致的 可以调小一些
  • ch03-数值计算(进阶)

    文章目录 数学函数 三角 双曲函数 指数和对数 算术操作 自动域 数值计算 舍入 和积差 符号函数 截断 插值 导数和微积分 梯度 梯形公式 多项式 简介 便捷类 关系运算 真值测试 值和类型 逻辑运算 比较 二进制运算 位运算 左右移 打
  • 优先队列(priority_queue)总结

    文章目录 priority queue 一 优先队列简介 二 优先队列特性和操作 1 头文件 定义 2 默认优先输出大数据 1 举例 3 优先输出小数据 即小顶堆 1 举例 4 自定义优先级 重载默认的 lt 符号 1 使用 funtion
  • python爬虫——爬取电影天堂磁力链接

    爬虫 静态网页爬取 工具 pycharm python3 6 火狐浏览器 模块 requests 可以使用pip install requests安装 re 不用安装 网址 http www ygdy8 net html gndy dyzz
  • 架构--网络关键指标

    架构 网络关键指标 1 QPS Queries Per Second 每秒查询率 是一台服务器每秒能够相应的查询次数 是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准 即每秒的响应请求数 也即是最大吞吐能力 2 TPS Tran
  • Stable Diffusion 系列教程

    目录 1 高清修复 1 1 原理 1 2 基本操作 1 3 优缺点 2 UpScale 放大脚本 2 1 原理 2 2 基本操作 2 3 优缺点 3 附加功能放大 3 1 原理 3 2 基本操作 3 3 优缺点 优化出图质量 产出更高清 分
  • Firefly

    Firefly 流萤 中文对话式大语言模型在本文中 笔者将介绍关于Firefly 流萤 模型的工作 一个中文对话式大语言模型 https mp weixin qq com s TX7wj8IzD EaMTvk0bjRtA一个支持中文的176
  • View 的事件分发

    事件分发机制 1 1 事件分发的顺序 Activity gt ViewGroup gt View 1 2 事件分发涉及到的方法 public boolean dispatchTouchEvent MotionEvent ev 事件过来的时候
  • k8s 概念说明,k8s面试题

    什么是Kubernetes Kubernetes是一种开源容器编排系统 可自动化应用程序的部署 扩展和管理 Kubernetes 中的 Master 组件有哪些 Kubernetes 中的 Master 组件包括 API Server et
  • 4-ubuntu22.04-安装QT-5.15.2

    ubuntu22 04 安装QT 5 15 2 一 Ubuntu换源 二 命令行安装QT 5 15 2 三 配置环境变量 四 QT安装选择 五 QT环境依赖安装gcc和g 一 Ubuntu换源 换源注意根据自己系统的版本进行换源 有 bio
  • ElasticSearch适配器adapter的使用及配置

    文章目录 前言 一 修改启动器配置 application yml 二 适配器表映射文件 修改 conf es mytest user yml文件 单表映射索引示例sql 单表映射索引示例sql带函数或运算操作 多表映射 一对一 多对一 索
  • 计算机磁盘管理进行磁盘转移,将磁盘移到另一台计算机

    将磁盘移到另一台计算机 10 12 2017 本文内容 适用于 Windows 10 Windows 8 1 Windows Server 半年频道 Windows Server 2016 Windows Server 2012 R2 Wi
  • Hive 分组

    2 1 Group By 语句 GROUP BY 语句通常会和聚合函数一起使用 按照一个或者多个列队结果进行分组 然 后对每个组执行聚合操作 1 案例实操 1 计算 emp 表每个部门的平均工资 hive default gt select
  • 雪花算法(SnowFlake)

    简介 现在的服务基本是分布式 微服务形式的 而且大数据量也导致分库分表的产生 对于水平分表就需要保证表中 id 的全局唯一性 对于 MySQL 而言 一个表中的主键 id 一般使用自增的方式 但是如果进行水平分表之后 多个表中会生成重复的
  • Java线程的同步机制(synchronized关键字)

    线程的同步机制 synchronized 1 背景 例子 创建个窗口卖票 总票数为100张 使用实现Runnable接口的方式 1 问题 卖票过程中 出现了重票 错票 gt 出现了线程的安全问题 2 问题出现的原因 当某个线程操作车票的过程
  • spring中的扩展点解析以及实践使用

    文章目录 1 ApplicationContextInitializer 2 BeanDefinitionRegistryPostProcessor 3 BeanFactoryPostProcessor 4 InstantiationAwa
  • 西门子S7-200 PLC接地和接线

    对于所有的电器设备 接地和接线是非常重要的 它能够确保系统具备最优的操作特性 同时能够为系统提供更好的电子噪声保护 在接地和接线之前 必须先确保设备的电源已被切断 也要保证与该设备相关的设备电源已被切断 在对S7 200及其相关设备接线时
  • 从零推导一个多层感知机神经网络(附matlab源码,可直接运行)

    可以先跳到代码示例部分看看效果 算法基础 激活函数 损失函数 链式法则 向量求导 代码示例 代码文件结构说明 函数脚本 可运行脚本 效果演示 代码下载链接 算法基础 激活函数 激活函数的作用 激活函数把非线性引入了神经网络 后面的代码用到的
  • pnpm替换lerna+yarn的踩坑记录

    如果有使用monorepo的需求 lerna yarn会是很多开发者的选择 然而在实际开发中 lerna的很多功能我们并不需要 同时它也存在着一定的上手学习成本 而且 yarn也会存在一些问题比如多个项目会重复安装依赖 幽灵依赖等 这时候不