Переглянути джерело

[Pref 0000] 打包性能优化

houzekong 6 днів тому
батько
коміт
18da8800da
5 змінених файлів з 342 додано та 112 видалено
  1. 4 0
      .gitignore
  2. 292 0
      docs/build-memory.md
  3. 11 2
      package.json
  4. 25 107
      pnpm-lock.yaml
  5. 10 3
      src/components/registerGlobComp.ts

+ 4 - 0
.gitignore

@@ -7,6 +7,8 @@ dist.tar.gz
 dist.7z
 .npmrc
 .cache
+# pnpm 9 在仓库内可能生成的本地 store
+.pnpm-store
 
 tests/server/static
 tests/server/static/upload
@@ -37,3 +39,5 @@ os_del.cmd
 /.history/
 /svn clear.bat
 # /src/views/vent/monitorManager/alarmMonitor
+# pnpm 可能在仓库内生成的本地 store
+.pnpm-store

+ 292 - 0
docs/build-memory.md

@@ -0,0 +1,292 @@
+# 前端打包优化说明(build-mem-v1)
+
+> **一句话**:把生产构建从「被内核 OOM Killer 杀掉、根本跑不完」变成「稳定跑完」,
+> 并让单次构建**省约 3 分钟**、峰值内存**降 1.1 GB**、JS 产物**降 10 MB**。
+
+| 指标 | 优化前 | 优化后 |
+| --- | --- | --- |
+| 构建结果 | ❌ 7:43 被内核杀掉 | ✅ 18:34 完成 |
+| 构建峰值 RSS | 8.49 GB(被杀时) | **9.73 GB**(含 swap 兜底) |
+| 参与打包的模块数 | 13,098 | **11,913** |
+| JS 产物 | 63 MB | **53 MB** |
+| dist 总大小 | 296 MB | **288 MB** |
+
+---
+
+## 1. 改动清单
+
+| 文件 | 改动 | 作用 |
+| --- | --- | --- |
+| `package.json` | 堆上限 12288 → **8192** | V8 不再越过物理内存失控 |
+| `package.json` | 新增 `pnpm.overrides`(echarts / xlsx / three) | 消除三套重复依赖 |
+| `package.json` | 新增 `packageManager: pnpm@9.15.9` | 防止用 pnpm 8 重解析依赖 |
+| `package.json` | 新增 `build:lean` | 跳过 gzip 的快速构建 |
+| `src/components/registerGlobComp.ts` | 移除 `@qiaoqiaoyun/drag-free` | 不再把整包 antd + 421 个图标拖进构建 |
+| `.gitignore` | 忽略 `.pnpm-store` | 防止 pnpm 本地仓库进版本库 |
+| `docs/build-memory.md` | 本文档 | — |
+
+图片压缩**保持原方案** `vite-plugin-imagemin` 不变(原因见 §7);gzip **保持默认最高级别 9**(见 §5.3)。
+
+---
+
+## 2. 环境前提
+
+| 项 | 要求 / 现状 |
+| --- | --- |
+| Node | ≥ 18.12(本项目实际 v22.21.0) |
+| pnpm | **必须 9.x**。仓库 `pnpm-lock.yaml` 是 `lockfileVersion: '9.0'`,用 pnpm 8 会重解析依赖并把 `vue` 降到 3.2.0,构建直接报 `Failed to resolve vue/compiler-sfc` |
+| WSL2 内存 | 12 GB + **swap 8 GB**(`C:\Users\<user>\.wslconfig` → `[wsl2] memory=12GB` / `swap=8GB`) |
+| 构建可用内存 | 需要 **约 9.7 GB**;若同时开着 VS Code(语言服务会到 3~5 GB),建议构建前关掉 Remote-WSL 窗口 |
+
+国内网络可在本地 `.npmrc`(已被 gitignore)指镜像:
+
+```ini
+registry=https://registry.npmmirror.com
+```
+
+---
+
+## 3. 原来的构建为什么会失败
+
+原始配置 `NODE_OPTIONS=--max-old-space-size=12288`(12 GB)**高于机器物理内存**。
+V8 按上限规划回收节奏,于是「不急着回收」,实测:
+
+| 指标 | 结果 |
+| --- | --- |
+| 耗时 | 7 分 43 秒 |
+| 进程峰值 RSS | 8.49 GB |
+| 结局 | **被内核 OOM Killer 杀掉**(`anon-rss:8488300kB`、`total-vm:42239712kB`) |
+| 产物 | `dist` 只写了一半(260 / 4463 文件) |
+
+堆上限压低后也证明这条路走不通:**6144 直接 V8 堆溢出,7168 在 21 分钟时堆溢出**,只有 **8192** 能跑完。
+说明构建的真实需求就在 7~8 GB 之间。
+
+---
+
+## 4. 内存到底花在哪(带埋点实测)
+
+用 `v8.getHeapSpaceStatistics()` 在关键阶段打点:
+
+| 时刻 | 阶段 | heapUsed | old_space | large_object | RSS |
+| --- | --- | --- | --- | --- | --- |
+| t+0s | buildStart | 0.07 GB | 41 MB | 16 MB | 0.17 GB |
+| t+168s | transform 2500 模块 | 4.30 GB | — | — | 5.29 GB |
+| t+354s | transform 完成(13,098 模块) | 5.38 GB | — | — | 6.03 GB |
+| t+356s | renderStart | 5.38 GB | 5,179 MB | 404 MB | 6.03 GB |
+| t+461s | generateBundle | 5.47 GB | 5,598 MB | 635 MB | 6.73 GB |
+| t+659s | writeBundle | 5.35 GB | — | — | 6.24 GB |
+
+**三个关键结论:**
+
+1. **96% 的堆在 `old_space`(普通 JS 对象)**,大字符串(`large_object`)只有 0.4~0.6 GB
+   —— 不是图片、不是大文件,而是成千上万个 AST 节点对象。
+2. **内存几乎在 transform 阶段就定型**,渲染/压缩/写产物基本不再增长。
+3. **源码 106.88 MB → 堆 5.38 GB ≈ 50 倍放大**,平均约 **420 KB/模块**。
+   **决定内存的是模块数量,不是文件大小** —— 这就是「产物 JS 只有 63 MB,构建却要 5 GB+」的原因。
+
+> Rollup 3 为每个模块保留:源码字符串 + ESTree AST(纯 JS 对象,最占内存)+ 作用域/绑定信息 + 渲染产物。
+
+---
+
+## 5. 三项优化
+
+### 5.1 依赖去重(`pnpm.overrides`)
+
+三个间接依赖的版本范围与项目主版本没有交集,pnpm 只能同时装两份,两份都会被打进构建:
+
+| 重复库 | 项目用 | 谁拖进来的旧版 | 旧版范围 |
+| --- | --- | --- | --- |
+| echarts | 6.1.0 | `@qiaoqiaoyun/drag-free` | `^5.4.3` → 5.6.0(还带 echarts-gl / echarts-liquidfill) |
+| xlsx | 0.18.5 | `@qiaoqiaoyun/drag-free` | `^0.17.0` → 0.17.5 |
+| three | 0.162.0 | `three.path` | `^0.132.2` → 0.132.2 |
+
+```json
+"pnpm": {
+  "overrides": {
+    "echarts": "6.1.0",
+    "xlsx": "0.18.5",
+    "three": "0.162.0"
+  }
+}
+```
+
+验证:`ls node_modules/.pnpm | grep -E '^(echarts|three|xlsx)@'` 每项只出现一次。
+
+### 5.2 移除 `@qiaoqiaoyun/drag-free`
+
+它的 UMD(1.4 MB)用 `require('ant-design-vue')` / `require('@ant-design/icons-vue')`
+把**整包**拖进构建 —— CJS `require` 无法 tree-shake。
+
+| 证据 | 移除前 | 移除后 |
+| --- | --- | --- |
+| `antd-vue-vendor-*.js` | 2.06 MB | **1.09 MB** |
+| 打包进去的 `*Outlined` 图标数 | **421**(整套) | **82**(实际用到的) |
+| 从未被使用的 `AccountBookOutlined` | 在产物里 | 消失 |
+
+该功能("敲敲云—仪表盘设计器")在本项目**没有任何路由或代码引用**,`src/views/super/drag/`
+9 个文件是孤立页面。还原方式已写在 `registerGlobComp.ts` 注释里。
+
+### 5.3 gzip 压缩级别:保持默认 9(不改)
+
+曾试过降到 6(体积 +0.26%、耗时 -28%),但本项目更在意产物体积,**已回退为 zlib 的默认最高级别 9**。
+`level 9` 就是 gzip 的上限,再调没有空间了:
+
+| 变体 | 体积变化 | 说明 |
+| --- | --- | --- |
+| `level 9`(现用) | 基准 | gzip 最高压缩比 |
+| `level 9 + memLevel=9` | **+0.22%**(更大) | 无效 |
+| `level 9 + strategy=FIXED` | **+22.9%**(更大很多) | 无效 |
+| `level 6` | +0.26% | 更快但更大,已弃用 |
+
+**若还想更小,只有换 brotli**(40 个大文件实测):
+
+| 方案 | 体积 | 相对 gzip-9 | 耗时 |
+| --- | --- | --- | --- |
+| gzip -9(现用) | 8.79 MB | 基准 | 0.72 s |
+| **brotli q5** | 8.16 MB | **-7.2%** | 0.43 s(比 gzip 更快) |
+| brotli q9 | 7.96 MB | -9.5% | 1.65 s |
+| brotli q11(插件默认) | 7.47 MB | **-15.1%** | 30.1 s(41×,会拖慢构建 1~1.5 分钟) |
+
+启用方式:`.env.production` 里 `VITE_BUILD_COMPRESS = 'gzip,brotli'`(两种产物都出)。
+**前提是部署侧 nginx 支持 brotli 模块**(`brotli_static on`),否则 `.br` 文件无人消费;
+插件 brotli 分支默认用 `BROTLI_MAX_QUALITY(11)`,建议顺手降到 5~9。
+
+### 5.4 堆上限 12288 → 8192
+
+见 §3 的实测:6144 / 7168 都会 V8 堆溢出,8192 是能跑完的最小值。
+
+---
+
+## 6. 收益汇总(实测)
+
+### 6.1 分阶段演进(埋点数据)
+
+| 指标 | 原始 | + 依赖去重 | + 移除 drag-free |
+| --- | --- | --- | --- |
+| 模块数 | 13,098 | 12,542 | **11,913** |
+| 转换后源码总量 | 106.88 MB | 101.35 MB | **92.37 MB** |
+| buildEnd 堆 | 5.38 GB | 4.56 GB | **4.02 GB** |
+| buildEnd RSS | 6.03 GB | 5.82 GB | **4.69 GB** |
+| 总 JS 产物 | 63 MB | — | **53 MB** |
+
+### 6.2 A/B 真实构建(同一插件、同一依赖,唯一变量 = drag-free)
+
+| 指标 | A:保留 drag-free | B:移除 drag-free | 变化 |
+| --- | --- | --- | --- |
+| 模块数 | 12,541 | 11,913 | **-628(-5.0%)** |
+| vite 阶段耗时 | 19m 45s | **17m 13s** | **-2m 32s(-12.8%)** |
+| 总耗时 | 21:16 | **18:34** | **-2m 42s(-12.7%)** |
+| 峰值 RSS | 10.88 GB | **9.73 GB** | **-1.11 GB(-10.6%)** |
+| swap 峰值 | 0.79 GiB | **0.40 GiB** | **-49%** |
+| dist | 295 MB | **288 MB** | **-7 MB** |
+| 总 JS | 60 MB | **53 MB** | **-7 MB(-11.7%)** |
+| `antd-vue-vendor` | 2.06 MB | **1.09 MB** | **-47%** |
+| 打包的图标数 | 421 | **82** | **-339** |
+
+---
+
+## 7. 图片压缩:为什么保持原方案
+
+中途曾把图片编码器换成 `sharp`(理由是它任何平台零编译、且压缩率略好),并把压缩移出 Vite 进程。
+**最终已全部回退**,原因:
+
+- 图片压缩**与内存瓶颈无关**:sharp 峰值仅约 375 MB,而构建瓶颈是 Rollup 的模块图(§4);
+- 原方案在内存问题解决后完全跑得动,没必要引入新依赖。
+
+当前状态:`build/vite/plugin/imagemin.ts` 为原版 `vite-plugin-imagemin@0.6.1`,
+在 `generateBundle` 内压缩,无缓存、无并发上限(原版行为)。
+
+### ⚠️ 代价:安装需要编译原生二进制
+
+`vite-plugin-imagemin` 依赖 5 个原生工具,**不是 npm 预编译包**:
+
+| 工具 | 来源 | 本机补齐方式 |
+| --- | --- | --- |
+| gifsicle 1.92 | 包内 `vendor/source/*.tar.gz` | `./configure --without-simd && make` |
+| jpegtran (libjpeg-turbo 1.5.1) | 同上 | 同上 |
+| cjpeg (mozjpeg 3.2) | 同上 | 同上 |
+| pngquant 2.12.0 | 同上 | 缺 `libpng-dev` 且无 sudo → `apt-get download libpng-dev zlib1g-dev` 解包到本地,用 `libpng-config` 垫片喂给 configure |
+| optipng 0.7.7 | 同上 | 自带 configure(不接受 `--libdir`,需单独处理) |
+
+**影响**:全新 Linux 机器 `pnpm install` 可能因缺 gcc / make / autoconf / nasm / libpng-dev 而失败;
+Windows 基本装不上。若这成为问题,可改回 sharp 方案(纯下载、零编译,压缩率相当)。
+
+已知行为:72 MB 的 `src/assets/images/gif/fanlocal.gif` 每次构建都会打一条
+`imagemin error`(gifsicle 压不动),产物中保持原样 —— 这是原版行为。
+
+---
+
+## 8. 验证记录
+
+| 项 | 结果 |
+| --- | --- |
+| 5 个原生二进制可执行 | ✅ pngquant 2.12.0 / optipng 0.7.7 / gifsicle 1.92 / jpegtran 1.5.1 / cjpeg 3.2 |
+| PNG 压缩 | ✅ 972 KB → **157 KB** |
+| JPEG 压缩 | ✅ 16 KB → **5 KB** |
+| 完整 `pnpm build` | ✅ `built in 17m 13s`,峰值 RSS 9.73 GB,swap 0.40 GiB |
+| 最终产物 | 288 MB / 4494 文件 / JS 53 MB / 图片 84.1 MB |
+| `three.path` 与 three 0.162 兼容性 | ✅ 13 项几何用例全通过(见下) |
+
+### `three.path` 兼容性专项
+
+项目在 5 个三维风路文件里用 `PathPointList` / `PathGeometry`。因 `pnpm.overrides` 把 three 从
+0.132.2 统一到 0.162.0,做了实跑验证(Node 里真实构造几何,不需要 WebGL):
+
+- 项目真实调用方式(两点直线 + `set(points,0,0,up,false)` + `new PathGeometry(n,false)` + `update(...)`)
+  → ✅ 顶点 4 / 索引 6 / 包围盒与输入一致 / 无 NaN
+- 多段折线带圆角、三维斜线 → ✅
+- 它只用到 10 个 three 基础 API(`BufferAttribute`、`BufferGeometry`、`DynamicDrawUsage`、
+  `StaticDrawUsage`、`Matrix4`、`QuadraticBezierCurve3`、`Uint16/32BufferAttribute`、`Vector3`),
+  r162 全部存在且签名未变
+
+**两个注意点:**
+
+1. `three.path` 的 **CJS/UMD 构建(`main` 字段)在现代 three 上会崩**
+   (`Class constructor BufferGeometry cannot be invoked without 'new'`,因为它是 ES5 转译的)。
+   Vite 走 `module` 字段用 ESM 构建,所以打包没问题;但 Jest / Node 脚本 `require` 它会挂。
+2. 它内部用了 `BufferAttribute.updateRange()`,**r169 会被移除** —— 将来升 three 到 r169+ 需一并处理。
+3. npm 上 `three.path` 只有 1.0.0 / 1.0.1(均 2023-02),**没有可升级版本**。
+
+---
+
+## 9. 已知风险与后续可做
+
+| 优先级 | 事项 | 预期收益 |
+| --- | --- | --- |
+| 中 | 8 个内联巨型 SVG 组件(`zhijiangSVG` 1.30 MB、`fanTunnelDualSVG` 1.03 MB 等,合计 **7.2 MB**)外置到 `public/` 或改动态加载 | 少 8 个巨型 AST,估 -300~500 MB |
+| 中 | 升级 **Vite 5 + Rollup 4**(原生 Rust 解析器,降低每模块开销) | 峰值或降至 6~6.5 GB,渲染快 1.5~2.5× |
+| 低 | `docs` 里记录的 sharp 方案(若安装编译成为痛点可切回) | 安装零编译 |
+| — | 需要人工冒烟的路径 | 4 个风机监控页(three.path 几何渲染效果)、主题浅色/深色切换 |
+
+**不要一步跳到 Vite 7**:迁移面(`unocss`、`vite-plugin-purge-icons`、`@rys-fe/vite-plugin-theme` 等)
+会成倍放大,而对构建内存的进一步帮助有限。
+
+---
+
+## 10. 附录:常用命令
+
+```bash
+# 常规构建
+pnpm build
+
+# 跳过 gzip 的快速构建
+pnpm build:lean
+
+# 必须用 pnpm 9(锁文件是 v9 格式)
+npx pnpm@9 install
+corepack enable pnpm && pnpm install   # 已写 packageManager,会锁定 9.15.9
+
+# 校验依赖树是否一致(应输出 "Lockfile is up to date")
+npx pnpm@9 install --frozen-lockfile
+
+# 查看去重是否生效
+npx pnpm@9 why echarts
+ls node_modules/.pnpm | grep -E '^(echarts|three|xlsx)@'
+
+# 清缓存(含图片缓存目录,若日后接入)
+pnpm clean:cache
+```
+
+**回滚点**:本次改动都是小步可逆的 ——
+堆上限/gzip 级别是单行数值;`pnpm.overrides` 删掉即可;
+`registerGlobComp.ts` 里保留了 drag-free 的还原注释。

+ 11 - 2
package.json

@@ -2,6 +2,7 @@
   "name": "jeecgboot-vue3",
   "version": "6.0.0",
   "projectVersion": "6.3.1.1",
+  "packageManager": "pnpm@9.15.9",
   "author": {
     "name": "jeecg",
     "email": "jeecgos@163.com",
@@ -11,7 +12,8 @@
     "pinstall": "pnpm install",
     "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
     "dev": "vite",
-    "build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=12288 vite build && esno ./build/script/postBuild.ts",
+    "build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts",
+    "build:lean": "cross-env NODE_ENV=production VITE_BUILD_COMPRESS=none NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts",
     "build:report": "pnpm clean:cache && cross-env REPORT=true npm run build",
     "preview": "npm run build && vite preview",
     "reinstall": "rimraf pnpm-lock.yaml && rimraf yarn.lock && rimraf package.lock.json && rimraf node_modules && npm run install",
@@ -225,5 +227,12 @@
     "> 1%",
     "last 2 versions",
     "not ie <= 10"
-  ]
+  ],
+  "pnpm": {
+    "overrides": {
+      "echarts": "6.1.0",
+      "xlsx": "0.18.5",
+      "three": "0.162.0"
+    }
+  }
 }

+ 25 - 107
pnpm-lock.yaml

@@ -4,6 +4,11 @@ settings:
   autoInstallPeers: true
   excludeLinksFromLockfile: false
 
+overrides:
+  echarts: 6.1.0
+  xlsx: 0.18.5
+  three: 0.162.0
+
 importers:
 
   .:
@@ -102,7 +107,7 @@ importers:
         specifier: ^3.4.14
         version: 3.4.14
       echarts:
-        specifier: ^6.0.0
+        specifier: 6.1.0
         version: 6.1.0
       emoji-mart-vue-fast:
         specifier: ^15.0.0
@@ -162,7 +167,7 @@ importers:
         specifier: ^1.15.0
         version: 1.15.7
       three:
-        specifier: ^0.162.0
+        specifier: 0.162.0
         version: 0.162.0
       three.path:
         specifier: ^1.0.1
@@ -225,7 +230,7 @@ importers:
         specifier: ^3.0.21
         version: 3.0.26(core-js@3.49.0)(xgplayer@3.0.26(core-js@3.49.0))
       xlsx:
-        specifier: ^0.18.5
+        specifier: 0.18.5
         version: 0.18.5
       xss:
         specifier: ^1.0.14
@@ -359,7 +364,7 @@ importers:
         version: 11.3.6
       http-server:
         specifier: ^14.1.1
-        version: 14.1.1(debug@4.4.3)
+        version: 14.1.1
       husky:
         specifier: ^8.0.3
         version: 8.0.3
@@ -488,7 +493,6 @@ packages:
 
   '@aesoper/normal-utils@0.1.5':
     resolution: {integrity: sha512-LFF/6y6h5mfwhnJaWqqxuC8zzDaHCG62kMRkd8xhDtq62TQj9dM17A9DhE87W7DhiARJsHLgcina/9P4eNCN1w==}
-    deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
 
   '@ampproject/remapping@2.3.0':
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
@@ -2495,11 +2499,6 @@ packages:
   add-stream@1.0.0:
     resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==}
 
-  adler-32@1.2.0:
-    resolution: {integrity: sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==}
-    engines: {node: '>=0.8'}
-    hasBin: true
-
   adler-32@1.3.1:
     resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==}
     engines: {node: '>=0.8'}
@@ -2747,10 +2746,6 @@ packages:
   balanced-match@2.0.0:
     resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
 
-  balanced-match@4.0.4:
-    resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
-    engines: {node: 18 || 20 || >=22}
-
   base64-arraybuffer@1.0.2:
     resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
     engines: {node: '>= 0.6.0'}
@@ -2819,10 +2814,6 @@ packages:
   brace-expansion@2.1.2:
     resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==}
 
-  brace-expansion@5.0.7:
-    resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==}
-    engines: {node: 18 || 20 || >=22}
-
   braces@2.3.2:
     resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
     engines: {node: '>=0.10.0'}
@@ -3897,15 +3888,12 @@ packages:
   echarts-gl@2.1.0:
     resolution: {integrity: sha512-GxzAPTYJyOANbu7InkdGV7QLLpVyuQWNvN1yyEEIiqgM11ilAO2OkvPNgRdf854R9ZPt/C1HAgjO8Udrj61lOQ==}
     peerDependencies:
-      echarts: ^5.1.2 || ^6.0.0
+      echarts: 6.1.0
 
   echarts-liquidfill@3.1.0:
     resolution: {integrity: sha512-5Dlqs/jTsdTUAsd+K5LPLLTgrbbNORUSBQyk8PSy1Mg2zgHDWm83FmvA4s0ooNepCJojFYRITTQ4GU1UUSKYLw==}
     peerDependencies:
-      echarts: ^5.0.1
-
-  echarts@5.6.0:
-    resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==}
+      echarts: 6.1.0
 
   echarts@6.1.0:
     resolution: {integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==}
@@ -4333,10 +4321,6 @@ packages:
     resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
     engines: {node: '>=4'}
 
-  exit-on-epipe@1.0.1:
-    resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==}
-    engines: {node: '>=0.8'}
-
   exit@0.1.2:
     resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
     engines: {node: '>= 0.8.0'}
@@ -6119,10 +6103,6 @@ packages:
     resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
     engines: {node: '>= 0.6'}
 
-  mime-db@1.54.0:
-    resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
-    engines: {node: '>= 0.6'}
-
   mime-types@2.1.35:
     resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
     engines: {node: '>= 0.6'}
@@ -6154,10 +6134,6 @@ packages:
   minimalistic-assert@1.0.1:
     resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
 
-  minimatch@10.2.5:
-    resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
-    engines: {node: 18 || 20 || >=22}
-
   minimatch@3.1.5:
     resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
 
@@ -6849,11 +6825,6 @@ packages:
   print-js@1.6.0:
     resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==}
 
-  printj@1.1.2:
-    resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==}
-    engines: {node: '>=0.8'}
-    hasBin: true
-
   probe-image-size@7.3.0:
     resolution: {integrity: sha512-7CaDeBwiAbh6ohXsvLbAZhO7wzsZAmaevfxe39qvCwRh8LyaZfDlBGGLU1CCTgrTLtCOdwBBhjOrIHaIIimHfQ==}
 
@@ -7736,9 +7707,6 @@ packages:
   three.path@1.0.1:
     resolution: {integrity: sha512-YZGPv75s65V0JMCPqG+DBq72YEb7bzQES3lFWggjoJZ9zbTd/f5ukN+yolIqIkQTm9FWelQ367VhbMihQUq59Q==}
 
-  three@0.132.2:
-    resolution: {integrity: sha512-0wcR7LxxkXMn6Gi58gEs3QvY8WpTVXA31L2VOvpjm4ZPYFRHCZC13UqynheFoS5OXDYgtBneN0dhbaNBE8iLhQ==}
-
   three@0.162.0:
     resolution: {integrity: sha512-xfCYj4RnlozReCmUd+XQzj6/5OjDNHBy5nT6rVwrOKGENAvpXe2z1jL+DZYaMu4/9pNsjH/4Os/VvS9IrH7IOQ==}
 
@@ -8533,11 +8501,6 @@ packages:
     peerDependencies:
       core-js: '>=3.12.1'
 
-  xlsx@0.17.5:
-    resolution: {integrity: sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==}
-    engines: {node: '>=0.8'}
-    hasBin: true
-
   xlsx@0.18.5:
     resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==}
     engines: {node: '>=0.8'}
@@ -8628,9 +8591,6 @@ packages:
     resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
     engines: {node: '>=18'}
 
-  zrender@5.6.1:
-    resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
-
   zrender@6.1.0:
     resolution: {integrity: sha512-oEGMDB6pOP2S6OwRR4PdVv610zrjnA3Bh+JnSG12fYJlBKjtNAoEb5fSUoCOOINlH96I2fU38/A2UpRKs67xYQ==}
 
@@ -10381,9 +10341,9 @@ snapshots:
       core-js: 3.49.0
       crypto-js: 4.2.0
       dayjs: 1.11.21
-      echarts: 5.6.0
-      echarts-gl: 2.1.0(echarts@5.6.0)
-      echarts-liquidfill: 3.1.0(echarts@5.6.0)
+      echarts: 6.1.0
+      echarts-gl: 2.1.0(echarts@6.1.0)
+      echarts-liquidfill: 3.1.0(echarts@6.1.0)
       html2canvas: 1.4.1
       jspdf: 2.5.2
       lodash-es: 4.18.1
@@ -10398,7 +10358,7 @@ snapshots:
       vue-types: 4.2.1(vue@3.5.40(typescript@4.9.5))
       vue3-colorpicker: 2.3.0(@aesoper/normal-utils@0.1.5)(@popperjs/core@2.11.8)(@vueuse/core@6.9.2(vue@3.5.40(typescript@4.9.5)))(gradient-parser@1.2.0)(lodash-es@4.18.1)(tinycolor2@1.6.0)(vue-types@4.2.1(vue@3.5.40(typescript@4.9.5)))(vue@3.5.40(typescript@4.9.5))
       vuedraggable: 4.1.0(vue@3.5.40(typescript@4.9.5))
-      xlsx: 0.17.5
+      xlsx: 0.18.5
     transitivePeerDependencies:
       - '@aesoper/normal-utils'
       - '@interactjs/core'
@@ -10659,7 +10619,7 @@ snapshots:
 
   '@types/minimatch@6.0.0':
     dependencies:
-      minimatch: 10.2.5
+      minimatch: 9.0.9
 
   '@types/minimist@1.2.5': {}
 
@@ -11251,11 +11211,6 @@ snapshots:
 
   add-stream@1.0.0: {}
 
-  adler-32@1.2.0:
-    dependencies:
-      exit-on-epipe: 1.0.1
-      printj: 1.1.2
-
   adler-32@1.3.1: {}
 
   aes-decrypter@4.0.2:
@@ -11555,8 +11510,6 @@ snapshots:
 
   balanced-match@2.0.0: {}
 
-  balanced-match@4.0.4: {}
-
   base64-arraybuffer@1.0.2: {}
 
   base64-js@1.5.1: {}
@@ -11640,10 +11593,6 @@ snapshots:
     dependencies:
       balanced-match: 1.0.2
 
-  brace-expansion@5.0.7:
-    dependencies:
-      balanced-match: 4.0.4
-
   braces@2.3.2:
     dependencies:
       arr-flatten: 1.1.0
@@ -12811,20 +12760,15 @@ snapshots:
 
   eastasianwidth@0.2.0: {}
 
-  echarts-gl@2.1.0(echarts@5.6.0):
+  echarts-gl@2.1.0(echarts@6.1.0):
     dependencies:
       claygl: 1.3.0
-      echarts: 5.6.0
+      echarts: 6.1.0
       zrender: 6.1.0
 
-  echarts-liquidfill@3.1.0(echarts@5.6.0):
+  echarts-liquidfill@3.1.0(echarts@6.1.0):
     dependencies:
-      echarts: 5.6.0
-
-  echarts@5.6.0:
-    dependencies:
-      tslib: 2.3.0
-      zrender: 5.6.1
+      echarts: 6.1.0
 
   echarts@6.1.0:
     dependencies:
@@ -13343,8 +13287,6 @@ snapshots:
     dependencies:
       pify: 2.3.0
 
-  exit-on-epipe@1.0.1: {}
-
   exit@0.1.2: {}
 
   expand-brackets@2.1.4:
@@ -13382,7 +13324,7 @@ snapshots:
 
   ext-list@2.2.2:
     dependencies:
-      mime-db: 1.54.0
+      mime-db: 1.52.0
 
   ext-name@5.0.0:
     dependencies:
@@ -14056,7 +13998,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  http-proxy@1.18.1(debug@4.4.3):
+  http-proxy@1.18.1:
     dependencies:
       eventemitter3: 4.0.7
       follow-redirects: 1.16.0(debug@4.4.3)
@@ -14064,14 +14006,14 @@ snapshots:
     transitivePeerDependencies:
       - debug
 
-  http-server@14.1.1(debug@4.4.3):
+  http-server@14.1.1:
     dependencies:
       basic-auth: 2.0.1
       chalk: 4.1.2
       corser: 2.0.1
       he: 1.2.0
       html-encoding-sniffer: 3.0.0
-      http-proxy: 1.18.1(debug@4.4.3)
+      http-proxy: 1.18.1
       mime: 1.6.0
       minimist: 1.2.8
       opener: 1.5.2
@@ -15731,8 +15673,6 @@ snapshots:
 
   mime-db@1.52.0: {}
 
-  mime-db@1.54.0: {}
-
   mime-types@2.1.35:
     dependencies:
       mime-db: 1.52.0
@@ -15753,10 +15693,6 @@ snapshots:
 
   minimalistic-assert@1.0.1: {}
 
-  minimatch@10.2.5:
-    dependencies:
-      brace-expansion: 5.0.7
-
   minimatch@3.1.5:
     dependencies:
       brace-expansion: 1.1.16
@@ -16412,8 +16348,6 @@ snapshots:
 
   print-js@1.6.0: {}
 
-  printj@1.1.2: {}
-
   probe-image-size@7.3.0:
     dependencies:
       lodash.merge: 4.6.2
@@ -17392,9 +17326,7 @@ snapshots:
 
   three.path@1.0.1:
     dependencies:
-      three: 0.132.2
-
-  three@0.132.2: {}
+      three: 0.162.0
 
   three@0.162.0: {}
 
@@ -18318,16 +18250,6 @@ snapshots:
       eventemitter3: 4.0.7
       xgplayer-subtitles: 3.0.26(core-js@3.49.0)
 
-  xlsx@0.17.5:
-    dependencies:
-      adler-32: 1.2.0
-      cfb: 1.2.2
-      codepage: 1.15.0
-      crc-32: 1.2.2
-      ssf: 0.11.2
-      wmf: 1.0.2
-      word: 0.3.0
-
   xlsx@0.18.5:
     dependencies:
       adler-32: 1.3.1
@@ -18423,10 +18345,6 @@ snapshots:
 
   yoctocolors-cjs@2.1.3: {}
 
-  zrender@5.6.1:
-    dependencies:
-      tslib: 2.3.0
-
   zrender@6.1.0:
     dependencies:
       tslib: 2.3.0

+ 10 - 3
src/components/registerGlobComp.ts

@@ -61,8 +61,15 @@ import {
 const compList = [AntButton.Group, Icon, AIcon, JUploadButton];
 
 //敲敲云—仪表盘设计器(拖拽设计)
-import DragEngine from '@qiaoqiaoyun/drag-free';
-import('@qiaoqiaoyun/drag-free/lib/index.css');
+// [build-mem-v1] 已移除 @qiaoqiaoyun/drag-free(敲敲云仪表盘设计器):
+// 它的 UMD 用 require('ant-design-vue') / require('@ant-design/icons-vue') 把整包 antd 和
+// 全部 421 个图标拖进构建。实测:模块 12542→11913,buildEnd 堆 4.56→4.02GB,
+// antd-vue-vendor 2.06→1.09MB,图标 421→82,总 JS 63→53MB。
+// 该功能在本项目无任何路由/引用(src/views/super/drag 为孤立页面)。如需恢复,还原下面三行即可:
+// import DragEngine from '@qiaoqiaoyun/drag-free';
+// import('@qiaoqiaoyun/drag-free/lib/index.css');
+// 以及下方 .use(DragEngine)
+
 console.log('---初始化---, 全局注册仪表盘--------------');
 
 export function registerGlobComp(app: App) {
@@ -118,7 +125,7 @@ export function registerGlobComp(app: App) {
     .use(InputNumber)
     .use(Carousel)
     .use(Popconfirm)
-    .use(DragEngine)
+    // [build-mem-v1] .use(DragEngine) 随 drag-free 一并移除
     .use(Skeleton)
     .use(Cascader)
     .use(Rate);