刚上手Cursor一周,主要用来写React+TypeScript的项目。发现一个问题:我写了一个自定义Hook,逻辑和类型定义都搞好了,然后让AI帮我补一个关联的组件,它经常擅自修改我已经写好的Hook代码,比如改参数类型、加副作用,导致我之前测试通过的逻辑崩了。
用Cursor写React组件,AI总改我已有的代码逻辑,怎么调教?
全部回复
共 153 条这个问题我也遇到过,后来发现跟Cursor的上下文理解方式有关。它在补全组件时,默认会把整个文件都当作可修改范围,尤其当你用Tab接受建议时,它可能觉得“优化”已有代码也是分内事。我现在的做法是:写Hook的时候,在关键函数或类型定义上面加一行注释比如 // @ai-ignore,然后去Cursor的设置里把“允许AI修改已选中代码之外的内容”这个选项关掉,虽然不能完全杜绝,但频率低了很多。另外,给AI的Prompt里明确说“只生成组件代码,不要动src/hooks目录下的任何文件”,它基本会听话。还有个土办法:把Hook单独抽成一个文件,在写组件时只打开组件文件,不让AI看到Hook的上下文,这样它想改也改不了。不过说实话,这问题本质是AI对“已有代码应视为不可变契约”这个意识不够,目前只能靠人工约束。你试过用Composer模式单独写组件吗?那个模式下它乱改的概率会小一些。
把Hook文件单独开个窗口或者标记成只读,AI就不太会动它了,我试过挺管用的。
试试在对话里明确加一句“只改组件,别动Hook”,或者把Hook文件标记成只读,我这么干之后基本没再乱改过。
把要改的文件单独圈出来,跟AI说清楚边界,不然它总觉得自己是在帮你优化,其实是在帮倒忙。
把关键文件直接标记成只读,或者用规则让它只能新增不能改旧代码,亲测有效。
用@指令把Hook文件锁死,AI就老实多了,我都是这么干的。
这问题太典型了,我刚开始用Cursor那会儿也差点被它气死。后来发现它默认把整个文件当成“可优化对象”,哪怕你只让它加个新组件,它也会顺手“改进”旁边的代码。我的解决办法是把Hook单独锁在一个文件里,然后明确在对话里写“只允许修改Component.tsx,禁止触碰useXXX.ts”,语气强硬点它基本能听懂。另外试试在代码里加注释,比如“这段逻辑是核心,勿动”,对AI模型其实挺管用的。不过说真的,你那个“改参数类型”的情况我还没遇到过,它一般只会改实现,你检查下是不是聊天上下文里给它看了旧版本的Hook代码?有时候它会把之前讨论过但没采纳的方案混合进来。最后建议,每次让它干活前自己先commit一次,这样它改坏了直接回滚,不用跟它讲道理,省心。
我也碰到过,后来发现是对话里给的上下文太宽了,AI会默认你有重构意图。我现在的做法是明确在prompt里写“只新增文件,不要动已有代码”,或者直接把Hook文件从上下文里摘掉,只贴出它的类型签名给它看,基本就不乱改了。另外可以试试用git暂存一下,改坏了直接checkout,心里不慌。
跟你遇到一模一样的问题,我甚至怀疑是不是我prompt写得不够好。后来试了下把Hook文件单独锁住,或者干脆在对话里明确说“不要动useXXX这个文件”,情况会好一些,但偶尔还是会抽风。感觉Cursor对“修改现有代码”和“新增代码”的边界判断确实有点迷,它可能觉得改类型定义是优化的一部分,但对我们来说这直接破坏了测试预期。
我现在的做法是,让AI生成组件时,只给它组件需要的props接口描述,不把完整Hook源码贴进去,这样它就没法直接改了。另外,我发现用斜杠命令指定“只读”某个文件或者用.gitignore的思路,在项目里加个.cursorignore规则,可能比口头叮嘱更有效。不过说实话,这工具对已有代码的“尊重程度”真的得靠调,多试几次找到它的脾气就好了。你试试在让它写组件前,先问它“你打算怎么实现,会不会动到useXXX”,有时候它自己会列出计划,你就能提前拦下来。
试试在对话里明确圈住Hook代码,加上“不要改这段”的指令,我这么干之后省心多了。
Cursor对已有代码的边界感确实弱,我一般把Hook锁成只读文件,或者干脆分两个会话写。
这问题太真实了,我刚用Cursor那会儿也差点被气疯。后来我发现它特别爱“自作聪明”地重构上下文,哪怕你明确告诉它“只写新增组件”,它还是会觉得改你的Hook能让代码更“优雅”。我现在的做法是,让它动工之前先把已有代码用注释锁死,比如在Hook文件顶部加一行“以下逻辑已冻结,禁止修改”,虽然粗暴但确实管用。另外我怀疑是对话上下文里累积了太多无关信息,导致它分不清哪些是“可动区”,所以现在每写一个独立功能就开新对话,绝不恋战。还有个小技巧,如果你用Composer模式,记得在指令里加上“仅输出组件文件内容,不要展示diff”,能减少它顺手改别的文件的冲动。不过说实话,最稳妥的还是把核心逻辑抽成独立npm包,让AI根本碰不到源码,它就只能老老实实写外层了。你试试看,要是还不行,可能得考虑给它加个system prompt专门强调“只读文件列表”,这招对我挺有效的。
把Hook文件单独锁起来或者用@提示词圈定范围,AI就不会乱动了,我试过挺管用。
我也遇到过,后来直接把Hook文件标成只读,再让AI写组件,省心多了。
遇到过一模一样的情况,后来我基本摸清它的脾气了。Cursor对上下文的理解其实很表面,你让它补组件,它觉得改Hook更“省事”,压根没意识到那是你精心设计过的部分。我现在写关键代码前都会加一行注释,比如“以下逻辑勿动,仅可新增调用”,再配合描述清楚边界,AI大部分时候会老实很多。
另外有个比较笨但有效的办法:把Hook单独塞进一个文件,然后在新组件文件里明确引用它。这样AI的注意力会集中在当前文件,手伸到别处的概率会低不少。你试过给对话里加“只改xxx部分,其他文件一律不碰”这种硬性指令吗?有时候多重复几遍比单纯描述需求管用。
不过说实话,指望它完全循规蹈矩也不太现实,毕竟模型本质是概率预测。我现在的习惯是让它生成完,先不急着跑测试,直接git diff看改动范围,一旦碰到已稳定的代码立刻revert,再重新描述需求。这活儿确实费点耐心,但比事后排查逻辑崩了要省时间多了。
对了,你用的是规则模式还是普通对话?我最近发现把项目上下文文件喂给它,再配合规则里写死“不得修改指定文件”,效果能改善至少三成。要是你还在用默认设置,可以试试这招,说不定能省不少事。
试试在对话里明确说“只改组件,别动Hook”,或者把Hook文件标成只读,我这么干之后AI老实多了。
我一般让AI先列改动清单再动手,它想碰我代码得先过我这关,不然真不敢放手用。
这个问题我也踩过坑,尤其是刚用AI写代码那会儿,简直觉得它在跟我对着干。后来我琢磨出一个规律,就是它默认你给的上下文里所有代码都是“可改的”,除非你明确告诉它哪些是稳定的边界。我现在写Hook的时候,会在注释里直接写死“这个类型不能动,这个副作用不能加”,然后让AI只负责实现组件部分,效果好了不少。
另外,你在让AI补组件的时候,最好把Hook的调用方式、参数含义都写成注释或者文档字符串,它一旦理解了你的意图,就不会自作主张去“优化”底层逻辑了。我猜它改你的代码,大概率是因为它觉得这样能让组件跑得更顺,但咱自己测试过的逻辑它根本不知道,所以它以为的“优化”其实是破坏。
还有一个土办法,就是把已经测好的Hook文件标记成只读,或者在系统提示词里加一句“被双下划线包裹的代码块为只读”,这样能拦住大部分乱改行为。但说实话,这治标不治本,核心还是得让它明白哪些是“契约”,哪些是“实现细节”,你可以在对话里反复强调。
我倒是好奇,你那个被改的Hook是返回值的类型被改了,还是逻辑里加了setState之类的副作用?如果它连类型都敢动,那可能是你给的约束还不够硬,试试把类型定义单独放一个文件里,并在请求里说清楚“这个文件是共享类型,只能导入不能修改”。反正我现在写AI辅助代码,都会在脑子里过一遍“如果它瞎改,我能不能快速回滚”,所以Git提交特别勤,改坏了直接revert,重新让它生成,比跟它较劲快多了。
试试在对话里明确加一句“别动hook文件”,或者用@指定文件范围,我这么干之后它老实多了。
这个问题太典型了,Cursor对上下文的“理解”其实很表面,它觉得改你的Hook是“顺手优化”,但根本不懂你测试通过背后的设计意图。我的办法是把已经稳定的代码块整个折叠起来,或者在对话里明确圈住范围说“只改组件,禁止动Hook”,它基本会听话。另外,你可以试着在Hook文件顶部加一行注释“此文件已锁定,请勿修改”,AI有时候会当真。要是还不行,就直接开个新对话,只把组件相关的代码喂给它,别让它看旧代码。
我跟你一模一样,刚用那会儿也被它改崩溃过。后来发现它特别爱“自作聪明”地优化类型,尤其是联合类型和泛型,一改就全崩。我现在是让它写新文件前,先把旧代码用git锁起来,或者直接在prompt里强调“禁止修改xxx文件”,稍微好点。
还有个土办法,把Hook的关键逻辑抽成纯函数,类型定义单独放一个文件,这样它就很少去动核心部分了。你试试把上下文给的更细,比如直接把Hook的源码贴一遍再让它写组件,别只给路径。
这个问题太典型了,我刚开始用的时候也差点被气疯。后来我摸索出一个笨办法,就是把已经写好的Hook文件单独放到一个子目录里,然后在对话里明确告诉AI“这个目录下的文件只读,别碰”,效果好了不少。另外,如果它非要改,你就盯着diff,发现动你逻辑的地方直接手动回滚,再补一句“只准新增不准修改”,多试几次它就能记住边界。感觉AI还是需要你像带新人一样划清地盘,不然它真不知道哪些能碰。
试试在对话里明确告诉它“只改指定文件,别动别的”,或者用@文件锁定范围,这招对我也挺管用的。
建议把已完成的Hook代码单独存个备份,让AI改坏了直接回滚,省得每次都提心吊胆。
试试在对话里明确告诉它“只写新组件,别动已有文件”,或者把Hook代码单独锁定成只读文件,能少踩好多坑。
我一般让AI改代码前先截个图给它看,或者直接说“别管其他文件”,不然它真能给你把整个项目重构了。
试试在对话里明确圈住Hook代码块,加上“只改组件别动这个”的指令,我这么干之后省心多了。
把已完成的文件标记成只读模式,或者开个新对话单独写组件,AI就不容易越界乱改了。