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

从pnpm报错到Vite打包优化:手把手解决JeecgBoot-Vue3项目启动与构建的那些坑

从pnpm报错到Vite打包优化:手把手解决JeecgBoot-Vue3项目启动与构建的那些坑

当你第一次尝试运行JeecgBoot-Vue3项目时,可能会遇到一系列令人困惑的问题。从pnpm安装依赖时的报错,到Vite打包配置的优化,每一步都可能成为阻碍项目顺利运行的"坑"。本文将按照项目启动和构建的实际流程,带你逐一解决这些常见问题,并深入理解背后的原理。

1. 项目初始化与依赖安装问题

1.1 解决pnpm overrides解析错误

执行pnpm install时,最常见的错误之一是:

ERR_PNPM_INVALID_OVERRIDE_SELECTOR Cannot parse the "//" selector in the overrides

这个错误源于package.json中的resolutionspnpm.overrides字段包含注释符号"//"。pnpm在解析这些配置时,会严格校验语法格式。

解决方案

  1. 打开package.json文件
  2. 找到包含"//"注释的resolutions或overrides配置
  3. 删除注释行或将其移到字段外部

修改前:

"resolutions": { "//": "Used to install imagemin dependencies", "bin-wrapper": "npm:bin-wrapper-china", "rollup": "^2.56.3" }

修改后:

"resolutions": { "bin-wrapper": "npm:bin-wrapper-china", "rollup": "^2.56.3" }

提示:pnpm.overrides和yarn的resolutions功能类似,都可以用来强制指定依赖版本,覆盖所有子依赖。这在解决某些依赖冲突问题时非常有用。

1.2 处理esbuild安装路径问题

另一个常见问题是esbuild安装失败:

Error: esbuild: Failed to install correctly

正确的解决步骤

  1. 首先确认报错信息中esbuild的具体路径
  2. 根据路径执行对应的安装脚本

例如,如果报错路径是:

/node_modules/vite-plugin-mock/node_modules/esbuild/bin/esbuild

则应执行:

node node_modules/vite-plugin-mock/node_modules/esbuild/install.js

注意:不要盲目执行网上通用的解决方案,一定要根据实际的报错路径进行调整。

2. Vite配置优化与生产构建

2.1 解决minify配置冲突

在Vite项目中,你可能会遇到这样的警告:

build.terserOptions is specified but build.minify is not set to use Terser. Note Vite now defaults to use esbuild for minification.

这是因为Vite 2.x版本后默认使用esbuild作为压缩工具,而项目中可能仍然保留了terser的配置。

两种解决方案

  1. 完全切换到esbuild(推荐):
build: { minify: 'esbuild', // 删除terserOptions相关配置 }
  1. 继续使用terser
build: { minify: 'terser', terserOptions: { compress: { drop_console: true, drop_debugger: true } } }

性能对比

压缩工具速度压缩率功能完整性
esbuild⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡
terser⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡

2.2 optimizeDeps优化配置

Vite的依赖预编译(optimizeDeps)可以显著提升开发服务器的启动速度。对于JeecgBoot-Vue3这样的大型项目,合理配置optimizeDeps尤为重要。

推荐配置

optimizeDeps: { include: [ 'vue', 'vue-router', 'pinia', 'axios', 'lodash-es', '@vueuse/core', // 添加项目中其他常用的大型依赖 ], exclude: ['vue-demi'] // 排除已知不需要预编译的依赖 }

优化技巧

  • 使用vite-plugin-optimize-persist插件自动记录和优化include列表
  • 监控.vite/deps目录大小,避免预编译过多依赖
  • 对于CommonJS模块,确保设置needsInterop: true

3. Vue 3迁移相关问题

3.1 解决::v-deep样式警告

Vue 3中废弃了::v-deep的旧写法,改为:deep()语法。在JeecgBoot-Vue3项目中,你可能会看到如下警告:

WARN [@vue/compiler-sfc] ::v-deep usage as a combinator has been deprecated. Use :deep() instead.

迁移方案

旧写法:

::v-deep .carousel-btn.prev { left: 270px; }

新写法:

:deep(.carousel-btn.prev) { left: 270px; }

其他样式相关变更

  • >>>操作符已废弃,同样使用:deep()替代
  • ::v-slotted改为:slotted
  • ::v-global改为:global

3.2 组合式API最佳实践

JeecgBoot-Vue3基于Vue 3的组合式API开发,推荐以下实践:

  1. 逻辑复用:使用composables目录组织可复用的逻辑
  2. 状态管理:优先使用Pinia替代Vuex
  3. TypeScript集成:充分利用Vue 3对TS的良好支持

示例代码结构

// src/composables/useTable.ts import { ref, computed } from 'vue' export function useTable(api) { const loading = ref(false) const dataSource = ref([]) const fetchData = async () => { loading.value = true try { dataSource.value = await api() } finally { loading.value = false } } return { loading, dataSource, fetchData } }

4. 性能优化与调试技巧

4.1 构建分析工具

要优化生产构建,首先需要分析打包结果:

  1. 安装分析插件:
pnpm add -D rollup-plugin-visualizer
  1. 配置vite.config.js:
import { visualizer } from 'rollup-plugin-visualizer' export default defineConfig({ plugins: [ visualizer({ open: true, gzipSize: true, brotliSize: true }) ] })

构建后会生成一个交互式的可视化报告,帮助你:

  • 识别过大的依赖
  • 发现重复代码
  • 优化代码分割策略

4.2 分包策略优化

对于大型管理后台项目,合理的分包策略可以显著提升加载性能:

build: { rollupOptions: { output: { manualChunks(id) { if (id.includes('node_modules')) { if (id.includes('lodash')) { return 'lodash' } if (id.includes('echarts')) { return 'echarts' } if (id.includes('ant-design-vue')) { return 'antdv' } return 'vendor' } } } } }

分包原则

  • 将大型库单独分包(如echarts、ant-design-vue)
  • 将不常变更的依赖分组为vendor
  • 保持业务代码的合理分割

4.3 开发环境加速技巧

  1. 限制预编译范围
optimizeDeps: { entries: [ 'src/main.ts', // 仅预编译入口文件直接引用的依赖 ] }
  1. 禁用不必要的检查
server: { hmr: { overlay: false // 禁用错误遮罩层提升HMR速度 } }
  1. 使用文件系统缓存
cacheDir: './.vite_cache' // 指定自定义缓存目录
http://www.jsqmd.com/news/900841/

相关文章:

  • 还在靠人肉发版?真正的 DevOps 平台,凌晨3点都能自己干活
  • 【MATLAB源码-第450期】基于MATLAB的GMSK调制系统中IQ相干、差分、鉴频与Viterbi解调算法对比仿真
  • Claude Code + DeepSeek V4 Pro +VS Code 安装
  • Java 做 AI 提取任务时,为什么我更建议先想好结构化输出
  • NASM到底怎么用 汇编转机器码实战详解
  • DDrawCompat:让经典DirectX游戏在现代Windows系统重获新生的完整指南
  • FlashAttention与信息检索:让AI秒找答案
  • 第5篇_PUBLISH不是收到就转发_Broker怎么处理QoS_PacketId和多客户端fanout
  • 陕西旅游酒店 GEO 服务市场深度调查:AI 搜索优化格局与真实服务真相
  • 你还在手动写脚本,别人已经用智能体跑完回归测试了
  • Cartographer无里程计建图实战:室内外效果对比与参数调优心得
  • AI智能体培训后可以做什么工作?这7个方向值得关注
  • GMS1.4 YYC编译的游戏,如何安全地修改游戏内文字?(附UndertaleModTool实战)
  • 2026世界杯洛杉矶SoFi体育场:50亿造价的天价足球圣殿
  • 《超简单:用 Python 让 Excel 飞起来》读书笔记:1.2.1 安装 Python 官方编程环境 IDLE
  • 2026年广州空调安装/清洗/移机/加雪种/拆装/维修/深度清洗/中央空调清洗/杀菌消毒/拆洗推荐:专业技术与省心服务口碑之选 - 品牌企业推荐师(官方)
  • 【多无人机集群控制11】鲁棒编队跟踪仿真,滑模与PID对比,MATLAB例程
  • 第6篇_Retain_Will_KeepAlive_工业现场为什么不能只会转发PUBLISH
  • 别再只用disp了!Matlab里fprintf格式化输出实战,从%f到%f\n的保姆级指南
  • 从Arduino到ESP32:搞定3.3V/5V混接通信,这几种电平转换电路你试过吗?
  • 把 ZipVoice 从 onnxruntime 移植到 MNN —— 7 个让人怀疑人生的细节
  • 别只改my.cnf了!深入解读MariaDB密码策略与general_log审计的取舍与最佳实践
  • 别再只盯着RGB了!搞懂CIE 1931 XYZ和Yxy,你的图像处理才算入门
  • ProxySQL选型实战:从手写读写分离到中间件的踩坑全记录
  • Grok生成的pdf怎么导出 “AI导出鸭”不会搞算我输!
  • ChatGPT饮食建议生成器上线倒计时:最后48小时必须完成的3项合规改造(GDPR+《互联网诊疗监管办法》双达标清单)
  • Louvain算法实战:用NetworkX和Python分析你的社交网络好友圈子
  • Win11Debloat:3分钟完成Windows 11终极优化与深度清理的免费神器
  • 到处听见韬τ定律
  • Python 入门:初识函数