用了两个月Cursor和Claude Code CLI,发现它们根本不是竞品
Cursor IDE vs Claude Code CLI: 柏林开发者的深度测评 ☕
TL;DR: 我在两个AI编程工具之间纠结了两个月,用同一个项目做了对比测试。Cursor的自动补全让我少写了40%的代码,但Claude Code CLI在复杂重构任务中赢了——它一次性把一个120行的Express路由拆成了三个文件,而且没引入bug。选哪个?看你的工作流。
那个让我熬夜的bug 🔥
上周二凌晨1点,我在写一个NestJS微服务的认证中间件。咖啡已经凉了,我的大脑也差不多。
问题是个典型的JWT验证逻辑——token过期时应该返回401,但它一直在抛500。我盯着屏幕,手指停在键盘上,完全不知道从哪改起。
然后我想:"让AI试试吧。"
// 这个中间件快把我搞疯了
async function authMiddleware(req, res, next) {
try {
const token = req.headers.authorization?.split(' ')[1];
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
// 这里有三个嵌套的if判断token过期的不同情况
// 我承认写得一团糟...
res.status(500).json({ message: 'Auth failed' });
}
}这就是我同时打开Cursor和Claude Code CLI的开始。过去两个月,我在柏林的一个side project里来回切换这两个工具,今天想分享真实的体验对比。
实际上,等等——我应该先说一下版本。Cursor我用的是0.42.3,Claude Code CLI是2024年12月的那个版本。因为AI工具更新太快了,可能你读到这篇文章的时候已经变了。
场景1:日常编码的自动补全 💡
Cursor IDE
Cursor的Tab补全快得像闪电。
不夸张。我在写React组件时,它经常猜到我想要什么:
// 我只输入了前三个字母,Cursor补全了整个组件
const UserProfile = ({ userId }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetchUser(userId).then(data => {
setUser(data);
setLoading(false);
});
}, [userId]);
// ... 连loading状态都自动加了说实话,一开始我觉得这功能有点烦人——它总是跳出来打断思路。那种感觉就像有人在旁边一直插话。
但一周后我发现自己离不开它了。
数据说话:我在一个Next.js项目里统计了三天,Cursor的补全让我少敲了大约40%的代码。特别是那些重复性的样板代码(form handling、API calls、error states),基本Tab两下就完事。
不过有个问题。有时候它补全的代码看着特别合理,但跑起来就报错。上周它给我补了个useEffect依赖项,结果漏了一个关键的state变量。花了20分钟debug。
Claude Code CLI
这里有个残酷的现实——Claude Code CLI没有自动补全。它是终端里的对话工具,你需要主动输入问题。
我一开始觉得这太原始了。2025年了,命令行?
但用了两周后...好吧,它的优势在哪?上下文理解。有一次我在终端里贴了150行代码问:"这个支付流程有什么安全隐患?"它指出了三个我完全没考虑到的问题,包括一个竞态条件。我当时就想:卧槽,还好没上线。
场景2:复杂重构大对决 🚀
回到那个凌晨的JWT中间件。我先试了Cursor:
Cursor的做法:
- 选中代码,Ctrl+K,输入"fix error handling"
- 它改了几行,把500改成了401
- 但没解决根本问题——代码结构还是那团意大利面
其实也不能怪它。我可能prompt写得不够好。
Claude Code CLI的做法:
- 我输入:"分析这个中间件的问题并重构它"
- 它不仅解释了问题(错误处理逻辑混乱、缺少token过期判断),还给出了完整方案
- 更关键的是,它建议拆分成三个小函数:`extractToken`、`verifyAndDecode`、`attachUser`
// Claude Code CLI重构后的版本
const extractToken = (header: string): string => {
if (!header?.startsWith('Bearer ')) {
throw new AuthError('Invalid header format', 401);
}
return header.split(' ')[1];
};
const verifyAndDecode = (token: string): UserPayload => {
try {
return jwt.verify(token, process.env.JWT_SECRET) as UserPayload;
} catch (error) {
if (error instanceof TokenExpiredError) {
throw new AuthError('Token expired', 401);
}
throw new AuthError('Invalid token', 401);
}
};
// 主中间件变成了优雅的管道
async function authMiddleware(req, res, next) {
try {
const token = extractToken(req.headers.authorization);
req.user = verifyAndDecode(token);
next();
} catch (error) {
res.status(error.statusCode || 401).json({
message: error.message
});
}
}这次经历让我意识到:Cursor擅长"小步快跑"的修改,Claude Code CLI更擅长"停下来思考"的任务。
虽然...嗯,有时候Claude Code CLI也会过度设计。有次它建议我把一个简单的CRUD拆成7个文件,我直接拒绝了。你懂的,有时候AI就是太认真。
实际项目数据对比
我用同一个Express + React项目做了两周的AB测试:
- **代码生成速度:** Cursor快3-5倍(自动补全的魔法)
- **重构准确率:** Claude Code CLI高出约20%(尤其涉及多个文件时)
- **Bug引入率:** Cursor有时会"自信地犯错"——它补全的代码看起来没问题,但逻辑有漏洞。这个真的烦
- **学习曲线:** Cursor 5分钟上手,Claude Code CLI需要适应命令行交互
最让我印象深刻的是,Claude Code CLI在处理数据库迁移时,自动生成了rollback脚本。我完全忘了这回事,它提醒了我——这可能救了生产环境一命。
其实也不一定。我们生产环境有备份。但你知道那种后怕的感觉吗?
柏林咖啡店的真实场景 ☕
在柏林做开发有个特点:很多咖啡馆WiFi不稳定。
这就引出了一个关键差异:离线或弱网环境下,Cursor的补全功能会卡顿。 有次在Kreuzberg的Five Elephant咖啡馆,网络断断续续,Cursor的AI功能时灵时不灵。我坐在那里狂按Tab,什么都没发生。尴尬。
而Claude Code CLI?它本来就是异步的对话模式,网络波动影响小很多。当然,还是需要联网。不过至少不会在你写代码写到一半的时候突然装死。
哦对了,如果你也在柏林,Brammibal's Donuts的WiFi稳定多了。而且他们的vegan donuts意外地好吃。跑题了。
我的选择(和你的可能不同)
经过两个月的对比,我的工作流变成了这样:
- **日常编码:** Cursor IDE(自动补全太香了)
- **架构设计/重构:** 切到终端用Claude Code CLI
- **Code Review:** 两个都用,对比建议
- **写文档/测试:** Claude Code CLI更靠谱
如果你主要做前端开发、写CRUD、改UI——选Cursor。它的补全会让你的编码速度快得飞起。
如果你经常做架构重构、处理复杂业务逻辑、或者需要深度代码分析——Claude Code CLI更合适。它的"思考深度"明显更高。
但说实话,我现在两个都在付费。一个月加起来40刀左右。值不值?我觉得值。但如果你预算有限,先从Cursor开始吧。
最后的坦白
我花了3个小时才搞明白一件事:这两个工具不是竞争关系,是互补的。
就像你不会只用一种咖啡壶——意式浓缩用摩卡壶,手冲用V60,赶时间用胶囊机。AI编程工具也一样,不同场景用不同的。
对了,那个JWT的bug?Claude Code CLI 5分钟就帮我搞定了。但我不能说它多聪明,因为我先花了2小时在StackOverflow上找答案...
还有件事我没说。有时候我会担心这些工具让我变懒。以前遇到bug我会认真读源码,现在第一反应是问AI。不知道这是好事还是坏事。
你在用什么AI编程工具?有没有遇到过AI写出看似正确但暗藏bug的代码?评论区聊聊!☕
#ai #webdev #programming #productivity #javascript
读者评论 4