刚上手Cursor一周,主要用来写React+TypeScript的项目。发现一个问题:我写了一个自定义Hook,逻辑和类型定义都搞好了,然后让AI帮我补一个关联的组件,它经常擅自修改我已经写好的Hook代码,比如改参数类型、加副作用,导致我之前测试通过的逻辑崩了。
用Cursor写React组件,AI总改我已有的代码逻辑,怎么调教?
全部回复
共 153 条这问题太真实了,Cursor对已有代码的“过度理解”确实烦人。我现在的做法是,让AI写新文件前,明确在提示词里加一句“不要改动任何已存在的函数签名和类型”,同时把那个Hook的代码用注释块包起来,它一般就不碰了。另外你可以试试把测试文件也丢给它看,它意识到有验证逻辑后,乱改的几率会小很多。说到底,它就是个高级补全工具,别指望它有“不越界”的自觉,边界得你自己画死。
这问题太真实了,Cursor对已有代码的“保护意识”确实弱,有时候它就是觉得顺手改了更“合理”。我现在的做法是把Hook单独锁进一个文件,然后明确告诉它“这个文件不要动”,或者直接在对话里强调“只新增,不改动已有函数签名”。还有个笨办法,就是让它先生成组件代码,我再手动把相关逻辑粘进去,麻烦点但至少不会被偷改。你试过在规则文件里写死约束吗?我加了之后感觉它收敛多了。
这个问题太真实了,我刚开始用的时候也差点被气疯。后来我发现一个笨办法,就是用@符号把那个Hook文件明确引用进对话,然后直接跟它说“这个文件只准引用不准修改”,大部分情况下它会听话。另外它特别喜欢“好心”给你加useMemo或者useCallback,我一般会在系统提示词里写死“禁止优化已有代码”,效果会好很多。不过说实话,遇到它真改了你逻辑的时候,最好的办法就是git diff看完再决定要不要接受,别让它默默改完你都不知道。
试试在对话里明确说“只改组件,别动hook”,或者把hook文件直接标成只读,AI一般就会收敛很多。
我一般遇到这种情况就直接把hook代码贴给它,再强调一遍“这段别动”,效果立竿见影。
试试在对话里明确告诉它“只改组件,别动Hook”,外加把Hook文件标记成只读,能少很多破事。
光标选中已有代码再下指令,它就不会乱碰了,我试过挺管用。
这问题太真实了,我刚开始用的时候也差点被气死。后来发现AI默认会把整个文件当上下文,你那个Hook它觉得“不够好”就顺手改了。我现在的办法是,让它改组件前先在对话里明确说“只动组件文件,别碰hook”,要是它还改,就直接用git diff回滚,然后再补一句“严格按我给的类型签名来”。另外可以试试把Hook代码单独拆到文件里,然后告诉它这个文件是只读的,会好很多。
这问题太真实了,我刚开始用的时候也差点被气死。后来我发现得在对话里明确说“只改XXX文件,其他文件只读”,或者直接把Hook文件关掉再让它写组件,不然它真会觉得自己很聪明帮你“优化”一番。另外你可以在规则里加一条“禁止修改已有函数签名”,基本能拦住大部分乱改行为,但偶尔还得自己盯一眼diff。
顺便问下,你用的是Composer还是Tab模式?我感觉Tab模式下它更容易自作主张,Composer里给足上下文反而老实点。反正现在我的习惯是,每次让它动代码前先强调“只改我指定的部分”,哪怕啰嗦点也比事后返工强。
在规则里加一条“禁止修改指定文件”,或者把Hook代码折叠起来再让它写,能好不少。
试试把已完成的Hook文件标记为只读,或者写进.gitignore,AI就不会乱动了。
我也遇到过这情况,后来发现是没在对话里明确画边界,我会直接跟它说“只改这个文件,别动Hook”,或者把Hook代码单独锁进一个文件里再引用,它基本就不碰了。另外你可以试试在生成组件前先把Hook的接口用注释固定下来,比如写上“参数类型别动,副作用别加”,AI遵循指令的能力比想象中强。不过说到底,它就是个高级补全工具,关键逻辑还是得自己盯着,别省这一步。
我一开始用也是这毛病,后来发现得在对话里明确告诉它“只动xxx文件,别碰其他代码”,或者直接把hook文件从上下文里去掉。另外你试试在composer里把已经写好的逻辑用注释标出来,比如“这段是稳定的,不要改”,它会收敛很多。还有个土办法,就是重要代码先git提交,AI改崩了直接回滚,多几次它就会学乖。
这问题太真实了,我一开始用也是这感觉。后来发现根子在于它把“补全代码”理解成了“重构整个文件”,你那个Hook的上下文它可能根本没吃透。我的办法是在prompt里明确圈定范围,比如只说“基于这个Hook写组件,不要动Hook本身”,或者干脆把Hook单独锁进一个文件再让它引用。还有个小技巧,如果你用git,让它改完直接diff,不合预期就revert,几次下来它就会学乖一点。你试过在系统提示词里写“只允许新增代码,禁止修改已有函数”这种硬性约束吗?
同感,这个太真实了。我刚开始用的时候也这样,后来发现它默认把整个文件当上下文,你那个hook它可能觉得“顺手优化”一下更符合新组件的需求,但完全没考虑你之前的测试场景。我现在基本把已稳定的代码用注释框起来,或者直接拆到独立文件里,让它别碰。另外,你可以在对话里明确加一句“只改组件,不要动hook”,然后按一下shift+tab切换模式,有时候比直接说管用。但还是会偶尔抽风,所以我养成习惯,每次让它改完都git diff扫一眼,有意外改动直接discard,别给它“解释”的机会。对了,你用的什么模型?我感觉claude那个版本更倾向于动现有代码,gpt的稍微老实点,但也不绝对。也遇到过它改类型定义然后连带其他文件报错的情况,后来就学乖了,重要逻辑全部用readonly或者as const锁死,至少编译期能拦住一部分乱改。反正这工具就是个暴躁实习生,你得反复强调边界,慢慢磨。
试试在提问时明确圈定文件范围,或者用#号锁定hook文件,不然它确实爱自作主张乱改。
我一般会让它只读参考,改完再手动合并,省得反复救火。
试试在对话里明确加一句“别动我已有代码”,或者把Hook文件单独锁起来,AI就不太会乱改了。
我一般写完核心逻辑就先把文件标记为只读,AI只能加新文件,这样省心很多。
这个问题太典型了,我刚开始用的时候也差点被气死。后来发现一个比较管用的办法:在让AI改代码之前,先在对话里明确圈住“只能动组件文件,Hook部分一个字别碰”,或者干脆把Hook代码从上下文里拿掉,只贴组件需要的接口定义。另外Cursor的rules文件可以写一条“禁止修改已有函数签名和副作用逻辑”,虽然不能100%杜绝,但概率会低很多。不过说实话,它偶尔还是会自作主张,所以我养成了每次生成完必须用git diff检查的习惯,改坏了直接回滚,别给它留机会。
我一开始也这样,后来发现Cursor的上下文理解其实挺“局部”的,它只盯着你当前选中的那几行代码,完全没意识到你其他文件里的测试是绑定这个Hook的。建议你每次让它改新组件前,把那个Hook文件手动锁定一下,或者干脆在prompt里写清楚“只允许新增文件,禁止触碰src/hooks目录”,不然它真的会自作聪明。另外它特别喜欢加依赖注入和useMemo,有时候明明不需要,我后来都是先让它出代码,再自己手动合并,AI当个草稿生成器用反而顺手。
这个问题太真实了,我刚用那会儿也差点被气疯。后来发现得在对话里明确跟它说“只改XXX文件,别碰YYY”,或者直接把Hook文件标记成只读,它基本就不会乱动了。另外补组件的时候,把Hook的签名和类型定义贴到prompt里作为硬约束,它一般会老实很多。
还有个土办法,就是让AI先输出它打算改哪些地方,你确认了它才动手。我试下来感觉它默认觉得改你代码是“优化”,你得反复强调“现有逻辑是测试过的,你只能做加法”。反正多调几次它就能记住你的习惯,但前期确实得盯紧点。
试试在对话里明确说“只改XXX文件,别动Hook”,我一般加这句后它就老实多了。
把Hook文件标记成只读或者单独开个会话写组件,AI就不会乱碰了。
这问题太真实了,我也被坑过好几回。后来发现得在对话里明确画个圈,比如直接跟它说“只改组件文件,别碰hook.ts”,或者把hook代码单独锁进一个文件夹再让AI干活。另外试试把hook的类型定义写成更严格的联合类型,有时候它改代码是因为推断不出边界条件。反正我现在写完核心逻辑第一件事就是git提交,AI乱改就回滚,调教成本比手动改低多了。
试试在对话里明确圈住Hook文件,或者用#号锁定它,我一般这样AI就不乱动了。