Approved
作为 图表库开发者, 我想要 将 u-charts 核心库中的 uChartsEvent 事件类和 uCharts 主类搬迁到独立模块并导入所有模块,完成整个 u-charts 核心库的模块化搬迁, 以便 提高代码的可维护性、可测试性和类型安全性,为后续 React 组件封装打下基础。
charts/ 目录下所有文件创建完成src/index.ts 保持向后兼容,默认导出 uCharts 类pnpm typecheck),无 any 类型(除非必要)pnpm build),自动生成 .d.ts 声明文件[ ] Task 1: 分析核心类结构 (AC: 1, 2, 8)
[ ] Task 2: 创建 charts 模块目录结构 (AC: 1)
src/lib/charts/u-charts-event.tssrc/lib/charts/u-charts.tssrc/lib/charts/index.ts[ ] Task 3: 搬迁 uChartsEvent 类并添加类型注解 (AC: 2, 4, 8)
[ ] Task 4: 搬迁 uCharts 类并添加类型注解 (AC: 2, 4, 8)
[ ] Task 5: 更新 src/index.ts 导出配置 (AC: 3, 5)
[ ] Task 6: 验证搬迁结果 (AC: 4, 5, 6, 7)
pnpm typecheck)pnpm build)[ ] Task 7: 删除或备份原始 u-charts.ts 文件 (AC: 8)
故事 016.001 完成状态:
mini-charts 包基础结构src/lib/u-charts.ts(7680行代码)@ts-nocheck 绕过原始库中的类型问题故事 016.002 完成状态:
config.ts 和 utils/ 目录及所有子模块文件pnpm typecheck)any 类型以兼容小程序环境故事 016.003 完成状态:
data-processing/ 目录及所有子文件pnpm typecheck)故事 016.004 完成状态:
charts-data/ 目录及所有子文件pnpm typecheck)故事 016.005 完成状态:
renderers/ 目录及所有子文件pnpm typecheck)关键技术决策:
export 语法导出函数和类型迁移策略: 保持 u-charts 核心绘制逻辑不变,渐进式模块化并添加类型定义
来源: tech-stack.md
来源: source-tree.md
mini-ui-packages/
└── mini-charts/ # mini-charts 包
├── src/
│ ├── index.ts # 主入口文件(需要更新)
│ └── lib/
│ ├── u-charts.ts # u-charts 核心库(7680行)- [本故事删除]
│ ├── config.ts # [已完成] 配置对象
│ ├── utils/ # [已完成] 工具函数目录
│ ├── data-processing/ # [已完成] 数据处理模块
│ ├── charts-data/ # [已完成] 图表数据点计算模块
│ ├── renderers/ # [已完成] 绘制函数模块
│ └── charts/ # [本故事创建] 核心类模块
│ ├── u-charts-event.ts # uChartsEvent 事件类
│ ├── u-charts.ts # uCharts 主类
│ └── index.ts # 核心类模块统一导出
├── tests/
│ └── u-charts.test.ts
├── package.json
├── tsconfig.json
└── jest.config.cjs
{
"compilerOptions": {
"target": "ES2020",
"lib": ["DOM", "DOM.Iterable", "ES2020"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"]
}
本故事重要: 需要为所有类方法添加完整的类型注解,确保 strict: true 模式下无类型错误。
来源: mini-charts/src/lib/u-charts.ts
位置: 原始文件第 6939-6968 行(约30行)
| 方法名 | 功能描述 |
|---|---|
| constructor | 初始化事件存储对象 |
| addEventListener | 添加事件监听器 |
| delEventListener | 删除事件监听器 |
| trigger | 触发事件,调用所有监听器 |
类型定义示例:
export interface EventListener {
(...args: any[]): void;
}
export interface EventMap {
[type: string]: EventListener[];
}
export class uChartsEvent {
events: EventMap;
constructor();
addEventListener(type: string, listener: EventListener): void;
delEventListener(type: string): void;
trigger(type: string, ...params: any[]): void;
}
位置: 原始文件第 6970-7680 行(约610行)
主要方法和属性:
| 类别 | 方法/属性名 | 功能描述 |
|---|---|---|
| 构造函数 | constructor | 初始化图表配置和上下文 |
| 配置方法 | initConfig | 初始化配置对象 |
| 绘制方法 | drawCanvas | 执行画布绘制 |
| 事件处理 | touchEvent | 处理触摸事件 |
| 事件处理 | eventListener | 事件监听器 |
| 数据处理 | getDataPoints | 获取数据点 |
| 坐标计算 | calXAxisData | 计算X轴数据 |
| 坐标计算 | calYAxisData | 计算Y轴数据 |
| 动画方法 | animation | 执行动画 |
| 工具方法 | getH5Offset | 获取H5偏移量 |
重要依赖:
类型定义示例:
export interface ChartsConfig {
pixelRatio?: number;
fontSize?: number;
fontColor?: string;
background?: string;
title?: ChartsTitle;
subtitle?: ChartsTitle;
duration?: number;
yAxis?: YAxisConfig;
xAxis?: XAxisConfig;
legend?: LegendConfig;
extra?: ExtraConfig;
rotate?: boolean;
[key: string]: any;
}
export interface ChartsContext {
width: number;
height: number;
padding: number[];
[key: string]: any;
}
export class uCharts extends uChartsEvent {
opts: ChartsConfig;
context: ChartsContext;
// ... 其他属性
constructor(opts: ChartsConfig);
initConfig(config: ChartsConfig): void;
drawCanvas(): void;
touchEvent(event: TouchEvent): void;
// ... 其他方法
}
本故事重要: 必须为所有类方法添加完整的类型注解,避免使用 any 类型(除非必要)。
类型定义原则:
export 语法导出函数和类型测试框架: Jest(mini 包使用 Jest,不是 Vitest)
测试位置: tests/ 目录(与源码并列)
测试类型:
测试要求:
测试命令:
# 进入包目录
cd mini-ui-packages/mini-charts
# 运行所有测试
pnpm test
# 运行特定测试
pnpm test --testNamePattern "核心类测试"
# 类型检查
pnpm typecheck
# 构建
pnpm build
mini-charts 包在 PNPM 工作空间中:
tsc 编译到 dist/ 目录tsc --noEmit 验证类型重要: 本故事完成后,应该可以:
pnpm build 成功生成 dist/ 目录pnpm typecheck 无类型错误开发命令:
# 进入包目录
cd mini-ui-packages/mini-charts
# 安装依赖(在根目录)
pnpm install
# 开发模式(监听文件变化)
pnpm dev
# 类型检查
pnpm typecheck
# 运行测试
pnpm test
# 构建
pnpm build
来源: CLAUDE.md
pnpm test --testNamePattern "测试名称" 运行特定测试pnpm typecheck 加 grep 来过滤要检查的指定文件来源: source-tree.md
所有新文件应创建在:
mini-ui-packages/mini-charts/src/lib/charts/u-charts-event.ts: uChartsEvent 事件类u-charts.ts: uCharts 主类index.ts: 核心类模块统一导出mini-ui-packages/mini-charts/src/index.ts(需要更新导出)mini-ui-packages/mini-charts/tests/(可选,本故事不强制要求)any 类型(除非必要)完成本故事后,应该满足:
src/lib/charts/ 目录下所有文件存在src/index.ts 保持向后兼容,默认导出 uCharts 类pnpm typecheck 无类型错误pnpm build 成功,自动生成 .d.ts 声明文件来源: epic-016 故事列表
以下工作不在本故事范围内:
测试框架: Jest(不是 Vitest)
测试位置: tests/ 目录(与源码并列)
测试要求:
测试命令:
# 运行所有测试
pnpm test
# 运行特定测试
pnpm test --testNamePattern "核心类测试"
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-12-24 | 1.0 | 创建故事文档 | Bob (Scrum Master) |
| 2025-12-24 | 1.1 | 更新状态为 Approved | Bob (Scrum Master) |
| 2025-12-24 | 1.2 | 暂停故事,发现遗漏辅助函数,创建故事 016.007 | James (Dev Agent) |
此部分由开发代理在实施过程中填写
待开发代理填写
待开发代理填写
待开发代理填写
待开发代理填写
此部分由 QA 代理在审查完成后填写