What did Trea work help me with in this optimization process

What did Trea work help me with in this optimization process

1、认识 Trae Work

**官网地址

**www.trae.cn/work?utm_so...

Trae Work在项目抽离重构时

  1. 一眼揪出重复代码:以前各个页面里到处都是复制粘贴的请求代码,它一下就能帮我找出来,告诉我这些能提出来复用。
  2. 教我怎么分层才清爽:以前抽代码就是简单剪切粘贴,它教我按规矩来,把请求的、转数据的、管业务的分开放,代码一下就不乱了。
  3. 防手抖改出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 就舒服了:

  1. 再也不怕类名重名打架:Tailwind 那些原子类直接写 html 上,哪用哪写,绝不污染全局。
  2. 写代码不用来回翻文件:以前写个标签还得切到 css 文件写样式,现在样式和结构写一块,一屏看完,爽。
  3. 常用的样式攒起来当组件用 :有些按钮样式老用,用 @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、总结

排名如下:

  1. 第一位:必须是把重复逻辑换成通用函数(比如 CRUD 封装) 。这个收益最大!原来十个页面写十遍的代码,现在只写一遍,以后改接口只改一个地方就行,省事还不容易出错。
  2. 第二位:把传统 CSS 换成 Tailwind CSS。样式直接写在结构上,不用再想类名、不用来回切文件,开发速度直接起飞,而且打包体积还小。
  3. 第三位:把散落的常量和配置换成统一枚举/字典。比如状态值、下拉框选项,以前哪用哪写死,现在全提出来放一块,后端改个码,前端只改一处就全站生效。
相关推荐
XuCoder1 小时前
面试官:什么是覆盖索引?
后端
一拳不是超人1 小时前
被 Tauri「体积小」种草后,我拿它做了个本地 AI 桌面工具,然后踩了这些坑
前端·架构
Asize1 小时前
3 种设计模式 + DI:Nest.js 后端第一课
后端·设计模式·nestjs
程序员cxuan1 小时前
一招教你在 Codex 中开启 1M 上下文
人工智能·后端·程序员
hyf3266331 小时前
高收益玩法:站群泛程序结合本地服务引流变现全流程
运维·服务器·前端·搜索引擎·蜘蛛池
IT_陈寒2 小时前
Vite热更新失效?八成是这个配置在搞鬼
前端·人工智能·后端
qq_22589174662 小时前
基于Flask的空气质量监测与预测分析系统
开发语言·后端·python·信息可视化·django·flask
恋猫de小郭2 小时前
社区版 Dart macros?一个可以解决 JSON 序列化的Fluter “宏编程”第三方包
android·前端·flutter
覆东流2 小时前
4.Java运算符与表达式
java·开发语言·后端