前端AI工具链,代码越写越乱。

本文是代码重构实战,从烂代码到优雅代码,包括重构原则、常见坏味道、重构技巧、AI工具的使用,以及我的经验总结。

一、为什么要重构

1. 代码腐烂

第一个原因:代码腐烂。

  • 需求变更快
  • AI工具迭代快
  • 快速迭代
  • 技术债累积
  • 代码越来越烂

代码腐烂,是常态。

2. AI工具多

第二个原因:AI工具多。

  • 调用多个AI API
  • 每个API逻辑不同
  • 代码重复
  • 混乱
  • 需要统一

AI工具多,是复杂度的来源。

3. 团队协作

第三个原因:团队协作。

  • 多人开发
  • 风格不统一
  • 理解不一致
  • 维护成本高
  • 需要重构

团队协作,是动力。

4. 性能优化

第四个原因:性能优化。

  • AI调用慢
  • 前端体验差
  • 需要优化
  • 重构是机会
  • 提升性能

性能,是结果之一。

二、常见的代码坏味道

1. 组件过大

第一个坏味道:组件过大。

  • 一个组件处理所有AI逻辑
  • 几百上千行
  • 职责不清
  • 难以维护
  • 需要拆分

大组件,是最常见的坏味道。

2. API调用混乱

第二个坏味道:API调用混乱。

  • 每个组件自己调API
  • 没有统一封装
  • 错误处理不一致
  • 鉴权逻辑重复
  • 需要统一

API混乱,是AI工具链的通病。

3. 状态管理混乱

第三个坏味道:状态管理混乱。

  • 组件里管状态
  • 全局状态和局部状态混用
  • 状态不同步
  • Bug多
  • 需要整理

状态混乱,是前端的老大难。

4. 类型定义缺失

第四个坏味道:类型定义缺失。

  • 用any
  • 没有类型
  • IDE没提示
  • 容易出错
  • 需要补类型

类型缺失,是质量问题。

5. 魔法字符串

第五个坏味道:魔法字符串。

  • API地址写死
  • 模型名称写死
  • 参数写死
  • 改起来麻烦
  • 需要常量

魔法字符串,要消除。

三、重构原则

1. 原则一:单一职责

第一个原则:单一职责。

  • 每个组件只做一件事
  • 每个函数只做一件事
  • 职责清晰
  • 容易维护
  • 容易测试

单一职责,是基础。

2. 原则二:开闭原则

第二个原则:开闭原则。

  • 对扩展开放
  • 对修改关闭
  • 加新AI工具不用改老代码
  • 用接口抽象
  • 是设计的核心

开闭原则,是设计的核心。

3. 原则三:依赖倒置

第三个原则:依赖倒置。

  • 依赖抽象不依赖具体
  • 高层不依赖低层
  • 用接口
  • 方便替换
  • 方便测试

依赖倒置,是解耦的关键。

4. 原则四:小步快跑

第四个原则:小步快跑。

  • 不要一下子大改
  • 每次改一点
  • 每次都能运行
  • 降低风险
  • 是重构的方式

小步,是安全的方式。

5. 原则五:保持功能不变

第五个原则:保持功能不变。

  • 重构不改变功能
  • 只改代码结构
  • 不要边重构边加功能
  • 不然容易出问题
  • 是重构的底线

功能不变,是重构的底线。

四、重构技巧

1. 技巧一:封装API层

第一个技巧:封装API层。

  • 统一封装AI API调用
  • 统一错误处理
  • 统一鉴权
  • 统一参数
  • 组件不直接调API

API层,是AI工具链的核心。

2. 技巧二:用策略模式

第二个技巧:用策略模式。

  • 不同AI工具用不同策略
  • 统一接口
  • 可以切换
  • 可以扩展
  • 符合开闭原则

策略模式,是AI工具链的好模式。

3. 技巧三:提取hooks

第三个技巧:提取hooks。

  • 把AI逻辑提取到hooks
  • useChat
  • useImage
  • useStream
  • 组件更简洁
  • 逻辑可复用

hooks,是React的精髓。

4. 技巧四:用TypeScript

第四个技巧:用TypeScript。

  • 定义类型
  • API返回类型
  • 请求参数类型
  • 模型类型
  • 提高质量

TypeScript,是质量的保障。

5. 技巧五:用状态管理

第五个技巧:用状态管理。

  • 用Zustand或Redux
  • 统一管理AI状态
  • 组件间共享
  • 状态同步
  • 减少Bug

状态管理,是架构的关键。

五、重构实战

1. 实战一:API层封装

第一个实战:API层封装。

重构前:

// 每个组件自己调
const response = await fetch('/api/chat', {
    method: 'POST',
    headers: { 'Authorization': `Bearer ${token}` },
    body: JSON.stringify({ message })
});

重构后:

// api/ai.js
class AIApi {
    async chat(message) {
        return this.request('/chat', { message });
    }
    async request(url, data) {
        const response = await fetch(url, {
            method: 'POST',
            headers: { 'Authorization': `Bearer ${this.token}` },
            body: JSON.stringify(data)
        });
        return response.json();
    }
}
  • 统一封装
  • 统一错误处理
  • 统一鉴权
  • 组件更简洁

封装,效果立竿见影。

2. 实战二:策略模式

第二个实战:策略模式。

重构前:

if (model === 'gpt') {
    // GPT逻辑
} else if (model === 'claude') {
    // Claude逻辑
} else if (model === 'gemini') {
    // Gemini逻辑
}

重构后:

// strategies/
class GPTStrategy { async chat() {} }
class ClaudeStrategy { async chat() {} }
class GeminiStrategy { async chat() {} }

const strategies = {
    gpt: new GPTStrategy(),
    claude: new ClaudeStrategy(),
    gemini: new GeminiStrategy()
};

const result = await strategies[model].chat(message);
  • 用策略模式
  • 加新模型不用改老代码
  • 符合开闭原则
  • 更优雅

策略模式,是AI工具链的好模式。

3. 实战三:提取hooks

第三个实战:提取hooks。

重构前:

// 组件里写所有逻辑
const [messages, setMessages] = useState([]);
const [loading, setLoading] = useState(false);
const sendMessage = async (msg) => {
    setLoading(true);
    const reply = await api.chat(msg);
    setMessages([...messages, reply]);
    setLoading(false);
};

重构后:

// hooks/useChat.js
export function useChat() {
    const [messages, setMessages] = useState([]);
    const [loading, setLoading] = useState(false);
    const sendMessage = async (msg) => {
        setLoading(true);
        const reply = await api.chat(msg);
        setMessages(prev => [...prev, reply]);
        setLoading(false);
    };
    return { messages, loading, sendMessage };
}
  • 提取到hooks
  • 可复用
  • 组件更简洁
  • 逻辑更清晰

hooks,是React的精髓。

4. 实战四:类型定义

第四个实战:类型定义。

重构前:

const response: any = await api.chat(message);

重构后:

interface ChatResponse {
    id: string;
    content: string;
    role: 'user' | 'assistant';
}
const response: ChatResponse = await api.chat(message);
  • 定义类型
  • IDE有提示
  • 减少Bug
  • 提高质量

类型,是质量的保障。

5. 实战五:流式输出

第五个实战:流式输出。

重构前:

  • 等全部返回再显示
  • 用户体验差
  • 等待时间长

重构后:

  • 用SSE流式输出
  • 逐字显示
  • 体验好
  • 像ChatGPT

流式输出,是AI应用的标配。

六、AI工具的使用

1. 用AI写代码

第一个:用AI写代码。

  • Cursor
  • GitHub Copilot
  • 帮你写代码
  • 帮你重构
  • 提高效率

AI,是编程的好帮手。

2. 用AI查Bug

第二个:用AI查Bug。

  • 把报错给AI
  • AI帮你分析
  • 给解决方案
  • 快速定位
  • 节省时间

AI,是调试的好帮手。

3. 用AI写测试

第三个:用AI写测试。

  • AI帮你写单元测试
  • 帮你写集成测试
  • 提高覆盖率
  • 保证质量
  • 节省时间

AI,是测试的好帮手。

4. 用AI写文档

第四个:用AI写文档。

  • AI帮你写注释
  • 帮你写README
  • 帮你写API文档
  • 提高文档质量
  • 节省时间

AI,是文档的好帮手。

5. 用AI做代码审查

第五个:用AI做代码审查。

  • AI帮你审查代码
  • 发现问题
  • 给建议
  • 提高代码质量
  • 是第二双眼睛

AI,是代码审查的好帮手。

七、重构后的好处

1. 好处一:可读性提高

第一个好处:可读性提高。

  • 代码更清晰
  • 更容易理解
  • 新人上手快
  • 维护成本低
  • 是最直接的好处

可读性,是重构的核心目标。

2. 好处二:可维护性提高

第二个好处:可维护性提高。

  • 修改更容易
  • Bug更少
  • 定位问题更快
  • 维护成本低
  • 是长期收益

可维护性,是重构的长期价值。

3. 好处三:可扩展性提高

第三个好处:可扩展性提高。

  • 加新AI工具容易
  • 不用改老代码
  • 符合开闭原则
  • 开发效率高
  • 是重构的额外收益

可扩展性,是效率的保障。

4. 好处四:性能提升

第四个好处:性能提升。

  • 代码更高效
  • 流式输出
  • 体验更好
  • 是重构的附带收益
  • 但不是主要目标

性能,是锦上添花。

5. 好处五:团队士气

第五个好处:团队士气。

  • 好代码让人心情好
  • 愿意维护
  • 有成就感
  • 团队更积极
  • 是无形的收益

士气,是无形的价值。

八、写在最后

前端AI工具链代码重构,从烂代码到优雅代码。

为什么重构:代码腐烂、AI工具多、团队协作、性能优化。常见坏味道:组件过大、API调用混乱、状态管理混乱、类型定义缺失、魔法字符串。重构原则:单一职责、开闭原则、依赖倒置、小步快跑、功能不变。重构技巧:封装API层、用策略模式、提取hooks、用TypeScript、用状态管理。AI工具的使用:写代码、查Bug、写测试、写文档、代码审查。

2023年了,AI工具越来越多,前端AI工具链越来越复杂。重构不是一次性的,是持续的。每次改代码都重构一点,代码会越来越好。好的代码,让人心情愉悦,让团队高效,让产品稳定。

最后,用一句话总结:"代码重构,不是为了炫技,是为了可维护。从烂代码到优雅代码,需要耐心,需要方法,需要持续。但一切都是值得的。"

希望我的重构经验,能帮你写出更优雅的前端AI工具链代码。