我用 Cursor 写了两个月代码,项目代码量不降反升,为什么?

两个月前,我满怀期待地把主力开发工具切换成了 Cursor。原本以为:

"AI 来写代码,我来专注业务,代码量自然会下降。"

结果------代码行数不仅没变少,反而暴涨了一倍,我整个人都惊了。


用 Cursor 写代码,爽是真爽

Cursor 就像一个代码小助手,随传随到、任劳任怨。

比如我只写了这么一段需求注释:

typescript 复制代码
// 上传文件,失败重试 3 次,并显示进度条

Cursor 自动补全了整个函数,附带封装好了异常处理和进度更新,还贴心地生成了一个上传状态的 useUploadStatus hook,顺手还补了测试。

我一看,忍不住点了个 👍,直接复制粘贴进项目:

typescript 复制代码
export const useUploadStatus = () => {
  const [progress, setProgress] = useState(0)
  const [status, setStatus] = useState<'idle' | 'uploading' | 'success' | 'error'>('idle')
  return { progress, status, setProgress, setStatus }
}

然后是上传逻辑:

typescript 复制代码
export const uploadFile = async (file: File, onProgress: (p: number) => void) => {
  let attempts = 0
  const maxRetries = 3
  while (attempts < maxRetries) {
    try {
      const res = await uploadToServer(file, onProgress)
      return res
    } catch (err) {
      attempts++
      if (attempts >= maxRetries) throw err
    }
  }
}

第一次看到 Cursor 自动写出这些,我真的怀疑它是不是我未来的合伙人。


三天之后:我看着 14 个 utils 文件开始头疼

"上传功能"从一段 20 行的函数,演变成:

  • uploadFile.ts
  • useUploadStatus.ts
  • retry.ts
  • uploadError.ts
  • useThrottleProgress.ts
  • UploadConfig.ts
  • UploadTest.spec.ts

Cursor 每次帮我写代码,都"顺手"搞个封装、"顺手"提个公用逻辑。

久而久之,每个功能都能拆成 N 个文件,整个项目像微服务一样松散


Cursor 写代码太"认真",不是你说多少,它写多少

我写了这一行提示:

typescript 复制代码
// 登录失败后提示错误,跳转到登录页

结果 Cursor 写成了这样:

typescript 复制代码
if (!isAuthenticated) {
  showToast('登录已过期,请重新登录')
  router.replace('/login')
}

正常。

但它还写了一个"自动登录逻辑":

typescript 复制代码
const autoLogin = async () => {
  const savedToken = localStorage.getItem('token')
  if (savedToken) {
    const isValid = await validateToken(savedToken)
    if (isValid) {
      setToken(savedToken)
      return true
    }
  }
  return false
}

还配了个 useAuth hook,再带了一个 AuthProvider 组件,还提议我在入口加个 <AuthGuard>

我看着这些代码的心情是这样的:

"......兄弟,我只是想跳个转,没让你开发一个鉴权系统啊。"


问题的根本:Cursor 不知道你项目的"轻重缓急"

人类程序员是会做"场景判断"的:

  • 这个项目 MVP 阶段,能跑就行;
  • 这个模块未来不会复用,就别封装了;
  • 这个 feature 下周就要砍掉,不要测了。

而 Cursor 没有"轻重缓急"的概念,它只会按**"最稳妥方式"**写代码。

你说登录,它给你写认证中间件;

你说表单,它帮你做 schema 验证和字段格式化;

你说请求,它直接带 token、缓存、错误上报全配套。

你没说不需要,它就默认你全都要。


项目代码变多之后,改动也变难了

以前我写个上传功能,只改一个文件。

现在要:

  1. 改上传逻辑?uploadFile.ts
  2. 改上传状态?useUploadStatus.ts
  3. 改进度条显示?useThrottleProgress.ts
  4. 还有 UploadError.ts 可能也得动

写的时候优雅,改的时候疯狂找引用。连我自己都开始找不到某些逻辑在哪封装了。

而且有个特别尴尬的地方:

我不知道这段代码是不是我自己写的。

有时候看一段函数结构奇特、变量命名清晰,我一脸问号:

"这真是我写的?还是 Cursor 帮我写的?"


后来我调整了写法:少让 Cursor 自由发挥

✅ 改法 1:先写结构,Cursor 补细节

我现在都习惯这样写:

typescript 复制代码
export const login = async (username: string, password: string) => {
  // TODO: 发送请求,成功后保存 token
}

然后选中 TODO 这段,让 Cursor 来补。这样它不会擅自添加其它逻辑。


✅ 改法 2:提示里加限制

直接说:

typescript 复制代码
// 不需要封装 hook,只用基础写法
// 不需要类型优化,也不需要加错误类型

加一句限制,Cursor 立马收敛。


✅ 改法 3:生成后手动删,保留"精简版"

现在我每次用完 Cursor,第一步不是测试,而是删代码

比如它帮我写了 5 个文件,我会思考:

  • 哪些是"AI 凑字数"的?
  • 哪些是当前阶段不必要的抽象?
  • 有没有"为封装而封装"的 utils?

删完再提 PR,反而更利索。


Cursor 的问题不是技术,是"没有分寸感"🙂

AI 写代码的问题,不在于它写得不好,而是写得太好,太多,太过了。

它能写出全套最佳实践代码,但项目不需要。

它能封装出泛用 hook,但业务没复用需求。

它能自动生成注释、类型、测试,但维护起来很重。

项目代码多,不代表代码质量高;AI 高产,也不等于团队高效。

你们怎么看?😄

📌 你可以继续看我的《为什么》系列文章

相关推荐
依旧天真无邪2 分钟前
Chrome 优质插件计划
前端·chrome
逝缘~14 分钟前
小白学Pinia状态管理
前端·javascript·vue.js·vscode·es6·pinia
光影少年16 分钟前
vite原理
前端·javascript·vue.js
陌上烟雨寒23 分钟前
vue手写一个步骤条steps
javascript·css·vue
C MIKE25 分钟前
ztree.js前端插件样式文字大小文字背景修改
开发语言·前端·javascript
!win !44 分钟前
uni-app项目怎么实现多服务环境切换
前端·uni-app
源猿人1 小时前
文化与代码的交汇:OpenCC 驱动的中文语系兼容性解决方案
前端·vue.js
xw51 小时前
uni-app项目怎么实现多服务环境切换
前端·uni-app
Kjjia1 小时前
到底是 react 性能拉胯?还是吃了机制的亏
前端·react.js
ViceBoy_1 小时前
前端的Promise的方法all,race,any
前端·javascript