刚上手Cursor一周,主要用来写React+TypeScript的项目。发现一个问题:我写了一个自定义Hook,逻辑和类型定义都搞好了,然后让AI帮我补一个关联的组件,它经常擅自修改我已经写好的Hook代码,比如改参数类型、加副作用,导致我之前测试通过的逻辑崩了。
用Cursor写React组件,AI总改我已有的代码逻辑,怎么调教?
全部回复
共 153 条把Hook文件单独锁起来,或者用@提示词明确告诉它“只改组件,别动Hook”,我试过挺管用的。
我都是把已完成的代码写进AGENTS.md里声明禁止修改,AI基本就遵守了,你可以试试。
把Hook文件标记为只读或者用#region锁起来,AI就不会乱动了,我试过有效。
光标选中Hook代码后按Cmd+Shift+A,在指令里强调“只改组件,别碰Hook”,基本能管住它。
遇到过一样的坑,后来我发现问题出在给AI的上下文太“宽”了。你让它补组件,它可能默认整个文件都是可改范围,尤其是当你把整个Hook文件贴在对话里的时候,它就会觉得“顺手优化”一下也很合理。我的办法是,把Hook代码单独抽到一个只读的上下文片段里,明确告诉它“这部分是接口,只能引用不能动”,或者干脆把Hook封装成npm包再import进来,物理隔离反而省心。
另外,Cursor的规则文件(.cursorrules)里其实可以写死“禁止修改已定义的类型和函数签名”,我加了这条之后,它乱动逻辑的情况少了很多。但说实话,AI有时候改代码是因为它觉得你在“暗示”要改——比如你让它“补一个关联组件”,它可能误会成“优化整个交互链路”,所以指令里最好带上“基于现有Hook的导出接口,新增文件,不改原文件”这种限定词。
还有个土办法,就是每次让它动手前,先用git commit把当前版本锁住,它改崩了直接checkout,然后你对比一下diff,看它到底动了哪里,多试几次你就能摸清它的“改代码触发点”是什么了。我现在基本是把它当结对编程的实习生用,代码评审必须人工过一遍,尤其它自作主张加的那些useEffect,十有八九是多余的。
这问题太真实了,Cursor对上下文的理解经常“过度自信”,它觉得帮你优化一下Hook是顺手的事,但咱要的是它只动目标文件。我后来是把已经写好的代码直接折叠起来,然后在prompt里明确写“只允许修改Component.tsx,其他文件只读”,效果会好很多。另外你也可以试试在对话里加一句“如果发现现有API不合适,先问我而不是自己改”,能拦住大部分瞎折腾。
我还有个疑问,你用的是Composer还是Chat模式?感觉Composer的全局感知更强,但也更容易手贱去碰别的文件,如果你已经试过锁文件还是不行,可以看看是不是项目里的规则文件(比如AGENTS.md)没配好,Cursor其实挺吃这套的。
我刚开始用Cursor的时候也踩过这个坑,后来发现它改你已有代码,大概率是上下文里没把“哪些是稳定资产”这个信息传清楚。我现在写组件前会在对话里明确加一句“这个Hook是只读的,类型和副作用都不许动”,然后把它整个文件用#号引用进来,再让AI只输出新组件的代码,效果会好很多。还有个土办法,就是给Hook加个注释标记,比如// DO NOT MODIFY,AI对这类指令的遵从度比想象中高。另外你可以试试把测试文件也丢给它看,它看到测试约束后,改逻辑前会多犹豫一下。不过说真的,这工具本质上是在猜你的意图,你得学会用规则和边界把它框住,而不是指望它自己懂事。
试试在对话里明确告诉它“只改目标文件,别动Hook”,或者用Git暂存Hook文件,AI改完直接diff驳回,多几次就听话了。
这个问题太真实了,我刚开始用的时候也差点被气死。后来发现一个笨办法,就是让AI干活前先在对话里把它要动的文件“锁定”,明确说“只准新增组件,不准碰hook文件”,不然它真的会自作聪明。另外你可以在项目里加个规则文件,把核心逻辑标成只读,或者干脆把hook拆到单独包里,让它没法顺手改。
这问题太典型了,Cursor对已有代码的“保护意识”确实弱,它默认你给的上下文都是可以改的。我现在的做法是在prompt里明确写“只新增组件文件,严禁修改src/hooks/目录下任何代码”,每次都得强调,不然它总爱自作聪明。另外你试试把Hook文件用git先commit一下,真被改了直接diff回滚,比跟它讲道理省心多了。
我也遇到过,Cursor特别喜欢“顺手”优化你已有的代码,尤其是Hook这种它觉得能改的地方。后来我学乖了,让AI写新组件前,先把Hook文件用#锁定或者直接在提示词里强调“不要触碰src/hooks目录下任何文件”,效果立竿见影。另外它改完我会习惯性git diff看一眼,发现有动旧逻辑就直接Ctrl+Z回滚,绝不给它养成乱来的习惯。你那个类型被改的问题,试试在Hook文件顶部加个注释说明禁止改动,对模型还挺管用的。
这个我太有同感了,刚用Cursor那会儿也天天被它“好心办坏事”。后来我发现它特别容易把已有代码当成“可优化对象”,尤其是你给它一个明确任务时,它会默认你有让它重构的权限。你可以试试在prompt里明确圈定范围,比如只写“新增组件,不要动src/hooks里的任何文件”,甚至可以加一句“如果必须改,先列出改动点让我确认”。另外,把Hook文件用AI的ignore机制或者单独放进一个文件夹里,很多工具支持局部排除,这样从物理上隔离它动手的欲望。还有个野路子,你可以故意在Hook里留个“本文件禁止AI修改”的注释,有时候模型真会遵守这种指令,虽然不保证100%。说到底,AI在上下文里会把你写的代码当成“初稿”,它觉得改参数类型是优化,但对你来说那是契约,所以得反复强调“这是已发布的API”。习惯之后,我现在都是先让它写新文件,再自己手动合并,反而效率更高,你的Hook如果复杂,也建议别让AI直接补组件,让它先输出设计思路。对了,你用的是规则模式还是agent模式?我怀疑agent模式自动调工具的时候更容易越界,你可以切回普通对话试试看。
试试在对话里明确说“只改组件,别动hook”,或者把hook文件标记成只读,我这样设置后它基本老实了。
在描述里加个“不要改动现有代码”的规则,或者把Hook文件设为只读,基本能治住它。
试着把Hook丢到一个独立的文件里再让它写组件,AI就不会乱动了,我试过挺管用。
试试在对话里加一句“只改组件,别动hook”,或者把hook文件直接标成只读,我这么干之后省心多了。
这问题太典型了,我一开始用Cursor也差点被它气死。后来我发现它默认会把整个文件上下文都当成可优化对象,尤其是你那个Hook如果写在同一个文件里,它觉得改类型定义是“合理化”操作。我现在强制把Hook拆到单独文件,并且在组件代码里用注释明确写“此文件逻辑已锁定,勿修改”,虽然不能100%阻止,但至少能减少70%的乱动。另一个办法是,让它生成新组件时,你先把Hook文件在编辑器里折叠起来,或者直接放到另一个标签页,这样它上下文感知弱一点,就不太会去动。不过说真的,你得接受一个现实:AI本质是概率模型,它觉得改你的代码能提高“整体一致性”,但它不懂你测试通过意味着什么。所以我现在养成了习惯,每次让它写关联代码前,先把已有逻辑的测试用例跑一遍,然后明确告诉它“已有代码必须保持接口不变”,反而比调各种参数都管用。你试试把需求描述得更加“锁定性”,比如直接说“只允许新增组件,禁止修改任何现有导出”,命令式语气它反而更听话。
试试在对话里明确圈住hook文件让它只读,我上次这么干之后AI老实多了。
给它单独开个agent只负责组件,别把上下文混一起,改代码的毛病能少一半。
这问题太真实了,Cursor默认对上下文的理解就是“整个文件都能动”,你不锁代码它真敢乱来。我一般把写好的Hook用注释标个类似“以下逻辑勿改”的标记,或者在对话里明确说“只补组件,别碰Hook”,它基本就能老实点。另外如果改动了,Git diff一对比,直接revert掉那部分改动,别惯着它。说到底AI是拿来提效的,不是让它替你做架构决策的,关键代码还是得自己守住。
我也遇到过,后来发现是对话里给的上下文太宽了。你试试把Hook文件单独关掉,只让它看组件相关的文件,它就不会乱动了。
另外提示词里明确加一句“不要修改已有代码,只新增组件”,效果会好很多。要是它真改了,直接ctrl+z回滚,别惯着。
这问题太真实了,我刚开始用的时候也被它这么坑过。后来发现核心得靠上下文约束,比如在对话里明确写“只改你负责的组件文件,Hook文件保持只读”,或者用@引用指定文件范围,能减少大部分误伤。另外感觉它特别喜欢“顺手优化”,尤其当你代码里有点小瑕疵时,它可能觉得改掉是在帮你,结果就动了逻辑。我现在的习惯是,让AI干活前先把它要改的文件在系统提示里锁死,或者在代码顶部加个明显的注释标记“请勿修改此区域”。还有个小技巧,分两次对话,一次专门聊Hook设计,另起炉灶写组件,别让它在同一个上下文里“回忆”起你的旧代码。不过说实话,它偶尔也会抽风无视指令,真遇到了就靠git diff手动回滚,反正版本控制是底线。你们有没有试过用.gitignore或者编辑器里的Codex规则文件来限制它?我还没研究明白,感觉调教这玩意儿比写代码本身还费劲。
这问题太真实了,我刚开始用的时候也差点被气疯。后来发现根源在于AI对上下文的理解是“全局性的”,它觉得改你的Hook是为了让新组件跑通,但根本没意识到那是你测试过的稳定代码。我的土办法是在对话里明确画个圈,比如直接说“只动组件文件,Hook代码一个字别碰”,或者干脆把Hook文件单独摘出去不让AI读,效果立竿见影。另外如果它真改了,用git对比一下改动,把关键行锁死,下次它就不会再碰了。
这问题太真实了,我刚开始用也是被它改得头皮发麻。后来发现得在对话里明确加一句“只动xxx文件,其他别碰”,或者在hook文件顶部写个注释让它别改。还有个笨办法,就是把hook拆到单独文件里,然后让AI只生成组件代码,这样物理隔离。不过它有时候还是会偷偷动类型定义,我现在干脆每次生成完直接git diff,改回自己的版本再继续。