v3.0.0
距上一个版本 v2.0.9(2022-02)历时三年半,累计 163 个提交。本次为技术栈整体升级,包含大量破坏性变更,升级前请务必阅读文末的迁移说明。
💥 破坏性变更
| 项目 | 变更前 | 变更后 |
|---|---|---|
| 框架 | Vue 2.6 | Vue 3.4 |
| UI 组件库 | Element UI 2.15 | Element Plus 2.8 |
| 路由 | vue-router 3.4 | vue-router 4.4 |
| 状态管理 | vuex 3.5 | vuex 4.1 |
| 构建工具 | Vue CLI 5(webpack) | Vite 8 |
| Node 版本 | >= 8.9 | >= 22(推荐 v24 LTS) |
| 包管理器 | npm | pnpm |
| 图表库 | ECharts 4.8 | ECharts 6.1 |
基于本项目二次开发的页面需按 Vue 3 迁移指南 与 Element Plus 迁移文档 适配。
✨ Vue 3 迁移
全量清理 Vue 2 写法,无残留:$set/$delete、$listeners、.sync、.native、beforeDestroy/destroyed、::v-deep、全局 filters、functional 组件、router-link 的 tag 属性。为 13 个组件补充 emits 声明,15 个组件改为 multi-word 命名。
⚡ 构建工具迁移至 Vite
| 指标 | webpack | Vite |
|---|---|---|
| 生产构建 | ~11 s | 7 s |
| dev server 启动 | 10–30 s | ~0.5 s |
require.context迁移为import.meta.glob(含动态路由索引)- SCSS 变量经
.module.scss转发供 JS 读取 - svg 雪碧图由
vite-plugin-svg-icons生成,symbolId规则不变 - gzip 压缩与 element-plus 分包策略与原 webpack 配置保持一致
🐛 重要缺陷修复
操作按钮权限控制失效:v-permisaction 与 v-permission 指令仍使用 Vue 2 的 inserted 钩子,而 Vue 3 已重命名为 mounted,导致指令完全不执行——无权限的操作按钮不会被隐藏(全项目 58 处使用)。后端 Casbin 校验始终有效,不构成越权,但前端权限展示失真。已按官方映射迁移全部指令钩子,并补充单元测试防止回归。
parseTime 运行时崩溃:函数在 const time_str 声明之前访问该变量,构成暂时性死区,导致全局方法 $parseTime 每次调用均抛出 ReferenceError。
代码生成页编辑器无法渲染:沿用 vue-codemirror 5 的小写 codemirror 导出,而依赖的 v6 仅导出 Codemirror,组件实际为 undefined。
ImageCropper 直接修改 prop:在 data() 中对 imgFormat 赋值,Vue 3 下无效且触发告警。
🔒 安全
Dependabot 告警由 88 条降至 26 条,其中运行时依赖仅剩 4 条(xlsx,官方无修复版本,且其唯一触发入口 XLSX.read 已随未注册的 Excel 导入页一并移除)。
- axios 1.16.1 → 1.19.0(修复 10 条告警)
- js-cookie → 3.0.8
- 移除零引用却引入 critical 漏洞的
jsonlint(underscore 1.6.0)与webpack-bundle-analyzer(ejs 2.7.4) .npmrc中已停止解析的npm.taobao.org更换为registry.npmmirror.com
🧹 工程化
- 单元测试从完全无法运行修复至 29 个全部通过:jest 配置的 transform 仍指向 Vue 2 的
vue-jest,且 jest 27 起默认环境由 jsdom 改为 node - 新增基于 Playwright 的 E2E 测试
- husky 升级至 9(4.x 在 pnpm 环境下会调用已废弃的
pnpx,导致任何贡献者都无法提交) - 移除 21 个未使用或失效的依赖,依赖总数由 81 降至 60
- CI 全部 action 固定至完整 commit SHA,Node 矩阵改为 22.x / 24.x
- Dockerfile 改用 pnpm,基础镜像切换为官方
node:24-alpine与nginx:stable-alpine
📖 升级说明
- Node 需 v22 以上,推荐 v24 LTS(v18、v20 均已 EOL)
- 改用 pnpm:
npm install -g pnpm && pnpm install - 自定义组件若使用
$listeners、.native、filters等特性需自行适配 - 自定义指令须将
bind/inserted/update/unbind更名为beforeMount/mounted/updated/unmounted,否则将静默失效 - 构建命令不变(
pnpm build:prod),底层已换为 Vite