使用 Trae 进行代码优化

1. 前言

在开发中,我们经常遇到代码的性能、可复用等需要进行优化,这就需要一个对代码比较熟悉的人来完成,但是随着 AI 越来越完善,现在这些优化工作,我们可以交给 AI 来完成,我们只需要告诉它优化的内容,下边我以实例来说明。

2. 给缓存添加有效时间工具优化

优化前代码。

enum DefaultValidTime {
  DefaultTime = 'forever',
  __expiryTime__ = '__expiryTime__'
}
type Key = string
type ValidTime = DefaultValidTime.DefaultTime | number
type StorageData<T> = {
  value: T
  [DefaultValidTime.__expiryTime__]: ValidTime
}
type ValueData<T> = T | null
type Data<T> = {
  msg: string
  value: ValueData<T>
}
interface StorageClass {
  set: <T>(key: Key, value: T, validTime: ValidTime) => void
  get: <T>(key: Key) => Data<T>
  getValue: <T>(key: Key) => ValueData<T>
  remove: (key: Key) => void
  clear: () => void
}

export class UtilStorage implements StorageClass {
  set<T>(key: Key, value: T, validTime: ValidTime = DefaultValidTime.DefaultTime) {
    let expiryTime = validTime
    if (typeof validTime === 'number' && validTime > 0) {
      expiryTime = new Date().getTime() + validTime
    }
    let data:StorageData<T> = {
      value,
      [DefaultValidTime.__expiryTime__]: expiryTime
    }
    localStorage.setItem(key, JSON.stringify(data))
  }
  getValue<T>(key: Key): ValueData<T> {
    let res: Data<T> = this.get(key);
    return res.value;
  }
  get<T>(key: Key): Data<T> {
    const result = localStorage.getItem(key)
    if (result) {
      const data:StorageData<T> = JSON.parse(result)
      const expiryTime = data[DefaultValidTime.__expiryTime__]
      if (
        expiryTime === DefaultValidTime.DefaultTime ||
        (typeof expiryTime === 'number' && expiryTime > +new Date())
      ) {
        return {
          msg: 'success',
          value: data.value
        }
      }
      this.remove(key)
      return {
        msg: key + ' has expired.',
        value: null
      }
    } else {
      return {
        msg: `${key} not found in storage.`,
        value: null
      }
    }
  }
  remove(key: Key) {
    localStorage.removeItem(key)
  }
  clear() {
    localStorage.clear()
  }
}

2.1 优化方向

从缓存和从变量获取,那个更加节约性能?

输入图片说明

从它的回答我们可以看出,这个优化方向还是有一定的性价比,但是对于小数据量完全没必要,但是既然是工具,也尽量完善,万一后期其他人使用的时候需要到了呢?就像我之前开发一个微信小程序渲染人员列表,一下返回三万多条数据,接口慢不说,直接渲染到界面都要好几十秒,这些都是我们需要优化的,先做好可能出现的问题,避免问题的发生。

2.2 使用 WeakMap 进行优化

输入图片说明

输入图片说明

这里我们可以看到,直接让它进行优化,它使用的是 WeakMap,避免内存泄漏。但是随之问题也来了,就是我们存储的时候,key 其实是一个字符串,而 WeakMap 的 key 是弱引用。因此还需要告诉他对 key 进行处理。

2.3 优化 key 是字符串问题

依然使用 WeakMap,key是字符串得情况下如何优化。

输入图片说明

输入图片说明

2.4 优化后代码
// ... 其他代码保持不变 ...

export class UtilStorage implements StorageClass {
  private memoryCache = new WeakMap<object, StorageData<any>>();  // 使用 WeakMap
  private keyMap = new Map<Key, object>();  // 用于存储字符串 key 到对象的映射

  set<T>(key: Key, value: T, validTime: ValidTime = DefaultValidTime.DefaultTime) {
    let expiryTime = validTime;
    if (typeof validTime === 'number' && validTime > 0) {
      expiryTime = new Date().getTime() + validTime;
    }
    const data: StorageData<T> = {
      value,
      [DefaultValidTime.__expiryTime__]: expiryTime
    };

    // 获取或创建 key 对应的对象
    let keyObj = this.keyMap.get(key);
    if (!keyObj) {
      keyObj = {};
      this.keyMap.set(key, keyObj);
    }

    this.memoryCache.set(keyObj, data);  // 使用对象作为 WeakMap 的键
    localStorage.setItem(key, JSON.stringify(data));
  }

  get<T>(key: Key): Data<T> {
    const keyObj = this.keyMap.get(key);
    if (keyObj && this.memoryCache.has(keyObj)) {
      const data = this.memoryCache.get(keyObj)!;
      return this.checkExpiry(key, data);
    }

    const result = localStorage.getItem(key);
    if (result) {
      const data: StorageData<T> = JSON.parse(result);
      const keyObj = this.keyMap.get(key) || {};
      this.memoryCache.set(keyObj, data);
      this.keyMap.set(key, keyObj);
      return this.checkExpiry(key, data);
    }

    return {
      msg: `${key} not found in storage.`,
      value: null
    };
  }

  remove(key: Key) {
    const keyObj = this.keyMap.get(key);
    if (keyObj) {
      this.memoryCache.delete(keyObj);
    }
    this.keyMap.delete(key);
    localStorage.removeItem(key);
  }

  clear() {
    this.memoryCache = new WeakMap();
    this.keyMap.clear();
    localStorage.clear();
  }
}
2.5 总结
  1. 使用变量和缓存同时存储,在变量中存在时直接访问变量,这样使访问效率更高;
  2. 使用 WeakMap 避免了内存的泄露,但是 WeakMap 的 key 又必须是弱引用,key 又是字符串,因此将 key 处理成对象;
  3. 添加一个 Map 将传入的 key 处理成对象,存入到 Map 中;
  4. 当然这是它处理的结果,如果是我处理的话,直接在第二步就是使用 Map 进行处理,来管理缓存数据的访问。

3. 重复操作提取辅助函数

我之前使用 Trae 实现过一个工具【使用 Trae 的 Builder 模式实现【自动批量处理图片:添加地理位置和时间信息】脚本】,它里边的代码就存在一些重复操作的代码,但是它写了很多遍,因此我提取部分样例进行优化操作。

3.1 源码
    draw.text((left + shadow_offset, y_pos + shadow_offset), text_opts['date'], font=font, fill=shadow_color)
    draw.text((left + shadow_offset, y_pos + shadow_offset + (text_height + line_spacing)), text_opts['lat_lng'], font=font, fill=shadow_color)
    draw.text((left + shadow_offset, y_pos + shadow_offset + 2 * (text_height + line_spacing)), address, font=font, fill=shadow_color)
    
    # 绘制白色文本
    draw.text((left, y_pos), text_opts['date'], font=font, fill=text_color)
    y_pos += (text_height + line_spacing)
    draw.text((left, y_pos), text_opts['lat_lng'], font=font, fill=text_color)
    y_pos += (text_height + line_spacing)
    draw.text((left, y_pos), address, font=font, fill=text_color)

通过上边文字的绘制,我们可以看到它在绘制文本和绘制文本阴影其实差不多,但是相当于每一次的文本绘制它都写了两遍,因此我们对其进行优化处理。

3.2 提炼优化

对相同操作的代码进行提炼优化。

输入图片说明
输入图片说明

3.3 优化后代码
# ... existing code ...

def draw_text_with_shadow(draw, x, y, text, font, text_color, shadow_color, shadow_offset):
    # 绘制阴影
    draw.text((x + shadow_offset, y + shadow_offset), text, font=font, fill=shadow_color)
    # 绘制主文本
    draw.text((x, y), text, font=font, fill=text_color)

def add_text_to_image(image_path, out_path, out_image_path, text_opts):
    # ... existing code ...
    
    # 绘制带阴影的文本
    draw_text_with_shadow(draw, left, y_pos, text_opts['date'], font, text_color, shadow_color, shadow_offset)
    y_pos += (text_height + line_spacing)
    draw_text_with_shadow(draw, left, y_pos, text_opts['lat_lng'], font, text_color, shadow_color, shadow_offset)
    y_pos += (text_height + line_spacing)
    draw_text_with_shadow(draw, left, y_pos, address, font, text_color, shadow_color, shadow_offset)
    
    # ... existing code ...
3.4 总结
  1. 可以看到优化后,直接将绘制阴影和绘制文本放在了同一个函数,只是通过传入的参数,进行阴影和文本的不同绘制;
  2. 最后直接调用阴影和文本的统一绘制函数,只需要维护这一个函数的绘制,后期又其他改变,比如不需要阴影等,直接处理这个函数的代码,就不用每个文字的绘制都需要处理了。

4. 总结

  1. 当然类似的优化问题还有很多,比如首屏加载时间的优化、编译优化、打包优化、算法优化等等;
  2. 这些优化通过 AI 一个是能够给我提供给多的解决办法、一个有了优化方向,直接使用它来进行优化,能够减少我们大量的重复工作量;
  3. 就比如一个系统的弹窗UI优化,几十个弹窗,不同人开发的,遇到那种总是喜欢开发自己组件的人,你在优化的时候打死他的冲动都有,这会儿使用 AI 进行优化,就能大大提高你的效率,估计一周都搞不定的事情,现在你一天都可以完成。

5. 其他

当你改变不了这个世界的时候,你就只能跟着他完善自己,由于 AI 的完善,现在都是懵逼的,不知道该何去何从,始终处于迷茫中,现在除了学会使用它,我好像也没有更好的办法了。就比如我实现的【使用 Trae 的 Builder 模式实现【自动批量处理图片:添加地理位置和时间信息】脚本】工具,现在使用 Trae 完成,最多一早上就能完成,但是我之前写了一个类似的工具【【Python 实战】---- 批量对图片添加不同水印】,我记得当时差不多用了我下班时间的三四天。一个是你不熟悉,需要查询这个库的使用方法,要测试实现效果,实现后如果中间其他需求不满足,又需要还根据需求还其他库实现。但是现在 AI 直接都不需要你熟悉这些,它会直接给你实现出效果,你直接根据效果去不断的调试。效率提高了不是一点半点了,所以一度怀疑自己的工作没有什么用处,因为你学习超不过它,比如开发vscode 插件、谷歌浏览器插件、桌面应用等等,每一种都需要你去学习,这些都是需要成本的,但是现在不需要了,只需要你能大概看懂代码,知道问题可能在哪里,告诉它进行优化或者解决就可以。随着 AI 的最终成熟,可能都不需要我们这些一线代码人员了,只需要一个产品,能够给他描述清楚需求,然后有个维护代码的开发人员,能够定位问题就是了。那么我们能够干什么呢?目前我还没找到答案。

<think>好的,我现在需要帮助用户找到关于如何在Trae中调试代码的方法或指南。首先,用户提到了引用2、3、4,我需要仔细查看这些引用内容,看看是否有相关的调试信息。 引用2中提到Trae国内版提供了调试与预览的Webview功能,还提到在编辑代码时可以随时调用Chat模式或Builder模式获取帮助。这可能意味着用户可以通过这些模式进行调试,或者在Webview中预览效果。此外,引用2还提到代码更新与应用时,Trae会显示原始代码优化后的代码对比,开发者可以选择接受或拒绝,这可能涉及到调试过程中的代码调整。 引用3提到Trae支持智能优化,包括自动依赖安装与调试,这说明调试可能是其内置功能之一。同时,引用3还提到多端支持和实时预览,可能在调试时可以通过实时预览来查看代码运行效果。 引用4指出Trae支持免费使用gpt-4o和claude-3.5-sonnet,可能用户可以通过AI助手来帮助调试代码,例如询问错误信息或寻求修复建议。 接下来,我需要将这些信息整合成一个清晰的步骤指南。首先,调试可能包括使用内置的Webview预览、利用AI助手进行问题查询、代码对比优化以及实时预览功能。同时,快捷键调用Chat模式可能是一个重要的步骤,用户可以通过输入问题来获取调试帮助。 还需要考虑用户可能需要具体的示例,比如如何调试一个具体的函数或错误,这时候可以建议他们使用Chat模式输入错误信息,获取解决方案。另外,实时预览可能在Web开发中特别有用,用户修改代码后立即看到效果,从而快速定位问题。 需要注意的是,引用中没有提到传统的断点调试或逐行执行,因此可能Trae的调试方法更依赖AI辅助和实时预览。因此,在回答中应强调这些方面,并建议用户如何利用现有功能进行调试。 最后,生成相关问题时要围绕调试方法、工具支持、AI辅助调试以及与其他工具的比较等方面展开,确保覆盖用户可能关心的其他方面。</think>[用户可见层] ### 如何调试 Trae 代码的详细指南 #### 一、调试方法及工具 1. **Webview 实时预览调试** Trae 国内版提供内置的 Webview 功能,可直接预览代码运行效果。修改代码后,点击界面右上角的 **“预览”** 按钮或使用快捷键 `Ctrl + P`(Windows)/ `Command + P`(macOS),即可实时查看修改后的效果[^2]。 2. **AI 辅助调试** - 通过 `Chat 模式` 输入错误描述(例如:“函数返回 undefined 如何解决?”),AI 会分析代码并提供修复建议[^1][^4]。 - 示例: ```python # 输入问题:为什么这段循环无法终止? for i in range(10): print(i) # 忘记递增 i ``` Trae 会提示缺少 `i += 1` 并生成修正代码[^3]。 3. **代码对比优化** 当 AI 生成优化建议时,界面会 **分屏显示原始代码优化代码**,开发者可逐行对比差异,选择接受或拒绝修改。 #### 二、操作流程示例(以 JavaScript 为例) 1. **编写代码时触发错误** ```javascript function sum(a, b) { return a + c; // 未定义变量 c } ``` 2. **调用调试帮助** - 快捷键打开 Chat 模式:`Ctrl + I`(Windows)/ `Command + I`(macOS) - 输入:“为什么 sum(2,3) 报错 'c is not defined'?” 3. **获取 AI 反馈** Trae 会返回: ```markdown 错误原因:变量 c 未定义 建议修改为: function sum(a, b) { return a + b; } ``` #### 三、高级调试技巧 - **依赖自动安装**:当代码缺少库时,Trae 会提示 `npm install <package>` 命令并自动执行 - **多端调试**:在 H5/小程序项目中,使用 **设备模拟器** 切换不同屏幕尺寸测试布局 - **性能分析**:输入指令如“如何优化这段递归算法?”,AI 会提供时间复杂度分析和改进方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rattenking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值