项目:html5-dataviz | 版本:v1.2 | 生成日期:2026-10-06 | 依据:源码分析
本章逐个解析 package.json 的全部依赖:59 项运行时依赖(dependencies)与 27 项开发依赖(devDependencies)。版本列给出"声明区间 / 实装版本"(实装版本来自 node_modules/*/package.json 与 pnpm-lock 的当前解析结果)。与《00-项目总览》第 3 节"技术栈速览"的分工:那里只回答"用了什么",本章回答"每一项装进来干什么、用在哪、为什么是它而不是别的、升级时怕什么"。
先给总体画像。这个依赖树有三个鲜明特征。特征一:重量级运行时占绝对多数——59 项运行时依赖中约 25 项是 three 生态,echarts/three/@antv/g2plot 四个可视化运行时合计决定了一半以上的构建产物体积,依赖管理的实质是"可视化运行时舰队管理"。特征二:依赖面由三次批量迁移塑造——2026-10-04 的 three 迁入一次性引入 @takram 四件套、@three.ez、@needle-tools、gaussian-splats、@theatre、cannon-es、web-ifc 等 20 余项(git 提交 1859290 的 commit message 逐项留痕),2026-10-06 的 webgl 迁入则几乎零新增(ogl 渲染栈以源码形态内嵌在 src/chart-examples/webgl/jsm-compat/,不占 npm 依赖位)——两种截然不同的接入策略是"迁移源代码可改性"决定的:three 示例大量使用官方 jsm 附加模块必须真装包,webgl 教学代码自包含直接搬目录。特征三:依赖几乎全部"按需 chunk 化"——除 vue/vue-router/pinia/@vueuse/element-plus 进首屏 vendor 桶外,其余运行时依赖都被动态 import 或懒加载组件消费,一个依赖是否拖累首屏,取决于《17》与《10-性能设计与优化》第 2 节描述的 vendor 五桶规则而非依赖本身。
口径说明:00-15 篇定稿后源码新增了第四库 webgl(325 条),本章"使用位置"均按当前源码核实,涉及案例总数处已同步更新,⚠️ 待确认 00 篇统计表是否回刷。
| 依赖 | 版本(声明/实装) | 用途 | 使用位置 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|
| vue | ^3.5.0 / 3.5.43 | 全站 UI 框架,SFC + script setup | 全站 | —(基础选型) | 中:影响 vue-echarts/compiler-sfc 同版本约束 |
| vue-router | ^4.3.0 / 4.6.4 | history 路由、路由表独立成文件 | src/router/ | hash 路由(内网无 fallback 时) | 低:API 稳定 |
| pinia | ^2.1.0 / 2.3.1 | 唯一 store(reportStore) | src/stores/reportStore.ts | composable 化(仅 1 store 时可行) | 低 |
| @vueuse/core | ^14.3.0 / 14.4.0 | useStorage/watchDebounced/usePreferredColorScheme 等 | src/composables/useTheme.ts、ChartLibraryPage | 手写 composable | 低:按函数 tree-shake |
| element-plus | ^2.14.0 / 2.14.7 | el-pagination/el-breadcrumb/ElMessage(按需) | 列表分页、详情面包屑 | 纯自研组件族 | 中:样式按需引入坑(见《14-配置与环境详解》第 5 节) |
| dayjs | ^1.11.23 / 1.11.23 | 大屏时间戳/时钟显示 | 大屏组件族 | 原生 Date | 低 |
| lodash-es | ^4.17.21 / 4.18.1 | ioftv 大屏工具函数(throttle 等) | src/views/bigscreen/ioftv-screen/** | 手写等价函数 | 低 |
| 依赖 | 版本(声明/实装) | 用途 | 使用位置 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|
| echarts | ^6.1.0 / 6.1.0 | 主力图表库,EChartDemo 静态 import + 兜底求值 + 大屏 v-chart | src/chart-examples/EChartDemo.vue、src/components/chart-examples/ChartExampleRenderer.vue、src/composables/useMapGeoJson.ts | 见 2.1 节 | 高:大版本升级改 painter 注册与 GL 兼容面 |
| vue-echarts | ^8.0.1 / 8.3.1 | <v-chart> 组件封装(manual-update/autoresize) | src/utils/v-chart.ts、EChartDemo | 直接裸用 echarts.init | 中:与 echarts 大版本联动 |
| echarts-gl | ^2.1.0 / 2.1.0 | GL 系列(globe/bar3D/lines3D 等) | 兜底链 requiresGl 预载、SFC 内 import、src/utils/sfc-modules.ts 白名单 | 无(echarts 官方唯一 GL 扩展) | 高:已多年低维护,echarts 6 兼容需实测 |
| @antv/g2plot | ^2.4.35 / 2.4.35 | AntV 示例运行时(本地 SFC 自驱 + 兜底实例化) | src/chart-examples/antv/**、renderAntvConfig、沙箱白名单 | @antv/g2(新一代语法,迁移成本大) | 中:官方重心已转 G2,G2Plot 处维护态 |
| @antv/util | ^3.3.11 / 3.3.11 | antv 示例内部工具函数(venn/_cases 等引用) | src/chart-examples/antv/venn/** 等 | 内联所需函数 | 低 |
| three | ^0.186.1 / 0.186.1 | 三维运行时(989 条示例) | src/chart-examples/three/**、ExampleScene 壳 | 见 2.3 节 | 高:月度发布节奏,破坏性变更频繁 |
| @vue/compiler-sfc | ^3.5.43 / 3.5.43 | 浏览器端 SFC 编译(注意:运行时依赖) | src/utils/sfcRuntime.ts 懒加载 | 预编译产物(架构级变更) | 中:须与 vue 主包严格同版本 |
| 依赖 | 版本(声明/实装) | 用途 | 使用位置(代表) | 升级风险 |
|---|---|---|---|---|
| postprocessing | ^6.39.5 / 6.39.5 | 三维后处理管线 | three 示例后期处理类 | 中 |
| three-mesh-bvh | ^0.9.15 / 0.9.15 | BVH 加速(射线拾取/布尔运算底座) | csg/batch 类示例 | 中 |
| three-bvh-csg | ^0.0.18 / 0.0.18 | CSG 布尔几何 | webgl_geometry_csg.vue | 中 |
| three-gpu-pathtracer | ^0.0.26 / 0.0.26 | GPU 路径追踪 | webgl_renderer_pathtracer.vue | 高:实验性 |
| three-good-godrays | ^0.12.1 / 0.12.1 | 体积光 | webgl_postprocessing_godrays.vue | 低 |
| three-subdivide | ^1.1.5 / 1.1.5 | 曲面细分 | webgl_modifier_subdivision.vue | 低 |
| three-tile | ^0.12.2 / 0.12.2 | 地图瓦片流式加载 | tilesMap.vue | 中 |
| three-html-render | ^0.1.2 / 0.1.2 | HTML 纹理渲染 | webgpu_materials_texture_html.vue | 低 |
| meshline | ^3.3.1 / 3.3.1 | 线宽线条(大屏 3D 电力线) | src/views/bigscreen/sc-datav-demo2/ | 低 |
| @takram/three-atmosphere | ^0.19.1 / 0.19.1 | 大气散射 | webgl_loader_3dtiles.vue | 中 |
| @takram/three-clouds | ^0.7.6 / 0.7.6 | 体积云 | atmosphere 配套 | 中 |
| @takram/three-geospatial | ^0.9.1 / 0.9.1 | 地理空间基础库 | 同上 | 中 |
| @takram/three-geospatial-effects | ^0.6.4 / 0.6.4 | 地理空间效果集 | 同上 | 中 |
| @theatre/core + @theatre/studio | ^0.7.2 / 0.7.2 | 动画编排(studio 仅调试用) | Theatrejs.vue(875KB 独立 chunk) | 中 |
| @mkkellogg/gaussian-splats-3d | ^0.4.7 / 0.4.7 | 高斯泼溅渲染 | gaussianSplats3D.vue | 高:快速演进 |
| @needle-tools/gltf-progressive | 4.0.0-alpha.4 | glTF 渐进加载 | webgl_loader_gltf_progressive_lod.vue | 高:alpha 版 |
| @needle-tools/three-animation-pointer | ^1.1.2 / 1.1.2 | glTF 动画指针 | webgl_loader_gltf_animation_pointer.vue | 中 |
| @three.ez/batched-mesh-extensions | ^0.0.12 / 0.0.12 | 批量渲染/LOD | webgl_batch_lod_bvh.vue | 中 |
| @three.ez/simplify-geometry | ^0.0.1 / 0.0.1 | 网格简化 | 同上 | 低 |
| @sparkjsdev/spark | ^2.3.1 / 2.3.1 | 粒子引擎(2.5MB 独立 chunk) | sparkjs.vue | 中 |
| @perplexdotgg/bounce | ^1.10.0 / 1.10.0 | 物理弹跳 | webgpu_postprocessing_ssgi_ballpool.vue | 低 |
| @tweenjs/tween.js | ^25.0.0 / 25.0.0 | 补间动画 | three/three-project/city-realtime/effect/city.ts | 低 |
| gsap | ^3.15.0 / 3.15.0 | 高性能补间 | three-cesium-examples 相机/模型动画 | 低 |
| animejs | ^4.5.0 / 4.5.0 | 动画序列 | inspectionView.vue、animejsBasic.vue | 中:v4 API 重组 |
| cannon-es | ^0.20.0 / 0.20.0 | 物理引擎 | physicsMesh.vue | 低:已停维护(⚠️ 待确认长期替代) |
| 3d-tiles-renderer | ^0.5.3 / 0.5.3 | 3D Tiles 加载 | loadTiles.vue、webgl_loader_3dtiles.vue | 中 |
| 依赖 | 版本(声明/实装) | 用途 | 使用位置 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|
| opentype.js | 1.3.4(锁定) | TTF 字体解析——TTFLoader 的 CDN import 被 alias 指到 npm 包 | webgl_loader_ttf.vue 间接消费 | 无(锁定版本防 alias 失配) | 高:alias 锚定 dist 文件路径,升级必断 |
| mp4box | ^2.4.1 / 实装按 lock | MP4 demux——demuxer_mp4 的 CDN import 重映射目标 | three demuxer 示例间接消费 | 同上 | 高:同上 |
| lottie-web | 5.13.0(锁定) | Lottie 动画——组件源码级 CDN import 重映射目标 | webgl_loader_texture_lottie.vue | 同上 | 高:同上 |
| @gsimone/three-raycaster-helper | 0.1.0(锁定) | 射线调试辅助(CDN 重映射目标) | misc_raycaster_helper.vue | 同上 | 高:同上 |
| @jgphilpott/polyslice | 26.4.0(锁定) | G-code 导出切片(CDN 重映射目标) | misc_exporter_gcode.vue | 同上 | 高:同上 |
| rhino3dm | ^8.35.0 / 8.35.0 | Rhino 3dm 格式解码(wasm,public/vendor-rhino3dm 本地化) | 3dm 加载器示例 | 无 | 中 |
| web-ifc | ^0.0.78 / 0.0.78 | IFC 建筑格式解析(3.5MB 独立 chunk) | webgl_loader_ifc.vue | 无 | 中 |
| jszip | ^3.10.2 / 3.10.2 | zip 流读取 | fileChunks.vue | 无 | 低 |
| 3d-tiles-renderer | 见 1.3 | — | — | — | — |
| 依赖 | 版本(声明/实装) | 用途 | 使用位置 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|
| autofit.js | ^3.2.8 / 3.2.8 | 大屏等比缩放(迁移存量方案二) | src/views/bigscreen/sc-datav-demo0,1/components/AutoFit.vue | 统一到 DatavContainer | 低 |
| @echarts-x/custom-liquid-fill | ^1.0.2 / 1.0.2 | 水球图自定义系列 | src/views/bigscreen/dashboard/components/LiquidChart.vue、report/LiquidFill.vue | echarts-gl liquidfill(旧版) | 中:需 echarts.use 注册(git 43ed93b 修过漏注册) |
| @echarts-x/custom-word-cloud | ^1.0.1 / 1.0.1 | 词云自定义系列 | src/views/bigscreen/report/components/WordCloud.vue | echarts-wordcloud 旧包 | 中:同上 |
| countup.js | ^2.10.1 / 2.10.1 | 数字滚动 | src/views/bigscreen/ioftv-screen/components/count-up/count-up.vue | 自研 rAF 补间 | 低 |
| keli-heatmap.js | ^2.0.18 / 2.0.18 | 自绘热力图 | src/views/bigscreen/sc-datav-demo1/composables/useMap.ts | echarts heatmap | 低 |
| d3-geo | ^3.1.1 / 3.1.1 | 地理投影(大屏地图经纬度换算) | sc-datav-demo0/1/2 的 useMap | echarts 内置投影 | 低 |
| d3 | ^7.9.0 / 7.9.0 | SVG 图形基础(three d3Svg 示例) | three-cesium-examples/.../d3Svg.vue | 按需拆分子包 | 低 |
| dompurify | ^3.4.16 / 3.4.16 | 动态 SVG 消毒(全站唯一使用点) | src/views/bigscreen/sc-datav-demo2/components/Chart4Content.vue | 无 | 低 |
| material-symbols | ^0.45.8 / 0.45.10 | 图标字体(3.96MB woff2 进首屏) | src/main.ts、AppIcon | SVG 按需图标(优化方向见 10 篇第 8 节) | 低 |
| 依赖 | 版本 | 用途 | 备注 |
|---|---|---|---|
| vite | ^5.0.0 / 5.4.21 | 构建 | target esnext(three 顶层 await) |
| @vitejs/plugin-vue | ^5.0.0 | SFC 编译插件 | — |
| tailwindcss + @tailwindcss/vite | ^4.0.0 / 4.3.3 | 样式令牌体系 | src/assets/main.css @theme inline |
| typescript | ^5.0.0 / 5.9.3 | 类型 | strict 全开 |
| vue-tsc | ^3.3.8 / 3.3.12 | SFC 类型检查 | CI 阻塞项 |
| vitest + @vitest/coverage-v8 | ^2.1.9 | 单测 | happy-dom + globals + 20s 超时 |
| @vue/test-utils | ^2.4.11 | 组件测试挂载 | — |
| happy-dom | ^20.11.1 | 测试 DOM 环境 | — |
| eslint 全家桶(eslint/@eslint/js/typescript-eslint/eslint-plugin-vue/eslint-config-prettier/eslint-plugin-prettier/prettier/globals) | 见 lock | flat config lint | no-explicit-any 为 error |
| playwright | ^1.61.0 / 1.63.0 | 冒烟测试 | scripts/smoke.mjs |
| sharp | ^0.35.5 / 0.35.5 | 缩略图 WebP 转换 | scripts/gen-thumbs-webp.mjs |
| shiki | ^1.29.2 / 1.29.2 | 源码高亮 | 运行时按需异步单例(偏运行时用途) |
| tsx | ^4.7.0 | TS 脚本直跑 | manifest 头注释提到的再生成命令依赖它 |
| unplugin-auto-import / unplugin-vue-components | ^19.0.0 / ^28.0.0 | EP 按需 + 组件自动注册 | 见 2.5 节 |
| @types/lodash-es / @types/node / @types/three | ^4.17.12 / ^22.0.0 / ^0.186.0 | 类型声明 | @types/three 必须与 three 主版本对齐 |
echarts 是全站消费面最宽的依赖:四条消费链分别是 EChartDemo 的模块顶静态 import(ADR-011)、ChartExampleRenderer 兜底链的动态 import(配合 echarts-gl 预载与 requiresMap 预注册)、src/utils/v-chart.ts 的两级动态 import(先 echarts 后 vue-echarts,保证注册顺序)、以及 src/utils/sfc-modules.ts 沙箱白名单里的 echarts/echarts-gl/echarts/extension/bmap/bmap 三项。选型理由很直接:案例真源是 ECharts 官方示例库,echarts 6 全量包 + vue-echarts 的 manual-update 模式让"官方 option 原样可用"与"响应式更新不 diff 巨型 option"同时成立。替代方案上,若追求更小的核心 chunk 可用 echarts/core + 按需注册(收益估算与代价见 ADR-011),但"示例不可预知的系列组合"让按需注册的维护成本长期化。升级风险有三层:echarts 大版本会变动 painter/注册时序(ADR-011 的前提);echarts-gl 处于低维护状态、对 echarts 6 的兼容需实测(54 条兜底条目中 GL 类走 requiresGl 预载链,一坏一片);@echarts-x 两件自定义系列依赖 echarts.use() 显式注册,git 提交 43ed93b 记录过"LiquidFill/WordCloud 只副作用 import 未注册导致 renderItem is not a function"的修复——升级后此类症状优先查注册链。
@antv/g2plot 承载 351 条 antv 案例的两条链路:334 个本地 SFC 在 onMounted 里 new Plot(container, options) 自驱渲染,17 条兜底条目由 renderAntvConfig 二分求值出 {plotClass, options} 后反射实例化(g2plot[payload.plotClass] 的动态取类是全站唯一的"字符串到构造器"反射点)。选型 G2Plot 而非 G2 的理由与 echarts 同构——真源是 G2Plot 官方文档示例站,语义化配置(xField/yField)对官方 demo 的还原度最高;代价是官方重心已迁移到 G2,G2Plot 进入维护态,新特性止步。@antv/util 是 G2Plot 的伴生工具包,被 venn/统计对比类示例直接引用,属于"跟着真源走"的被动依赖。升级风险集中在 g2plot 2.x:它对内部 G2 4.x 的绑定意味着不能单独升 @antv/util 大版本(会破坏 G2Plot 内部引用);替换方案若选 @antv/g2 5.x,等于 351 条案例的语法整体重写,属架构级决策,当前无必要性。
three 是体积最大、生态最宽的依赖,^0.186.1 的实装版本经 git 提交 3ce1b0c 从 0.184 升上来,动机明确:"0.186 已含 webgpu 示例所需全部 API(MeshBasicNodeMaterial/CanvasTarget/SoftParticles 实测在官方包)"。它的 25 个生态包不是"选出来的"而是"跟着 989 条示例的真源进来的"——每条 three 示例 import 什么就装什么,官方 examples 用到的附加模块(TTFLoader 的 opentype.js、demuxer 的 mp4box、lottie 纹理的 lottie-web 等)甚至因此产生了五条 CDN alias 重映射(见 1.4 表与 ADR-009)。管理策略上,manualChunks 的 /three 规则把整个舰队收进 three-vendor 单桶(5.4MB,仅 three 详情页加载),代价是桶内互相拖累——《10-性能设计与优化》第 8 节建议 3 提出的细拆方向是唯一的体积优化余量。升级风险呈明显梯度:官方系(postprocessing/three-mesh-bvh)与 three 月度版本耦合最紧;实验性包(gaussian-splats、gltf-progressive alpha、gpu-pathtracer)随时可能因 three 内部 API 变更而断;@types/three 必须与主包同版本升,否则 989 条示例的类型检查(tsconfig 排除了它们,实际影响面是 stage 壳层)会先崩。升级 three 的标准动作是:改 package.json → pnpm install → 跑 three-data.test.ts → 起服务跑 sweep-three.mjs 全量渲染清扫 → smoke 外链断言(升级最容易重新引入 CDN import)。
autofit.js 是 22 个大屏中 sc-datav-demo0/demo1 两屏使用的等比缩放方案,由各自的 components/AutoFit.vue 封装 autofit.init 调用。它是"迁移存量保留"的典型:这两屏迁移自使用 autofit.js 的上游实现,与站内自研的 DatavContainer(1920×1080 基准 + 视口宽高分别算 scale + MutationObserver)形成双方案并存——《10-性能设计与优化》第 5 节已标注 ⚠️ 待确认是否长期并存还是统一到 DatavContainer。选型理由仅有一条:保持迁移源代码字节级一致,降低迁移 diff 与回归面。替代方案明确且已内建(DatavContainer 覆盖同样能力),因此该依赖的可替代性是全部运行时依赖里最高的,建议作为依赖瘦身的首批候选(删两处 import + 缩放层改造,一小时内可完成,需回归两屏渲染)。
unplugin-auto-import 与 unplugin-vue-components 是 devDependencies 中影响面最"隐形"的两个:它们在 dev/build 时改写源码模块图并生成 auto-imports.d.ts、components.d.ts 两个生成物(.gitignore 已忽略,勿手改)。当前实际分工很不均衡——AutoImport 只承担 ElementPlusResolver 的 API 转换副作用(auto-imports.d.ts 的 declare global 块为空,全站代码风格是显式 import);Components 则真正承担了 29 个组件的全局按需注册(datav 全族、layout 五件、渲染链组件等),这是"大屏模板里直接写 DatavContainer 不用 import"的机制基础。选型理由:按需引入让 element-plus 只打包实际用到的三个组件,组件自动注册让 20 个迁移大屏免于各自写 import。升级风险在解析器契约:ElementPlusResolver 的样式注入与 src/main.ts 显式引入的两条 CSS(button/input)强相关(《14-配置与环境详解》第 5 节详述),升 unplugin 或 element-plus 时样式丢失的第一排查位就是这里;vitest.setup.ts 里 stub 掉 message 样式模块是同一问题的测试侧镜像。
这两个依赖的共性是"按用途本可归入工具层,实际却站在了体积与体验的显眼位置"。material-symbols 以字体形态(src/main.ts 引入 outlined 样式)为全站提供图标,AppIcon 组件统一消费 ms:xxx 图标名——3.96MB 的 woff2 因此进入首屏关键路径,是全站单一文件体积的第三名;它的选型理由是"图标即字体"的零维护成本(新增图标不改任何组件,只换名字),代价是首屏为未使用的两千多个图标字形买单。shiki 则服务于源码弹窗与代码块的高亮,实装 1.29.2,消费入口是 src/utils/highlighter.ts 的异步单例——它在依赖分类上是一件怪事:明明列在 devDependencies,却被渲染链在运行时动态 import(详情页打开源码弹窗时才拉取对应 chunk)。这个"分类错误"的实际后果为零(动态 import 使它不进任何首屏路径),但它在依赖审计时容易造成"这是构建工具"的误判,与 @vue/compiler-sfc 的"运行时依赖"恰好互为镜像——一个 dev 依赖在运行时干活,一个 runtime 依赖在浏览器里编译,两者合起来提醒我们:依赖分类的语义是"声明意图"而非"真实执行位置",审计体积时要以 chunk 归属为准。
它出现在 dependencies 而非 devDependencies,是整个依赖表里最容易误读的一项:沙箱编译发生在用户浏览器里(src/utils/sfcRuntime.ts 的 loadSfcCompiler 动态 import('@vue/compiler-sfc')),而非 vite 构建期。这带来三个约束:其一,它必须与 vue 主包严格同版本(compiler 产物喂给运行时,版本劈叉会出现渲染函数签名不匹配的怪错);其二,它以独立 chunk 存在但只被沙箱链路懒加载,当前数据面无消费者(ADR-004 的休眠态),等于为首屏背了零成本、为 bundle 分析添了一个"看似未使用"的依赖;其三,若未来走"预编译产物替代运行时求值"(《08-安全与权限设计》第 8 节隐患 5 的 CSP 方向),它是第一个可以移除的运行时依赖。
按"维护活跃度 × 升级摩擦 × 替代难度"三个维度给整体依赖面打分,结论是:结构健康,局部有定时炸弹。
绿灯区(可长期不动):框架层(vue/pinia/vue-router/@vueuse)版本领先、API 稳定;开发工具链(vite 5/vitest 2/eslint 10/typescript 5.9)均为当前主流大版本;纯功能小件(dayjs/countup.js/jszip/dompurify/d3-geo)无升级压力。
在展开三色分区之前,还应注意这个依赖面的治理基础设施现状:仓库使用 pnpm 10(CI 以 pnpm/action-setup@4 锚定版本并以 --frozen-lockfile 安装),252KB 的 pnpm-lock.yaml 把全部传递依赖钉死——这意味着"依赖漂移"在本项目有两层防线,lockfile 保证可复现安装,守恒测试与 smoke 保证升级后的行为面。没有使用的机制也值得登记:无 renovate/dependabot 类自动升级机器人(.github/ 下仅一个 ci.yml,⚠️ 待确认是否有计划引入自动依赖更新流水线),无 bundle 体积门禁(rollup-plugin-visualizer 未安装),依赖升级完全依赖人工触发与人工验证——在"重量级运行时舰队"的现实下,这套人工流程的可持续性取决于升级纪律(见文末两条全局纪律)的执行质量,而非工具兜底。
黄灯区(升级需演练):echarts 6 + vue-echarts 8 + echarts-gl 2 的三角组合——echarts-gl 的低维护是最大变量,54 条 GL 兜底条目是它的回归测试网;three 月度发布节奏要求每次升级走"测试 + sweep + smoke"三连(见 2.3 节), fleet 中 6 个实验性/alpha 包随 three 主版本联动的成本会持续存在;五条锁定版本的 alias 锚定包(opentype.js/mp4box/lottie-web/raycaster-helper/polyslice)是"升级必断 alias"的硬约束,升级它们必须同步改 vite.config.ts 的 alias 目标路径。
红灯区(已知债务,排期处理):其一,@antv/g2plot 维护态——长期看要么锁死 2.4.x 到项目退役,要么接受 351 条案例的 G2 5 迁移立项,无中间态;其二,cannon-es 已停止维护(物理类示例仍依赖),若 three 生态物理方案演进需评估 @react-three/rapier 类替代;其三,material-symbols 的 3.96MB 首屏字体是依赖面里唯一"结构性浪费"(实际图标名有限),子集化收益 90% 以上(10 篇第 8 节建议 2);其四,autofit.js 的可替代性最高,随大屏缩放统一一并清理(2.4 节)。
两条跨依赖的全局纪律收束本章。第一,改依赖必跑三连:pnpm install && pnpm test && pnpm test:smoke(《14-配置与环境详解》第 9 节检查单)——依赖变更是外链回归(smoke 外链断言)与守恒测试失败的最高发来源,这是被事故验证过的纪律而非形式主义。第二,新增依赖先过"chunk 归属"一问:它会被哪个 vendor 桶收编?是否拖累首屏?是否有动态 import 边界?在"懒加载一切重资产"的架构约束(ADR-006)下,一个新依赖最危险的形态不是"大",而是"大且进了首屏 vendor 桶"——历史上那次 9.3MB 事故的教训全部浓缩在这一个问句里。