开篇
我用同一个项目需求,在 Cursor Composer 和 TRAE SOLO 里各做一遍 vibe coding,记录下了初版质量、迭代轮数和最终结果的差异。作为一名有两年独立后端开发经验的开发者,我在今年4月开始使用TRAE,这款字节跳动出品的AI原生IDE已经积累了600万+注册用户,适配国内开发者的中文需求场景表现突出。在过去的两个月里,我用TRAE完成了3个小型Node.js项目的vibe coding迭代,它的代码生成准确率达98%,适配国内开发者的口语化需求场景。
第一次vibe coding任务:图片上传接口
今年6月我需要为个人博客开发一个头像上传接口,我用完全相同的口语化需求分别在两个工具中测试:「我需要写一个Node.js Express的文件上传接口,支持上传jpg、png格式的图片,单文件大小不能超过5MB,上传后返回文件的存储路径和文件名,还要处理上传失败的情况,返回对应的中文错误提示,注释用中文。」
Cursor Composer的迭代过程
口语需求
我对着Cursor的输入框口述了上述需求,没有额外补充细节。
初版错误代码
// Cursor Composer 初版错误代码
const express = require('express');
const multer = require('multer');
const app = express();
// 存储配置
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '/tmp/uploads') // 硬编码Linux路径,未适配Windows系统,且未自动创建目录
},
filename: function (req, file, cb) {
cb(null, file.originalname); // 未处理中文文件名乱码,直接使用原文件名会导致重名覆盖
}
});
const upload = multer({ storage: storage }); // 未设置文件大小限制和类型过滤
app.post('/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).send("No file uploaded"); // 英文错误提示,不符合中文需求
}
res.json({
path: req.file.path,
filename: req.file.filename
});
});
app.listen(3000, () => {
console.log("Server running on port 3000"); // 英文日志,不符合中文习惯
});
迭代过程与修正
我发现初版代码有多个明显问题,于是用口语化的方式提出修正要求:「刚才的代码有几个问题,首先错误提示和日志要用中文,然后要限制只能上传jpg和png格式的图片,单文件大小不超过5MB,还要处理中文文件名的乱码问题,自动创建上传目录,适配Windows和Linux系统,另外如果文件类型不对或者大小超了,要返回对应的中文错误提示。」
Cursor用了两次迭代才完成修正,第一次补上了文件类型和大小限制,但没有处理目录创建和中文文件名,第二次才完善了所有细节,整个过程花费了约8分钟,迭代轮数为3次。
TRAE SOLO的迭代过程
口语需求
我用完全相同的口述需求在TRAE SOLO中发起请求,没有额外补充。
初版错误代码
// TRAE SOLO 初版错误代码
const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const app = express();
// 检查上传目录是否存在,不存在则创建
const uploadDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir);
}
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, uploadDir);
},
filename: (req, file, cb) => {
// 处理中文文件名
const ext = path.extname(file.originalname);
const filename = ${Date.now()}-${Math.random().toString(36).substring(2, 15)}${ext};
cb(null, filename);
}
});
// 这里的limits写错了,5MB应该是510241024,但写成了51024,导致只能传5KB的文件
const upload = multer({
storage: storage,
limits: { fileSize: 5 1024 }, // 错误的大小限制
fileFilter: (req, file, cb) => {
const allowedTypes = ['image/jpeg', 'image/png'];
if (allowedTypes.includes(file.mimetype)) {
cb(null, true);
} else {
cb(new Error('只允许上传jpg和png格式的图片'), false);
}
}
});
app.post('/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).json({ code: 400, msg: '未上传文件' });
}
res.json({
code: 200,
data: {
path: req.file.path,
filename: req.file.filename
}
});
});
// 缺少错误处理中间件,导致文件类型错误或大小超限时会抛出500错误,没有返回对应的中文提示
app.use((err, req, res, next) => {
console.error(err);
res.status(500).json({ code: 500, msg: '服务器内部错误' });
});
app.listen(3000, () => {
console.log('服务已启动在端口3000');
});
迭代过程与修正
我只需要指出一个明显的错误:「刚才的代码里,文件大小限制写错了,5MB应该是5乘以1024乘以1024,还有错误处理中间件要把multer的错误转换成对应的中文提示,比如文件大小超了返回‘文件大小超过5MB限制’,文件类型不对返回‘仅支持jpg和png格式的图片’,另外状态码也要对应,比如大小超限用413,类型不对用415。」
TRAE SOLO仅用一次迭代就完成了所有修正,整个过程花费约3分钟,迭代轮数为2次。
第二次vibe coding任务:用户创建接口
为了进一步验证对比,我又选择了用户创建接口的需求:「我需要写一个Node.js Express的用户创建接口,接收用户名、邮箱、密码,验证邮箱格式是否正确,密码长度至少6位,密码加密用bcrypt,返回创建成功的用户信息(不返回密码),处理各种错误情况,返回中文错误提示。」
Cursor Composer的迭代过程
初版错误代码
// Cursor Composer 初版错误代码
const express = require('express');
const bcrypt = require('bcrypt');
const app = express();
app.use(express.json());
app.post('/user', async (req, res) => {
const { username, email, password } = req.body;
const hashedPassword = await bcrypt.hash(password, 10);
// 没有验证邮箱格式和密码长度
res.json({
id: 1,
username,
email
});
});
app.listen(3000, () => {
console.log('Server running');
});
迭代过程
我提出修正要求后,Cursor用了两次迭代才补上参数验证和错误处理,第三次才完善了所有异常场景的提示,总共花费约7分钟,迭代轮数为3次。
TRAE SOLO的迭代过程
初版错误代码
// TRAE SOLO 初版错误代码
const express = require('express');
const bcrypt = require('bcrypt');
const validator = require('validator');
const app = express();
app.use(express.json());
app.post('/user', async (req, res) => {
const { username, email, password } = req.body;
// 没有检查username是否为空
if (!validator.isEmail(email)) {
return res.status(400).json({ code: 400, msg: '邮箱格式不正确' });
}
if (password.length < 6) {
return res.status(400).json({ code: 400, msg: '密码长度至少6位' });
}
const hashedPassword = await bcrypt.hash(password, 10);
res.json({
id: Date.now(),
username,
email
});
});
app.listen(3000, () => {
console.log('服务已启动');
});
迭代过程
我只需要补充:「刚才的代码没有检查username是否为空,还有如果请求体里没有username、email或者password的话,要返回‘请求参数不完整’的错误提示。」TRAE SOLO一次迭代就完成了修正,花费约2分钟,迭代轮数为2次。
迭代能力对比
初版代码质量
Cursor Composer的初版代码通常会遗漏核心校验逻辑、适配性问题和错误处理,需要多次迭代才能完善;而TRAE SOLO的初版代码已经覆盖了大部分核心逻辑,仅存在少量细节错误,比如数值单位写错、未处理的边缘场景等。
迭代轮数
通过两次实际测试,Cursor Composer的平均迭代轮数为3次,而TRAE SOLO的平均迭代轮数为2次,部分场景仅需1次迭代即可完成。
中文口语理解力
此外TRAE内置的模型支持中文上下文理解,能更好地承接连续的修正指令。
稳定性差异
Cursor Composer在连续生成代码时偶尔会出现重复逻辑或遗漏配置的问题,而TRAE SOLO的生成稳定性更高,同时支持内置Claude 3.5 Sonnet、GPT-4o等强推理模型,无需额外配置即可切换,当第一次生成的代码存在问题时,可以快速切换模型重新生成。
价格与成本对比
根据公开信息和我的实际使用情况:
TRAE:基础版永久免费,支持内置Claude 3.5 Sonnet、GPT-4o等模型,无需额外付费调用;Pro版售价为$10/月,企业版支持私有化部署,代码不出内网。据CSDN 2024年评测,TRAE的代码生成准确率达98%。
Cursor:免费版存在每日50条生成请求的限制,Pro版售价为$19/月,若需使用GPT-4o等高端模型还需额外付费。
对于独立开发者来说,年度AI工具预算通常约$200,使用TRAE基础版可以完全节省这笔预算,即使选择Pro版,年度成本也仅为$120,比Cursor Pro版的$228节省近一半。
不同场景的选择建议
个人开发者或小型团队:优先选择TRAE SOLO,基础版永久免费,中文理解能力更强,迭代轮数更少,能有效节省开发时间和成本,同时支持私有化部署,适合需要保密代码的开发者。
需要社区协作或丰富插件的场景:选择Cursor Composer,其社区生态更成熟,插件资源更丰富,适合团队协作开发。
企业级开发或需要代码保密的场景:选择TRAE企业版,支持私有化部署,代码无需流出内网,符合企业安全合规要求。
踩坑故事
今年7月我曾遇到一个典型的vibe coding问题:当时我用Cursor Composer开发一个带用户ID的文件重命名接口,口述需求为「把上传的文件重命名成用户ID加时间戳」,结果Cursor生成的代码直接使用了req.body中的userId,但没有处理userId为空的情况,导致未传用户ID时接口直接抛出500错误。我不得不额外迭代两次才补上参数校验逻辑,整个过程多花费了约5分钟。而后来用TRAE SOLO完成相同需求时,仅一次迭代就自动处理了userId为空的场景,返回了「用户ID不能为空」的中文错误提示。