Files
waveform-analysis/DIRECTORY_STRUCTURE_REFACTORING.md
李启源 ea832229da
Some checks failed
CI / verify (push) Has been cancelled
first commit
2026-07-20 10:21:30 +08:00

14 KiB
Raw Blame History

完整目录结构拆分报告

🎉 拆分完成

按照 doc/03-开发计划.md 中 1.4 节的规划,已成功完成完整的目录结构拆分。


📁 新的目录结构

src/
├── components/              # Vue 组件
│   ├── WaveformChart.vue         # 主图表组件 (1913 行)
│   ├── waveform.ts               # 向后兼容导出 (27 行) ✨ 重构
│   ├── waveform-markup.ts        # 标注工具 (154 行)
│   ├── index.ts                  # 组件导出
│   └── WaveformChart.test.ts     # 单元测试
│
├── core/                    # 核心引擎(框架无关)✨ 新增
│   ├── data.ts                   # 数据规范化 (63 行)
│   └── index.ts                  # 核心模块导出
│
├── types/                   # 类型定义 ✨ 新增
│   ├── chart.ts                  # 图表类型 (98 行)
│   ├── data.ts                   # 数据类型 (45 行)
│   └── index.ts                  # 类型统一导出
│
├── utils/                   # 工具函数 ✨ 新增(阶段 1
│   ├── domain.ts                 # 域计算 (29 行)
│   ├── formatters.ts             # 格式化 (64 行)
│   ├── geometry.ts               # 几何计算 (50 行)
│   └── index.ts                  # 工具统一导出
│
├── interactions/            # 交互层 ✨ 预留(待阶段 3
│   └── (待添加: zoom.ts, hover.ts, annotation.ts)
│
├── hooks/                   # Vue Composables ✨ 预留(待阶段 3
│   └── (待添加: useChart.ts, useZoom.ts, useAnnotation.ts)
│
├── data/                    # 示例数据
│   └── wData.json
│
├── test/                    # 测试配置
│   └── setup.ts
│
├── App.vue                  # Demo 应用
├── main.ts                  # 应用入口
├── index.ts                 # 库主入口 ✨ 新增
├── styles.css               # 全局样式
└── env.d.ts                 # TypeScript 声明

📊 模块划分详解

1. types/ - 类型定义层

职责:集中管理所有 TypeScript 类型定义

types/chart.ts (98 行)

  • WaveformPoint - 波形数据点
  • WaveformDisplayMode - 显示模式independent/separated/compact
  • WaveformInteractionMode - 交互模式zoom/select/annotation/vertical-line/range
  • WaveformAnnotation - 标注数据结构
  • WaveformShape - 图形数据结构(垂直线/区间)
  • WaveformMarkupSelection - 标注选择状态

types/data.ts (45 行)

  • SingleWaveformData - 单波形数据格式
  • WaveformSeries - 波形系列
  • WaveformData - 完整波形数据
  • NormalizedWaveformSeries - 规范化后的系列

优势

  • 类型定义集中管理
  • 易于维护和扩展
  • 避免循环依赖

2. core/ - 核心引擎层(框架无关)

职责:提供与框架无关的核心数据处理逻辑

core/data.ts (63 行)

  • normalizeWaveformData() - 规范化单波形数据
  • normalizeWaveformSeries() - 规范化波形系列
    • ID 唯一性验证
    • 数据过滤和排序
    • 格式统一化

特点

  • 纯 TypeScript无 Vue 依赖
  • 可在任何框架中使用React/Svelte/Angular
  • 易于单独测试

后续扩展方向(阶段 2

core/
├── data.ts          # ✅ 已完成
├── scales.ts        # 📝 待添加:比例尺管理
├── axis.ts          # 📝 待添加:坐标轴渲染
├── path.ts          # 📝 待添加:路径生成
├── layout.ts        # 📝 待添加:布局计算
└── downsample.ts    # 📝 待添加:降采样算法

3. utils/ - 工具函数层

职责:提供纯函数工具集

utils/domain.ts (29 行)

  • paddedDomain() - 计算带边距的数据域
  • buildMinorTicks() - 生成次要刻度

utils/formatters.ts (64 行)

  • displayTime() - 时间单位转换
  • formatEndpointTime() - 端点时间格式化
  • formatAxisTime() - 坐标轴时间格式化
  • formatTooltipTime() - 悬浮提示时间格式化

utils/geometry.ts (50 行)

  • resolveTrackGeometry() - 轨道几何布局
  • clamp() - 数值范围限制

特点

  • 所有函数都是纯函数
  • 完整的 JSDoc 注释
  • 易于单独测试和复用

4. components/ - Vue 组件层

职责Vue 组件和标注工具

components/WaveformChart.vue (1913 行)

  • 主波形图组件
  • 保持不变(已在阶段 1 简化)

components/waveform.ts (27 行) - 重构为重新导出

// 向后兼容层
export type { ... } from '../types'
export { ... } from '../core'

优势

  • 保持向后兼容
  • 旧代码无需修改导入路径
  • 内部使用新的模块结构

components/waveform-markup.ts (154 行)

  • 标注和图形工具函数
  • 已更新为使用 ../types 导入

5. interactions/ - 交互层(预留)

规划:抽取交互逻辑(阶段 3

interactions/
├── zoom.ts          # 缩放平移逻辑
├── hover.ts         # 悬浮交互逻辑
└── annotation.ts    # 标注交互逻辑

预期收益

  • 交互逻辑模块化
  • 可独立测试
  • 可复用到其他图表组件

6. hooks/ - Vue Composables预留

规划:抽取可复用的 Vue 组合式函数(阶段 3

hooks/
├── useChart.ts      # 图表状态管理
├── useZoom.ts       # 缩放行为 Hook
├── useAnnotation.ts # 标注管理 Hook
└── useHover.ts      # 悬浮状态 Hook

预期收益

  • 逻辑复用性提升
  • 组件代码减少 ~500 行
  • 易于在其他组件中使用

7. src/index.ts - 库主入口 新增

职责:提供统一的公共 API

// 导出组件
export { default as WaveformChart } from './components/WaveformChart.vue'

// 导出类型
export type { WaveformPoint, WaveformData, ... } from './types'

// 导出核心功能
export { normalizeWaveformSeries, ... } from './core'

// 导出工具函数
export { paddedDomain, formatAxisTime, ... } from './utils'

// 导出标注工具
export { isFiniteAnnotation, ... } from './components/waveform-markup'

优势

  • 统一的入口点
  • 清晰的 API 导出
  • 便于发布为 npm 包

验证结果

所有检查通过

检查项 状态 结果
单元测试 24/24 通过
TypeScript 类型检查 无错误
ESLint 代码规范 0 错误 0 警告
向后兼容性 旧导入路径正常工作

📈 收益分析

1. 代码组织

重构前

src/components/
├── WaveformChart.vue    (1975 行 - 巨型文件)
├── waveform.ts          (149 行 - 类型+逻辑混杂)
└── waveform-markup.ts   (162 行)

重构后

src/
├── types/          (143 行 - 类型定义)
├── core/           (63 行 - 数据处理)
├── utils/          (162 行 - 工具函数)
└── components/     (1913 行 - Vue 组件)

改进

  • 模块职责清晰
  • 类型、逻辑、工具分离
  • 易于定位和修改

2. 可维护性

维度 重构前 重构后 提升
单文件平均行数 762 219 71% ↓
模块内聚性 显著提升
依赖关系 混乱 清晰 单向依赖
新人理解成本 目录即文档

3. 可扩展性

新增功能时的改动范围

场景 重构前 重构后
添加新的数据格式 修改 waveform.ts 只修改 core/data.ts
添加新的图表类型 修改 waveform.ts 只修改 types/chart.ts
添加新的工具函数 混在组件中 添加到对应 utils 模块
添加新的交互模式 修改巨型组件 添加到 interactions/

改进

  • 修改范围最小化
  • 降低回归风险
  • 支持并行开发

4. 可测试性

测试覆盖率提升路径

当前测试WaveformChart.test.ts (24 个测试)
          ↓
扩展测试:
├── types/          (类型定义 - 无需测试)
├── core/data.test.ts       (10+ 测试)
├── utils/domain.test.ts    (5+ 测试)
├── utils/formatters.test.ts (8+ 测试)
├── utils/geometry.test.ts  (5+ 测试)
└── components/             (保留 24 个集成测试)

预期收益

  • 测试粒度更细
  • 单元测试运行更快
  • 易于定位失败原因

5. 跨框架复用

核心模块现在可以在任何框架中使用

// React 项目中使用
import { normalizeWaveformSeries } from '@/waveform-analysis/core'
import { paddedDomain } from '@/waveform-analysis/utils'

// Svelte 项目中使用
import type { WaveformData } from '@/waveform-analysis/types'
import { formatAxisTime } from '@/waveform-analysis/utils'

// Node.js 服务端使用
const { normalizeWaveformData } = require('@/waveform-analysis/core')

优势

  • 核心逻辑可复用
  • 降低迁移成本
  • 支持多端共享

🎯 依赖关系图

┌─────────────────────────────────────────────────┐
│  App.vue (Demo 应用)                              │
└────────────────┬────────────────────────────────┘
                 │
┌────────────────▼────────────────────────────────┐
│  components/WaveformChart.vue (Vue 组件)          │
│  - 导入 types/*                                   │
│  - 导入 utils/*                                   │
│  - 导入 core/*                                    │
└────────┬────────┬────────┬───────────────────────┘
         │        │        │
    ┌────▼───┐ ┌─▼────┐ ┌─▼────┐
    │ types/ │ │utils/│ │core/ │
    │        │ │      │ │      │
    └────────┘ └──────┘ └──┬───┘
                            │
                        ┌───▼────┐
                        │ types/ │
                        └────────┘

依赖规则

  • 单向依赖(从上到下)
  • 无循环依赖
  • 底层模块无 Vue 依赖

🚀 后续扩展路线

短期1-2 周)

阶段 2抽取核心引擎

core/
├── data.ts          # ✅ 已完成
├── scales.ts        # 📝 比例尺管理
├── axis.ts          # 📝 坐标轴渲染
├── path.ts          # 📝 路径生成
└── layout.ts        # 📝 布局计算

预期收益:主组件减少 ~400 行


中期3-4 周)

阶段 3抽取 Composables

hooks/
├── useZoom.ts       # 📝 缩放逻辑
├── useHover.ts      # 📝 悬浮逻辑
├── useAnnotations.ts # 📝 标注管理
└── useSelection.ts  # 📝 选择状态

预期收益:主组件减少 ~500 行


长期1-2 月)

阶段 4组件拆分

components/
├── WaveformChart.vue        # 主容器 (~400 行)
├── WaveformTrack.vue        # 单轨道
├── WaveformAnnotation.vue   # 标注渲染
├── WaveformTooltip.vue      # 悬浮提示
└── WaveformToolbar.vue      # 工具栏

最终目标

  • 主组件 ~400 行(减少 80%
  • 单文件平均 ~150 行
  • 完整的模块化架构

📚 向后兼容性

旧代码无需修改

// 旧的导入方式仍然可用
import {
  WaveformChart,
  type WaveformData,
  type WaveformAnnotation,
} from './components'

// 或者
import { WaveformData } from './components/waveform'

// 新的推荐方式
import { WaveformChart, type WaveformData } from './index'

保证

  • 所有旧导入路径正常工作
  • API 完全兼容
  • 无破坏性变更

📖 开发指南

添加新类型

// 1. 在 types/ 中定义
// src/types/chart.ts
export interface WaveformNewFeature {
  // ...
}

// 2. 在 types/index.ts 导出
export type { WaveformNewFeature } from './chart'

// 3. 在 src/index.ts 导出
export type { WaveformNewFeature } from './types'

添加新工具函数

// 1. 在 utils/ 对应模块中实现
// src/utils/formatters.ts
export function formatNewValue(value: number): string {
  // ...
}

// 2. 在 utils/index.ts 导出
export { formatNewValue } from './formatters'

// 3. 在 src/index.ts 导出
export { formatNewValue } from './utils'

添加核心功能

// 1. 在 core/ 中实现
// src/core/downsample.ts
export function downsampleData(points: WaveformPoint[]): WaveformPoint[] {
  // ...
}

// 2. 在 core/index.ts 导出
export { downsampleData } from './downsample'

// 3. 在 src/index.ts 导出
export { downsampleData } from './core'

总结

完成情况

  • 目录结构完全按规划实施
  • 所有测试通过24/24
  • 类型检查通过
  • 代码规范检查通过
  • 向后兼容性保证

核心收益

维度 改善
代码组织 清晰的分层架构
可维护性 单文件平均减少 71%
可扩展性 模块化添加功能
可测试性 支持细粒度测试
可复用性 核心逻辑跨框架

模块统计

模块 文件数 代码行数
types/ 3 143
core/ 2 63
utils/ 4 162
components/ 4 2094
总计 13 2462

下一步

项目现在具备了清晰的模块化架构,可以支持:

  • 快速添加新功能
  • 多人并行开发
  • 独立测试和优化
  • 跨框架复用核心逻辑

拆分完成时间: 2026-07-18
验证状态: 所有检查通过
向后兼容: 完全兼容