What did Trea work help me with in this optimization process
1、认识 Trae Work
**官网地址
Trae Work在项目抽离重构时
- 一眼揪出重复代码:以前各个页面里到处都是复制粘贴的请求代码,它一下就能帮我找出来,告诉我这些能提出来复用。
- 教我怎么分层才清爽:以前抽代码就是简单剪切粘贴,它教我按规矩来,把请求的、转数据的、管业务的分开放,代码一下就不乱了。
- 防手抖改出Bug:抽代码最怕改漏了或者类型对不上,它帮我把关,保证提出来前后的用法和返回数据一模一样,改完心里不慌。

2、前端(CRUD)提取
每个页面都要写增删改查,太啰嗦了。用泛型搞个"工厂函数",以后不管什么模块,传个地址进去,直接就能用。
2.1 先把请求本身包一下
统一处理发请求、拿数据、报错这些破事:
javascript
import axios, { AxiosInstance, AxiosResponse } from 'axios';
const service: AxiosInstance = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 10000,
});
// 统一处理后端返回的数据格式
service.interceptors.response.use(
(response: AxiosResponse) => {
const { code, data, message } = response.data;
if (code === 200) return data; // 拿到真数据
return Promise.reject(new Error(message)); // 报错
},
(error) => Promise.reject(error)
);
2.2 搞个通用的增删改查"造函数"
用泛型 T(数据长啥样)和 Q(查询条件长啥样),一把梭写全:
typescript
import service from './instance';
export function createCrudService<T, Q>(baseUrl: string) {
// 查列表
const fetchList = async (params?: Q): Promise<{ list: T[]; total: number }> => {
return service.get(`${baseUrl}/list`, { params });
};
// 查详情
const fetchDetail = async (id: number | string): Promise<T> => {
return service.get(`${baseUrl}/${id}`);
};
// 新增
const createItem = async (data: Partial<T>): Promise<T> => {
return service.post(`${baseUrl}`, data);
};
// 修改
const updateItem = async (id: number | string, data: Partial<T>): Promise<T> => {
return service.put(`${baseUrl}/${id}`, data);
};
// 删除
const deleteItem = async (id: number | string): Promise<void> => {
return service.delete(`${baseUrl}/${id}`);
};
return { fetchList, fetchDetail, createItem, updateItem, deleteItem };
}
2.3 业务里用起来超爽
几行代码就搞定一个模块的接口,还有类型提示:
typescript
interface User { id: number; name: string; role: string; }
interface UserQuery { page: number; pageSize: number; name?: string; }
// 一行代码生成用户模块的接口
export const userService = createCrudService<User, UserQuery>('/api/user');
// 页面里直接调
async function operate() {
const res = await userService.fetchList({ page: 1, pageSize: 10 }); // 查
await userService.createItem({ name: 'Test', role: 'admin' }); // 增
await userService.updateItem(1, { role: 'user' }); // 改
await userService.deleteItem(1); // 删
}
3、CSS 转 Tailwind CSS
除了JS逻辑,样式写法也得升级。以前一堆 .btn-primary、.card 写在 css 文件里,又怕重名又怕冲突。换成 Tailwind 就舒服了:
- 再也不怕类名重名打架:Tailwind 那些原子类直接写 html 上,哪用哪写,绝不污染全局。
- 写代码不用来回翻文件:以前写个标签还得切到 css 文件写样式,现在样式和结构写一块,一屏看完,爽。
- 常用的样式攒起来当组件用 :有些按钮样式老用,用
@apply提出来,就成了咱们自己团队的标准样式库。
3.1 把常用的样式抽成工具类(@apply)
以前写个主按钮得写一长串:
css
/* 旧代码:普通 CSS */
.btn-primary {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.5rem 1.5rem;
background-color: #3b82f6;
color: #ffffff;
border-radius: 0.375rem;
box-shadow: 0 4px 6px -1px rgba(59, 130, 246, 0.5);
transition: all 0.15s ease;
}
用 Tailwind 的 @apply 提出来,又短又好记:
less
/* 新代码:tailwind.css 里抽出来 */
@layer utilities {
.btn-primary {
@apply inline-flex items-center justify-center
px-6 py-2 bg-blue-500 text-white rounded-md
shadow-md shadow-blue-500/50
transition-all duration-150 ease-in-out
hover:bg-blue-600 active:scale-95;
}
}
3.2 页面里直接用
抽完之后,直接写类名就行,不用再开新 css 文件了:
javascript
export default function SubmitButton() {
return <button className="btn-primary">提交</button>;
}
不常用的直接写原子类,彻底告别 css 文件:
javascript
export default function UserCard({ name }: { name: string }) {
return (
<div className="flex items-center p-4 bg-white rounded-lg shadow-sm border border-gray-100 hover:shadow-md transition-shadow">
<span className="text-sm font-medium text-gray-800">{name}</span>
</div>
);
}
4、总结
排名如下:
- 第一位:必须是把重复逻辑换成通用函数(比如 CRUD 封装) 。这个收益最大!原来十个页面写十遍的代码,现在只写一遍,以后改接口只改一个地方就行,省事还不容易出错。
- 第二位:把传统 CSS 换成 Tailwind CSS。样式直接写在结构上,不用再想类名、不用来回切文件,开发速度直接起飞,而且打包体积还小。
- 第三位:把散落的常量和配置换成统一枚举/字典。比如状态值、下拉框选项,以前哪用哪写死,现在全提出来放一块,后端改个码,前端只改一处就全站生效。