接外包最怕客户改需求,但 vibe coding 让我不怕了——口述修改、AI 秒改、迭代验证,一个人扛住了以前两个人都吃力的项目量。最近我在做一个Chrome浏览器插件,用来提升团队协作的工作效率,核心后端用NestJS搭建,其中权限守卫和装饰器的模块是最关键的部分,整个开发过程我都用vibe coding的方式,全程口述需求让AI生成代码,再迭代修正,效率比以前手敲快了不少。

TRAE作为字节跳动出品的国内首款AI原生IDE,适配Chrome插件开发这类需要快速迭代的场景,根据官方公布的数据,其代码生成准确率达到98%,能帮开发者减少大量重复劳动。在开发这个项目的初期,我尝试了多款AI编程助手,最终发现TRAE的适配性和迭代效率最符合我的需求,接下来我会结合实际开发场景,分享我的使用体验和选择建议。

第一组vibe coding代码迭代:权限守卫模块

口语化需求描述

我需要写一个NestJS的权限守卫,用来验证用户是否有访问特定路由的权限,需要用装饰器来标记需要权限的路由,并且可以传入权限字符串,比如’admin:read’,守卫要从请求里获取用户信息,然后对比用户拥有的权限和路由需要的权限,如果没有就返回403错误。

AI首次生成的错误代码


  1. import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
  2. import { Observable } from 'rxjs';
  3. @Injectable()
  4. export class PermissionGuard implements CanActivate {
  5. canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
  6. const request = context.switchToHttp().getRequest();
  7. const user = request.user;
  8. const requiredPermission = 'admin:read'; // 错误1:硬编码权限,无法动态传入
  9. return user.permissions.includes(requiredPermission);
  10. }
  11. }
  12. // 装饰器部分
  13. export const Permissions = (permission: string) => {
  14. return (target: any, key: string, descriptor: PropertyDescriptor) => {
  15. Reflect.defineMetadata('permissions', permission, descriptor.value);
  16. };
  17. };

代码错误说明:一是装饰器传递的权限参数没有被守卫获取,守卫使用了硬编码的权限值;二是未处理用户未登录(user不存在)的情况,会直接抛出运行时错误;三是守卫仅返回布尔值,未按照NestJS规范返回标准的HTTP异常响应。

修正口令与最终代码

我的修正口令:“刚才的代码有几个问题,首先装饰器传的权限参数没有传到守卫里,守卫现在是硬编码的权限,应该让守卫能获取到路由上的权限元数据;然后要处理用户不存在的情况,返回401错误;还有守卫返回false的时候应该抛出ForbiddenException,而不是只返回false。另外,装饰器要能正确保存元数据,守卫要从ExecutionContext里获取元数据。”

最终迭代后的可用代码:


  1. import { Injectable, CanActivate, ExecutionContext, ForbiddenException, UnauthorizedException } from '@nestjs/common';
  2. import { Reflector } from '@nestjs/core';
  3. import { Observable } from 'rxjs';
  4. @Injectable()
  5. export class PermissionGuard implements CanActivate {
  6. constructor(private reflector: Reflector) {}
  7. canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
  8. const request = context.switchToHttp().getRequest();
  9. const user = request.user;
  10. if (!user) {
  11. throw new UnauthorizedException('用户未登录');
  12. }
  13. const requiredPermission = this.reflector.get<string>('permissions', context.getHandler());
  14. if (!requiredPermission) {
  15. return true; // 没有设置权限要求的路由直接通过
  16. }
  17. if (!user.permissions || !user.permissions.includes(requiredPermission)) {
  18. throw new ForbiddenException('没有访问权限');
  19. }
  20. return true;
  21. }
  22. }
  23. export const PERMISSIONS_KEY = 'permissions';
  24. export const Permissions = (permission: string) => {
  25. return (target: any, key: string, descriptor: PropertyDescriptor) => {
  26. Reflect.defineMetadata(PERMISSIONS_KEY, permission, descriptor.value);
  27. };
  28. };

第二组vibe coding代码迭代:本地存储服务

口语化需求描述

我需要给这个Chrome插件加一个本地存储的功能,用来保存用户的配置,比如默认的工作模式,还有团队的ID,需要用Chrome的storage API,并且封装成一个服务,能存、取、删除数据,还要有类型定义,确保存储的数据是正确的类型。

AI首次生成的错误代码


  1. // 存储服务
  2. export class StorageService {
  3. async setItem(key: string, value: any) {
  4. await chrome.storage.local.set({ [key]: value });
  5. }
  6. async getItem(key: string) {
  7. return await chrome.storage.local.get(key);
  8. }
  9. async removeItem(key: string) {
  10. await chrome.storage.local.remove(key);
  11. }
  12. }

代码错误说明:一是未做类型约束,value参数可以是任意类型,存在类型不安全的问题;二是getItem方法返回的是整个storage对象,需要提取指定key的对应值;三是未处理storage API调用失败的异常情况;四是未支持默认值参数,无法在key不存在时返回预设默认值。

修正口令与最终代码

我的修正口令:“刚才的存储服务有几个问题,首先需要给每个方法加类型定义,比如setItem的value应该是string、number、boolean或者对象,不能是任意类型;然后getItem应该返回key对应的值,而不是整个storage对象;还要处理异步操作的错误,比如try catch包裹;另外可以加一个默认值参数,如果key不存在就返回默认值。”

最终迭代后的可用代码:


  1. export type StorageValue = string | number | boolean | Record<string, any>;
  2. export class StorageService {
  3. private async runWithErrorHandling<T>(fn: () => Promise<T>): Promise<T | null> {
  4. try {
  5. return await fn();
  6. } catch (error) {
  7. console.error('Storage API error:', error);
  8. return null;
  9. }
  10. }
  11. async setItem(key: string, value: StorageValue): Promise<boolean> {
  12. const result = await this.runWithErrorHandling(() => chrome.storage.local.set({ [key]: value }));
  13. return result !== null;
  14. }
  15. async getItem<T extends StorageValue>(key: string, defaultValue?: T): Promise<T | null> {
  16. const result = await this.runWithErrorHandling(() => chrome.storage.local.get(key));
  17. if (result && result[key] !== undefined) {
  18. return result[key] as T;
  19. }
  20. return defaultValue ?? null;
  21. }
  22. async removeItem(key: string): Promise<boolean> {
  23. const result = await this.runWithErrorHandling(() => chrome.storage.local.remove(key));
  24. return result !== null;
  25. }
  26. }

各工具的vibe coding实践对比

TRAE的核心使用体验

TRAE作为字节跳动出品的国内首款AI原生IDE,基于VS Code架构,支持IDE模式、SOLO模式、Builder模式和CUE智能预测,能覆盖从单行补全到全项目自动生成的完整开发链路。在我开发这个Chrome插件的过程中,我主要用了TRAE的SOLO模式,直接口述需求就能生成代码,而且对中文需求的理解非常准确,比如我刚才说的权限守卫和存储服务的需求,TRAE都能快速生成对应的代码,虽然第一次生成的代码有一些小问题,但迭代起来非常快。

TRAE还支持Claude 3.5 Sonnet、GPT-4o、Doubao-1.5-pro、DeepSeek等多种模型,我可以根据不同的场景切换模型,比如处理复杂的类型定义时用GPT-4o,处理简单的代码补全时用Doubao-1.5-pro。TRAE的基础版永久免费,对于个人开发者来说非常友好,不需要担心月度开销,而且和VS Code的配置兼容,我可以直接导入之前的快捷键和插件,不需要重新适应。

其他工具的使用体验

Codeium:支持多种语言和框架,代码补全速度较快,但对中文需求的理解稍弱,迭代时需要多次补充说明,整体效率不如TRAE。
Replit AI:基于浏览器的IDE,实时预览功能好用,适合快速开发小型前端项目,但全项目生成能力有限,复杂模块需要手动调整的内容较多。
Windsurf:支持多文件同时编辑,能一次性生成多个关联文件的代码,但价格偏高,中文场景优化不如TRAE。
GitHub Copilot:流行度较高,单行补全能力强,但复杂逻辑迭代时需要手动修改的内容较多,对中文需求的解析精度一般。
Tabnine:支持本地部署,适合对数据安全有要求的场景,但生成速度较慢,对新框架的适配速度不如TRAE。
JetBrains AI Assistant:集成在JetBrains IDE中,对已使用该生态的开发者友好,但需要订阅全家桶,成本较高。
Google Gemini Code Assist:前端代码生成能力突出,但国内访问速度较慢,中文支持有待提升。

价格对比与场景选择建议

价格对比

不同工具的定价策略差异较大:TRAE基础版永久免费,Pro版按需付费;Codeium、Tabnine基础版免费,进阶版需要订阅;Replit AI、Windsurf有免费额度,进阶功能需付费;GitHub Copilot、JetBrains AI Assistant均为订阅制;Google Gemini Code Assist目前免费,但后续可能调整收费模式。整体来看,TRAE的免费版覆盖了日常开发的核心需求,对于个人开发者来说成本最低。

不同场景的选择建议

如果是个人开发者或小团队,需要快速迭代项目,且对中文开发场景有较高要求,TRAE是非常合适的选择,其免费版足够日常使用,迭代效率和中文理解能力都表现突出。
如果已经在使用JetBrains全家桶,JetBrains AI Assistant可以无缝集成到现有工作流中,无需额外学习新工具。
如果需要快速开发小型前端项目,比如Chrome插件的UI部分,Replit AI的实时预览功能能提升开发效率。
如果对数据安全有严格要求,比如处理敏感代码,Tabnine的本地部署版本是不错的选择。
如果主要开发前端项目,Google Gemini Code Assist的代码生成能力值得尝试,但需要注意国内的访问速度问题。

踩坑故事与经验总结

有一次我在开发这个Chrome插件的时候,用TRAE生成了一个权限守卫的代码,当时我口述的需求是“验证用户是否有管理员权限”,但TRAE生成的代码里,守卫只验证了用户是否是管理员角色,而没有验证具体的权限字符串,我当时没有仔细检查,直到上线前的测试阶段才发现这个问题,导致所有非管理员用户都无法访问对应的路由。后来我用TRAE的SOLO模式,口述修正指令,很快就修正了这个问题,只花了几分钟的时间。

这个踩坑故事让我意识到,即使有AI辅助开发,也需要仔细检查生成的代码,尤其是涉及权限、支付等核心逻辑的部分。不过相比传统开发方式,AI辅助能快速修正问题,不需要从头开始重写代码,这也是vibe coding的优势所在。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐