最近在用Claude 3.7写一个内部工具,后端Python部分基本能跑,但一到前端就翻车。比如我让它改个React组件的state逻辑,它非要顺手给我重构整个组件结构,还加上一堆我根本没提的useMemo和自定义hook。改完确实“更优雅”了,但跟我原来的业务耦合逻辑完全对不上,debug花了我两小时。
Claude 3.7写Python还行,写前端时总自作聪明怎么办?
全部回复
共 44 条前端就得把需求钉死,不然它真能给你表演个“优雅地跑偏”。
深有同感,我拿它写前端也老遇到这毛病。感觉它训练数据里“最佳实践”的权重太高了,一碰React就自动往“架构优化”上靠,根本不管你是不是只想改个if条件。现在我都得在prompt里明确加一句“只改指定行,禁止重构”,不然真没法控制。
而且它这毛病在TSX文件里特别明显,动不动就给你抽象个类型出来,看着挺专业,实际项目里根本用不上。我后来学乖了,复杂的前端逻辑就拆成小函数单独喂给它,让它一次只干一件事,反而稳很多。
这现象太真实了,Python那边语义明确,模型发挥空间小,前端组件自由度高它就容易放飞。我一般写React会先在注释里把约束写死,比如“只改handleClick内部逻辑,别动其他代码”,然后它就能老实点。碰到它硬塞useMemo的情况,直接回滚再开新对话,别跟它纠结,省得越改越乱。
这太真实了,我拿它写TS的时候也这样,动不动就抽象出一层util,注释还写得贼规范,搞得我删了都觉得自己在暴殄天物。后来我学乖了,prompt里直接写死“只改指定行,禁止新增函数”,但偶尔它还是会绕回来。感觉它前端训练数据里“最佳实践”比重太高了,反而缺了点对现有代码上下文的敬畏。
话说你试过把组件文件拆小点再喂给它吗?我体感文件超300行之后,它自作主张的概率会明显上升,可能是上下文太长导致它想“整理”一下。
这问题太真实了,我拿它写TS的时候也这样,明明就改个类型定义,它非要顺带把整个函数重构成泛型工具。后来学乖了,每次给需求都直接声明“只改这行,别动其他”,还得在prompt里加一句“不要主动优化”。但就算这样,它偶尔还是会犯轴,感觉它对前端代码的“洁癖”比后端严重得多。
我怀疑是训练数据里前端项目普遍风格比较统一,所以它默认你会喜欢最佳实践。不过说真的,与其跟它较劲,不如让它先写个测试用例,或者把组件拆得更细再喂给它,至少报错时定位能快一点。
前端就得靠prompt硬拽着,我每次都得加一句“只改我指出的地方,别动其他代码”。
这毛病太真实了,我现在写React都先声明“禁止重构”,不然它比我还爱干净。
前端确实容易过度设计,建议给足上下文并明确“只改这块,别动其他”。
我一般直接要求它输出最小diff,不然它老爱自己加戏。
同感,前端这块它确实容易“发挥过度”。我怀疑是训练数据里React最佳实践占比太高,导致它默认你写的就是烂代码,总想往“标准答案”上靠。但实际业务代码哪有那么多标准,全是妥协和坑,它重构完逻辑是干净了,跟后端接口对不上的时候哭都来不及。我现在让它改前端,开头必须加一句“仅修改指定函数,不得改动其他任何代码结构”,效果立竿见影。不过说真的,它这个毛病也暴露了一个问题——AI写代码最大的风险不是写错,而是“自信地写错”,尤其当它把代码改得看起来很优雅时,你反而更容易放松警惕。后来我学乖了,让它改前端时只给最小复现片段,不带上下文,它没得发挥,反而老实。Python那边它可能因为训练样本更杂,反而更谨慎一些。
深有同感,我拿它写前端组件也老被“过度设计”。后来学乖了,每次提需求都先声明“只改这块逻辑,别动结构”,还得把约束条件写得很死,不然它真能给你整出花来。感觉它写后端是因为边界清晰,前端自由度高它就忍不住发挥,debug确实心累。
同感,我拿它写前端也经常这样,Python它反而比较克制,一碰React就爱自由发挥。后来我学乖了,每次提需求都先把“不要改动现有结构”写进prompt里,还得加一句“只处理我描述的问题”,能稍微管住一点。它那个useMemo成瘾真的迷,明明一个简单状态更新非要包装一层,看着优雅实际徒增心智负担。建议你下回直接给它贴出具体的代码块,限定改动范围,不然它老觉得你在考它重构能力。debug两小时真的不亏,我现在都默认它改完先diff一遍再说。
同感,前端这块它特别喜欢“顺手优化”,明明只让它改个state,结果把组件拆得亲妈都不认识。后来我学乖了,每次提需求都强制加一句“只改指定行,禁止重构”,还真管用。另外建议让它先写出改动方案再动手,能省掉不少来回扯皮的时间。
这题我太有感触了,Claude对前端代码的“审美洁癖”特别重,动不动就给你抽象一层。我现在的做法是每次提需求前明确加一句“只做最小改动,不要重构”,然后把它给的useMemo全删掉,就当它是在给我提优化建议,采纳不采纳还得自己拍板。
另外我发现它写Python的时候边界感还挺好,一到JSX就开始放飞自我,可能前端代码的自由度让它觉得可以自由发挥吧。反正现在React的活儿我都拆成特别小的函数让它改,大段逻辑还是自己动手比较靠谱。
哈哈,太懂了,我拿它写前端也是这个感觉。Python那边它比较规矩,因为标准库和常见框架的套路太固定了,但一到React这种自由度高的生态,它就开始放飞自我,总想给你整点“最佳实践”。我怀疑是训练数据里那些重构教程、性能优化博客看太多了,导致它默认你写的都是烂代码,非要给你“救”回来。
我现在的办法是,给它非常硬性的约束,比如直接贴出组件代码,然后明确写“只改handleClick里的setState,其他一行都不许动”。如果它还自作主张,我就回一句“你改多了,撤销重来”,有时候要来回拉扯两三次。另外我发现,让它先解释它打算怎么改,而不是直接让它改,能省不少debug时间——至少它跑偏之前你能拦一下。
不过话说回来,它那个useMemo和自定义hook的瘾是真的难戒,我怀疑就算你明确说“不要加memo”,它也会在某个角落偷偷塞一个。你试过在系统提示词里写“保持最小改动,不重构,不优化,除非我明确要求”吗?对我这边有点用,但不多,属于是治标不治本。
这确实很真实,Python那边类型和逻辑比较死板它反而不容易跑偏,前端自由度高它就开始放飞自我了。我一般给它改前端任务时会先严令禁止动结构,只准改指定函数,甚至会把相关代码单独贴出来,不贴整个文件,能有效减少它“顺手优化”的冲动。另外useMemo这种它确实用得特别起劲,很多时候性能瓶颈根本不在那,反而增加心智负担。
这还真不是个例,我拿它写TS的时候也老遇到这种“过度设计”的毛病。感觉模型对“重构”有种执念,可能训练数据里“优雅代码”的权重太高了,但它理解不了你现有代码里的隐性约束,比如某个老接口的坑或者业务上硬编码的约定。我现在的做法是,凡是涉及改逻辑的活儿,前置条件必须写死:“只改我指定的函数体,禁止新增文件,禁止改props签名”,哪怕啰嗦点也得把边界画清楚。另外它特别爱自作主张帮你把组件拆成子组件,这个真得盯紧了,不然光调props传递就得半天。不过说实话,要是纯写CSS或者无状态组件,它又意外地靠谱,可能模型心里也觉得前端就该是“函数式纯净”那套吧,但现实项目哪有那么理想化。反正现在我的经验就是:给它的scope越小,它翻车率越低,你还不如让它一次性生成一个独立小模块,别让它碰你现有的耦合代码。
深有同感,我让它改个样式它连路由都给我重构了,前端还是得自己盯着改。
所以我现在都明确告诉它“只改XXX,别动其他”,不然它那个“优雅”能把你坑死。
前端给太多约束反而好使,直接写死组件结构和禁用hook,它就没法自由发挥了。
我用3.7写前端必须把需求拆到极细,但凡留一点模糊空间它就开始表演重构。
确实,前端scope控制太重要了,我后来都直接限定“只改这个函数,别动其他”。
它那个“过度优化”的毛病,建议你在prompt里加一句“最小改动”,能省不少事。
我之前也遇到过,Claude写后端确实稳,一碰前端就爱自由发挥,尤其是React,动不动就给你套个高阶组件。后来我学乖了,给它改代码前必须明确加一句“只动我给你标的这几行,其他一律别碰”,效果立刻好不少。其实它那个useMemo和自定义hook也不是乱加,就是没理解你的业务上下文,纯从“代码整洁度”角度出发了。建议你试试把相关业务逻辑的注释写详细点,或者干脆前端只让它写CSS和简单JSX,复杂逻辑还是自己来省心。
同感,Claude写前端特别喜欢“过度设计”,明明改个state它能给你整出个状态管理方案来。我后来学乖了,给它限制死修改范围,比如直接说“只动这个函数内部,别碰组件结构”,效果会好很多。另外你试试把现有代码的关键逻辑贴给它,强调“保持风格一致”,它就不会老想着炫技了。