Private
Public Access
1
0
Files
u-desk/docs/06-前端开发/代码分割/code-splitting-optimization.md

4.5 KiB
Raw Permalink Blame History

代码分割优化报告

优化目标

通过动态 import() 减小初始包大小,提升首屏加载速度。

优化方案

将 CodeEditor 组件改为异步加载defineAsyncComponent

优化结果

📊 包大小对比

文件 优化前 优化后 变化
index.js 2,955 KB
(gzip: 907 KB)
2,575 KB
(gzip: 778 KB)
-380 KB
(-129 KB gz)
CodeEditor.js (新增) - 381 KB
(gzip: 129 KB)
+381 KB
codemirror.js (独立) 包含在 index.js 606 KB
(gzip: 218 KB)
独立 chunk

🎯 优化效果

  • 主包减少 13%2.95 MB → 2.57 MB
  • Gzip 减少 14%907 KB → 778 KB
  • 按需加载CodeMirror 仅在打开编辑器时加载
  • 首屏更快:减少 380 KB 初始下载

📦 代码分割详情

优化前

index.js (2,955 KB)
├── CodeMirror (605 KB)  ← 在主包中
└── CodeEditor (381 KB)  ← 在主包中

优化后

index.js (2,575 KB)  ← 主包,启动时加载
CodeEditor.js (381 KB)  ← 按需加载,打开编辑器时
codemirror.js (606 KB)  ← 按需加载,打开编辑器时

实施细节

修改的文件

frontend/src/components/FileSystem/components/FileEditorPanel.vue

修改内容

1. 添加异步组件定义

import { defineAsyncComponent } from 'vue'

// 异步加载 CodeEditor 组件,减少初始包大小
const AsyncCodeEditor = defineAsyncComponent({
  loader: () => import('@/components/CodeEditor.vue'),
  delay: 200,           // 200ms 后显示加载状态
  timeout: 10000        // 10 秒超时
})

2. 替换组件使用

<!-- 原来 -->
<CodeEditor ... />

<!-- 现在 -->
<AsyncCodeEditor ... />

加载体验

  • 首次打开编辑器:延迟 ~200ms可接受
  • 后续打开:无延迟(已缓存)
  • 首屏加载:快 ~380 KB

性能分析

首屏加载速度提升

假设 3G 网络1 Mbps

  • 优化前2.95 MB → ~7.3 秒
  • 优化后2.57 MB → ~6.4 秒
  • 提升~0.9 秒

假设 WiFi10 Mbps

  • 优化前2.95 MB → ~0.73 秒
  • 优化后2.57 MB → ~0.64 秒
  • 提升~0.09 秒

Gzip 压缩效果更明显

  • 减少 129 KBGzip 后)
  • 相当于减少 14% 初始下载

改动评估

项目 评估
修改文件数 1 个
代码修改量 ~10 行
改动复杂度 简单
风险评估 🟢
收益 🟢
用户体验 无明显影响

后续优化建议

可选优化(优先级低)

  1. 异步加载 Markdown 预览~400 KB

    • 收益:额外减少 400 KB
    • 改动中等4-5 个文件)
    • 风险Markdown 渲染可能延迟
  2. 异步加载 Mermaid 图表~1.5 MB

    • 收益:图表按需加载
    • 改动:较大(需要改造 markedExtensions
    • 风险:图表显示可能延迟
  3. CodeMirror 语言包按需加载~600 KB → ~100 KB

    • 收益:减少 500 KB
    • 改动:大(需要改造语言包加载逻辑)
    • 风险:高

当前状态

已完成CodeEditor 异步加载 效果:主包减少 380 KB (13%) 用户体验:无明显负面影响

技术细节

defineAsyncComponent 参数

{
  loader: () => import('./Component.vue'),  // 动态导入
  delay: 200,        // 延迟显示 loadingms
  timeout: 10000,    // 加载超时ms
  suspensible: false  // 是否与 Suspense 集成
}

加载流程

  1. 用户打开文件
  2. Vue 检测到 AsyncCodeEditor
  3. 触发动态 import()
  4. CodeEditor chunk (381 KB) 开始加载
  5. CodeMirror chunk (606 KB) 开始加载
  6. 200ms 后(如有延迟)显示加载状态
  7. 加载完成,渲染编辑器

浏览器缓存

  • 首次访问:下载 index.js (2.57 MB)
  • 打开编辑器:下载 CodeEditor.js + codemirror.js
  • 后续访问:从缓存加载,无额外下载

总结

通过仅修改 1 个文件,增加 ~10 行代码,成功将初始包大小减少了 13%380 KBGzip 后减少 14%129 KB

用户收益

  • 首屏加载更快
  • 初始下载更少
  • 编辑器体验无明显影响

开发收益

  • 改动小,风险低
  • 无需重构现有代码
  • 易于维护

实施日期2026-02-04 优化类型代码分割Code Splitting 状态 完成 验证 构建成功,功能正常