[{"data":1,"prerenderedAt":5366},["ShallowReactive",2],{"article-/topics/ai/frontend-to-ai-agent-roadmap-3-months":3,"related-ai":1441,"content-query-eiYgEE2wYW":4211},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":12,"image":18,"featured":6,"readingTime":19,"body":20,"_type":1435,"_id":1436,"_source":1437,"_file":1438,"_stem":1439,"_extension":1440},"/topics/ai/frontend-to-ai-agent-roadmap-3-months","ai",false,"","前端工程师转 AI Agent 的完整路线图（3 个月落地版）","前端转 AI Agent 的关键，不是“会不会调 API”，而是能否把模型能力转化为可交付系统。本文给出 12 周学习与实战路线、阶段验收标准、项目组合策略、面试自测清单和常见误区修正。","2026-03-01","HTMLPAGE 团队",[13,14,15,16,17],"前端转AI","AI Agent","学习路线图","工程化","面试准备","/images/topics/ai/frontend-to-ai-agent-roadmap-3-months.jpg",29,{"type":21,"children":22,"toc":1390},"root",[23,31,51,56,65,70,89,93,100,107,112,156,162,167,200,205,208,214,219,252,257,275,278,284,289,295,300,318,323,336,341,354,360,364,382,386,399,403,416,422,426,444,448,461,465,478,484,488,506,510,530,534,547,550,556,561,567,571,589,593,606,610,623,629,633,651,655,668,672,685,691,695,713,717,730,734,747,753,757,775,779,792,796,809,812,818,823,829,834,867,872,895,901,906,919,924,930,935,958,962,980,983,989,994,1000,1018,1024,1042,1048,1066,1072,1090,1095,1098,1104,1110,1128,1134,1152,1157,1160,1166,1171,1204,1209,1222,1225,1231,1237,1242,1248,1253,1259,1264,1270,1275,1278,1284,1289,1312,1317,1320,1326,1331,1349,1354,1359],{"type":24,"tag":25,"props":26,"children":27},"element","p",{},[28],{"type":29,"value":30},"text","“前端转 AI Agent”这件事，最大的误区是把它理解成技术栈切换：",{"type":24,"tag":32,"props":33,"children":34},"ul",{},[35,41,46],{"type":24,"tag":36,"props":37,"children":38},"li",{},[39],{"type":29,"value":40},"Vue/React 换成 Python",{"type":24,"tag":36,"props":42,"children":43},{},[44],{"type":29,"value":45},"接个 LLM API",{"type":24,"tag":36,"props":47,"children":48},{},[49],{"type":29,"value":50},"跑一个 LangChain Demo",{"type":24,"tag":25,"props":52,"children":53},{},[54],{"type":29,"value":55},"这样做 3 个月后，通常会卡在面试中的同一句话：",{"type":24,"tag":57,"props":58,"children":59},"blockquote",{},[60],{"type":24,"tag":25,"props":61,"children":62},{},[63],{"type":29,"value":64},"“你做的是一个能跑的 Demo，还是一个可交付系统？”",{"type":24,"tag":25,"props":66,"children":67},{},[68],{"type":29,"value":69},"这篇路线图的目标，是让你在 12 周后至少具备三项能力：",{"type":24,"tag":71,"props":72,"children":73},"ol",{},[74,79,84],{"type":24,"tag":36,"props":75,"children":76},{},[77],{"type":29,"value":78},"能设计 Agent 的任务闭环（而不是只会调用框架）",{"type":24,"tag":36,"props":80,"children":81},{},[82],{"type":29,"value":83},"能解释系统可靠性、安全性与成本控制",{"type":24,"tag":36,"props":85,"children":86},{},[87],{"type":29,"value":88},"能拿出一个有指标、有评估、有取舍的项目叙事",{"type":24,"tag":90,"props":91,"children":92},"hr",{},[],{"type":24,"tag":94,"props":95,"children":97},"h2",{"id":96},"一先校准认知前端背景到底能迁移什么",[98],{"type":29,"value":99},"一、先校准认知：前端背景到底能迁移什么？",{"type":24,"tag":101,"props":102,"children":104},"h3",{"id":103},"_11-真正可迁移的能力高价值",[105],{"type":29,"value":106},"1.1 真正可迁移的能力（高价值）",{"type":24,"tag":25,"props":108,"children":109},{},[110],{"type":29,"value":111},"你并不是“从零开始”。前端里这几项能力，转 Agent 非常有价值：",{"type":24,"tag":71,"props":113,"children":114},{},[115,126,136,146],{"type":24,"tag":36,"props":116,"children":117},{},[118,124],{"type":24,"tag":119,"props":120,"children":121},"strong",{},[122],{"type":29,"value":123},"状态管理思维",{"type":29,"value":125},"：你熟悉状态流与副作用，这正是 Agent run state 的核心。",{"type":24,"tag":36,"props":127,"children":128},{},[129,134],{"type":24,"tag":119,"props":130,"children":131},{},[132],{"type":29,"value":133},"异步与并发经验",{"type":29,"value":135},"：Promise、重试、取消、防抖，本质是可靠性基本功。",{"type":24,"tag":36,"props":137,"children":138},{},[139,144],{"type":24,"tag":119,"props":140,"children":141},{},[142],{"type":29,"value":143},"接口契约意识",{"type":29,"value":145},"：你知道 schema、字段约束、兼容性，这就是结构化输出的底层能力。",{"type":24,"tag":36,"props":147,"children":148},{},[149,154],{"type":24,"tag":119,"props":150,"children":151},{},[152],{"type":29,"value":153},"用户流程设计",{"type":29,"value":155},"：你能把业务目标拆成可交互步骤，这和任务规划高度相关。",{"type":24,"tag":101,"props":157,"children":159},{"id":158},"_12-不可直接迁移的能力容易误判",[160],{"type":29,"value":161},"1.2 不可直接迁移的能力（容易误判）",{"type":24,"tag":25,"props":163,"children":164},{},[165],{"type":29,"value":166},"这三项是多数前端候选人失分点：",{"type":24,"tag":32,"props":168,"children":169},{},[170,180,190],{"type":24,"tag":36,"props":171,"children":172},{},[173,178],{"type":24,"tag":119,"props":174,"children":175},{},[176],{"type":29,"value":177},"模型不确定性治理",{"type":29,"value":179},"：LLM 输出不是确定函数，必须有校验与降级。",{"type":24,"tag":36,"props":181,"children":182},{},[183,188],{"type":24,"tag":119,"props":184,"children":185},{},[186],{"type":29,"value":187},"数据与检索工程",{"type":29,"value":189},"：embedding、召回、重排、证据注入，需要新知识。",{"type":24,"tag":36,"props":191,"children":192},{},[193,198],{"type":24,"tag":119,"props":194,"children":195},{},[196],{"type":29,"value":197},"系统级非功能设计",{"type":29,"value":199},"：权限、可观测、成本治理、故障恢复。",{"type":24,"tag":25,"props":201,"children":202},{},[203],{"type":29,"value":204},"你要补的不是“再学一个框架”，而是“把不确定系统工程化”。",{"type":24,"tag":90,"props":206,"children":207},{},[],{"type":24,"tag":94,"props":209,"children":211},{"id":210},"二3-个月路线总览先闭环再扩展",[212],{"type":29,"value":213},"二、3 个月路线总览：先闭环，再扩展",{"type":24,"tag":25,"props":215,"children":216},{},[217],{"type":29,"value":218},"12 周分三阶段，每阶段 4 周：",{"type":24,"tag":32,"props":220,"children":221},{},[222,232,242],{"type":24,"tag":36,"props":223,"children":224},{},[225,230],{"type":24,"tag":119,"props":226,"children":227},{},[228],{"type":29,"value":229},"阶段 A（第 1-4 周）",{"type":29,"value":231},"：打基础，做出“单 Agent 可控闭环”",{"type":24,"tag":36,"props":233,"children":234},{},[235,240],{"type":24,"tag":119,"props":236,"children":237},{},[238],{"type":29,"value":239},"阶段 B（第 5-8 周）",{"type":29,"value":241},"：补系统性，解决可靠性/记忆/工具调度",{"type":24,"tag":36,"props":243,"children":244},{},[245,250],{"type":24,"tag":119,"props":246,"children":247},{},[248],{"type":29,"value":249},"阶段 C（第 9-12 周）",{"type":29,"value":251},"：做项目与面试资产，形成可证明能力",{"type":24,"tag":25,"props":253,"children":254},{},[255],{"type":29,"value":256},"原则：",{"type":24,"tag":71,"props":258,"children":259},{},[260,265,270],{"type":24,"tag":36,"props":261,"children":262},{},[263],{"type":29,"value":264},"每阶段必须有“可运行成果”",{"type":24,"tag":36,"props":266,"children":267},{},[268],{"type":29,"value":269},"每阶段必须有“可量化验收”",{"type":24,"tag":36,"props":271,"children":272},{},[273],{"type":29,"value":274},"每阶段必须有“复盘与版本记录”",{"type":24,"tag":90,"props":276,"children":277},{},[],{"type":24,"tag":94,"props":279,"children":281},{"id":280},"三阶段-a第-1-4-周把单-agent-做到可控",[282],{"type":29,"value":283},"三、阶段 A（第 1-4 周）：把单 Agent 做到可控",{"type":24,"tag":25,"props":285,"children":286},{},[287],{"type":29,"value":288},"目标：从“能回答”升级到“可预期工作”。",{"type":24,"tag":101,"props":290,"children":292},{"id":291},"第-1-周模型与-prompt-基础重构",[293],{"type":29,"value":294},"第 1 周：模型与 Prompt 基础重构",{"type":24,"tag":25,"props":296,"children":297},{},[298],{"type":29,"value":299},"学习重点：",{"type":24,"tag":32,"props":301,"children":302},{},[303,308,313],{"type":24,"tag":36,"props":304,"children":305},{},[306],{"type":29,"value":307},"chat completion / function calling 机制",{"type":24,"tag":36,"props":309,"children":310},{},[311],{"type":29,"value":312},"system prompt 结构化写法（角色、目标、约束、输出）",{"type":24,"tag":36,"props":314,"children":315},{},[316],{"type":29,"value":317},"输出 schema 约束与解析",{"type":24,"tag":25,"props":319,"children":320},{},[321],{"type":29,"value":322},"产出：",{"type":24,"tag":32,"props":324,"children":325},{},[326,331],{"type":24,"tag":36,"props":327,"children":328},{},[329],{"type":29,"value":330},"一个可复用的 prompt 模板",{"type":24,"tag":36,"props":332,"children":333},{},[334],{"type":29,"value":335},"10 条最小测试样本（正常/边界/对抗）",{"type":24,"tag":25,"props":337,"children":338},{},[339],{"type":29,"value":340},"验收标准：",{"type":24,"tag":32,"props":342,"children":343},{},[344,349],{"type":24,"tag":36,"props":345,"children":346},{},[347],{"type":29,"value":348},"输出 JSON 解析成功率 >= 95%",{"type":24,"tag":36,"props":350,"children":351},{},[352],{"type":29,"value":353},"关键字段缺失率 \u003C= 5%",{"type":24,"tag":101,"props":355,"children":357},{"id":356},"第-2-周工具调用与错误处理",[358],{"type":29,"value":359},"第 2 周：工具调用与错误处理",{"type":24,"tag":25,"props":361,"children":362},{},[363],{"type":29,"value":299},{"type":24,"tag":32,"props":365,"children":366},{},[367,372,377],{"type":24,"tag":36,"props":368,"children":369},{},[370],{"type":29,"value":371},"工具定义（参数边界、描述粒度）",{"type":24,"tag":36,"props":373,"children":374},{},[375],{"type":29,"value":376},"tool timeout / retry / idempotency",{"type":24,"tag":36,"props":378,"children":379},{},[380],{"type":29,"value":381},"参数校验与失败降级",{"type":24,"tag":25,"props":383,"children":384},{},[385],{"type":29,"value":322},{"type":24,"tag":32,"props":387,"children":388},{},[389,394],{"type":24,"tag":36,"props":390,"children":391},{},[392],{"type":29,"value":393},"2-3 个工具（查询类 + 计算类）",{"type":24,"tag":36,"props":395,"children":396},{},[397],{"type":29,"value":398},"失败处理策略文档（重试次数、退避策略）",{"type":24,"tag":25,"props":400,"children":401},{},[402],{"type":29,"value":340},{"type":24,"tag":32,"props":404,"children":405},{},[406,411],{"type":24,"tag":36,"props":407,"children":408},{},[409],{"type":29,"value":410},"工具调用成功率 >= 90%",{"type":24,"tag":36,"props":412,"children":413},{},[414],{"type":29,"value":415},"同一输入重复执行结果一致率 >= 95%",{"type":24,"tag":101,"props":417,"children":419},{"id":418},"第-3-周状态机与任务闭环",[420],{"type":29,"value":421},"第 3 周：状态机与任务闭环",{"type":24,"tag":25,"props":423,"children":424},{},[425],{"type":29,"value":299},{"type":24,"tag":32,"props":427,"children":428},{},[429,434,439],{"type":24,"tag":36,"props":430,"children":431},{},[432],{"type":29,"value":433},"run state machine（init / plan / execute / validate / done）",{"type":24,"tag":36,"props":435,"children":436},{},[437],{"type":29,"value":438},"成功条件与停止条件",{"type":24,"tag":36,"props":440,"children":441},{},[442],{"type":29,"value":443},"结构化运行日志",{"type":24,"tag":25,"props":445,"children":446},{},[447],{"type":29,"value":322},{"type":24,"tag":32,"props":449,"children":450},{},[451,456],{"type":24,"tag":36,"props":452,"children":453},{},[454],{"type":29,"value":455},"单 Agent 任务流程图",{"type":24,"tag":36,"props":457,"children":458},{},[459],{"type":29,"value":460},"run 追踪日志（可回放）",{"type":24,"tag":25,"props":462,"children":463},{},[464],{"type":29,"value":340},{"type":24,"tag":32,"props":466,"children":467},{},[468,473],{"type":24,"tag":36,"props":469,"children":470},{},[471],{"type":29,"value":472},"20 条任务样本可回放率 = 100%",{"type":24,"tag":36,"props":474,"children":475},{},[476],{"type":29,"value":477},"无“无状态死循环”问题",{"type":24,"tag":101,"props":479,"children":481},{"id":480},"第-4-周最小评估系统",[482],{"type":29,"value":483},"第 4 周：最小评估系统",{"type":24,"tag":25,"props":485,"children":486},{},[487],{"type":29,"value":299},{"type":24,"tag":32,"props":489,"children":490},{},[491,496,501],{"type":24,"tag":36,"props":492,"children":493},{},[494],{"type":29,"value":495},"离线 eval 数据集构建",{"type":24,"tag":36,"props":497,"children":498},{},[499],{"type":29,"value":500},"指标定义（success rate / p95 latency / avg cost）",{"type":24,"tag":36,"props":502,"children":503},{},[504],{"type":29,"value":505},"prompt 版本化",{"type":24,"tag":25,"props":507,"children":508},{},[509],{"type":29,"value":322},{"type":24,"tag":32,"props":511,"children":512},{},[513,518],{"type":24,"tag":36,"props":514,"children":515},{},[516],{"type":29,"value":517},"eval 脚本 + 基线指标",{"type":24,"tag":36,"props":519,"children":520},{},[521,528],{"type":24,"tag":522,"props":523,"children":525},"code",{"className":524},[],[526],{"type":29,"value":527},"v1 -> v2",{"type":29,"value":529}," 版本变更记录",{"type":24,"tag":25,"props":531,"children":532},{},[533],{"type":29,"value":340},{"type":24,"tag":32,"props":535,"children":536},{},[537,542],{"type":24,"tag":36,"props":538,"children":539},{},[540],{"type":29,"value":541},"每次改动都能跑回归",{"type":24,"tag":36,"props":543,"children":544},{},[545],{"type":29,"value":546},"指标异常能定位到具体变更",{"type":24,"tag":90,"props":548,"children":549},{},[],{"type":24,"tag":94,"props":551,"children":553},{"id":552},"四阶段-b第-5-8-周补齐工程短板",[554],{"type":29,"value":555},"四、阶段 B（第 5-8 周）：补齐工程短板",{"type":24,"tag":25,"props":557,"children":558},{},[559],{"type":29,"value":560},"目标：把“单机 Demo”推进到“多用户可运行雏形”。",{"type":24,"tag":101,"props":562,"children":564},{"id":563},"第-5-周记忆与上下文窗口管理",[565],{"type":29,"value":566},"第 5 周：记忆与上下文窗口管理",{"type":24,"tag":25,"props":568,"children":569},{},[570],{"type":29,"value":299},{"type":24,"tag":32,"props":572,"children":573},{},[574,579,584],{"type":24,"tag":36,"props":575,"children":576},{},[577],{"type":29,"value":578},"短期记忆、长期记忆、外部知识库边界",{"type":24,"tag":36,"props":580,"children":581},{},[582],{"type":29,"value":583},"上下文压缩策略（摘要、保留关键证据）",{"type":24,"tag":36,"props":585,"children":586},{},[587],{"type":29,"value":588},"引用注入与证据链",{"type":24,"tag":25,"props":590,"children":591},{},[592],{"type":29,"value":322},{"type":24,"tag":32,"props":594,"children":595},{},[596,601],{"type":24,"tag":36,"props":597,"children":598},{},[599],{"type":29,"value":600},"记忆层设计文档（何时写入、何时读取、何时遗忘）",{"type":24,"tag":36,"props":602,"children":603},{},[604],{"type":29,"value":605},"一套上下文压缩策略",{"type":24,"tag":25,"props":607,"children":608},{},[609],{"type":29,"value":340},{"type":24,"tag":32,"props":611,"children":612},{},[613,618],{"type":24,"tag":36,"props":614,"children":615},{},[616],{"type":29,"value":617},"长对话任务成功率较基线提升",{"type":24,"tag":36,"props":619,"children":620},{},[621],{"type":29,"value":622},"平均 token 成本下降（目标 20% 左右）",{"type":24,"tag":101,"props":624,"children":626},{"id":625},"第-6-周rag-与检索质量",[627],{"type":29,"value":628},"第 6 周：RAG 与检索质量",{"type":24,"tag":25,"props":630,"children":631},{},[632],{"type":29,"value":299},{"type":24,"tag":32,"props":634,"children":635},{},[636,641,646],{"type":24,"tag":36,"props":637,"children":638},{},[639],{"type":29,"value":640},"切块策略（chunk size/overlap）",{"type":24,"tag":36,"props":642,"children":643},{},[644],{"type":29,"value":645},"召回与重排（recall vs precision）",{"type":24,"tag":36,"props":647,"children":648},{},[649],{"type":29,"value":650},"回答引用证据校验",{"type":24,"tag":25,"props":652,"children":653},{},[654],{"type":29,"value":322},{"type":24,"tag":32,"props":656,"children":657},{},[658,663],{"type":24,"tag":36,"props":659,"children":660},{},[661],{"type":29,"value":662},"最小 RAG pipeline",{"type":24,"tag":36,"props":664,"children":665},{},[666],{"type":29,"value":667},"检索失败样本分析报告",{"type":24,"tag":25,"props":669,"children":670},{},[671],{"type":29,"value":340},{"type":24,"tag":32,"props":673,"children":674},{},[675,680],{"type":24,"tag":36,"props":676,"children":677},{},[678],{"type":29,"value":679},"引用证据覆盖率 >= 80%",{"type":24,"tag":36,"props":681,"children":682},{},[683],{"type":29,"value":684},"明显幻觉率下降（基于人工标注或规则）",{"type":24,"tag":101,"props":686,"children":688},{"id":687},"第-7-周并发限流隔离",[689],{"type":29,"value":690},"第 7 周：并发、限流、隔离",{"type":24,"tag":25,"props":692,"children":693},{},[694],{"type":29,"value":299},{"type":24,"tag":32,"props":696,"children":697},{},[698,703,708],{"type":24,"tag":36,"props":699,"children":700},{},[701],{"type":29,"value":702},"队列、并发控制、租户隔离",{"type":24,"tag":36,"props":704,"children":705},{},[706],{"type":29,"value":707},"API 限流与退避重试",{"type":24,"tag":36,"props":709,"children":710},{},[711],{"type":29,"value":712},"服务降级策略",{"type":24,"tag":25,"props":714,"children":715},{},[716],{"type":29,"value":322},{"type":24,"tag":32,"props":718,"children":719},{},[720,725],{"type":24,"tag":36,"props":721,"children":722},{},[723],{"type":29,"value":724},"并发测试脚本（如 50-100 虚拟请求）",{"type":24,"tag":36,"props":726,"children":727},{},[728],{"type":29,"value":729},"降级策略矩阵（失败类型 -> 降级动作）",{"type":24,"tag":25,"props":731,"children":732},{},[733],{"type":29,"value":340},{"type":24,"tag":32,"props":735,"children":736},{},[737,742],{"type":24,"tag":36,"props":738,"children":739},{},[740],{"type":29,"value":741},"压测下无明显雪崩",{"type":24,"tag":36,"props":743,"children":744},{},[745],{"type":29,"value":746},"P95 时延在可接受区间内",{"type":24,"tag":101,"props":748,"children":750},{"id":749},"第-8-周安全与权限",[751],{"type":29,"value":752},"第 8 周：安全与权限",{"type":24,"tag":25,"props":754,"children":755},{},[756],{"type":29,"value":299},{"type":24,"tag":32,"props":758,"children":759},{},[760,765,770],{"type":24,"tag":36,"props":761,"children":762},{},[763],{"type":29,"value":764},"prompt 注入防御",{"type":24,"tag":36,"props":766,"children":767},{},[768],{"type":29,"value":769},"工具白名单与最小权限",{"type":24,"tag":36,"props":771,"children":772},{},[773],{"type":29,"value":774},"敏感信息脱敏与审计日志",{"type":24,"tag":25,"props":776,"children":777},{},[778],{"type":29,"value":322},{"type":24,"tag":32,"props":780,"children":781},{},[782,787],{"type":24,"tag":36,"props":783,"children":784},{},[785],{"type":29,"value":786},"权限策略文件（按角色、按工具、按数据字段）",{"type":24,"tag":36,"props":788,"children":789},{},[790],{"type":29,"value":791},"安全测试用例（越权、注入、数据泄露）",{"type":24,"tag":25,"props":793,"children":794},{},[795],{"type":29,"value":340},{"type":24,"tag":32,"props":797,"children":798},{},[799,804],{"type":24,"tag":36,"props":800,"children":801},{},[802],{"type":29,"value":803},"越权调用拦截率接近 100%",{"type":24,"tag":36,"props":805,"children":806},{},[807],{"type":29,"value":808},"安全失败都有可审计记录",{"type":24,"tag":90,"props":810,"children":811},{},[],{"type":24,"tag":94,"props":813,"children":815},{"id":814},"五阶段-c第-9-12-周做出面试有含金量的项目组合",[816],{"type":29,"value":817},"五、阶段 C（第 9-12 周）：做出面试有含金量的项目组合",{"type":24,"tag":25,"props":819,"children":820},{},[821],{"type":29,"value":822},"目标：把能力打包成“可展示、可验证、可叙事”的成果。",{"type":24,"tag":101,"props":824,"children":826},{"id":825},"第-9-10-周主项目深做-1-个",[827],{"type":29,"value":828},"第 9-10 周：主项目（深做 1 个）",{"type":24,"tag":25,"props":830,"children":831},{},[832],{"type":29,"value":833},"推荐三选一：",{"type":24,"tag":71,"props":835,"children":836},{},[837,847,857],{"type":24,"tag":36,"props":838,"children":839},{},[840,845],{"type":24,"tag":119,"props":841,"children":842},{},[843],{"type":29,"value":844},"文档/PDF Agent",{"type":29,"value":846},"：RAG + 结构化提取 + 证据链",{"type":24,"tag":36,"props":848,"children":849},{},[850,855],{"type":24,"tag":119,"props":851,"children":852},{},[853],{"type":29,"value":854},"会议纪要 Agent",{"type":29,"value":856},"：多轮收集 + 状态更新 + 纠错回路",{"type":24,"tag":36,"props":858,"children":859},{},[860,865],{"type":24,"tag":119,"props":861,"children":862},{},[863],{"type":29,"value":864},"客服/业务助手 Agent",{"type":29,"value":866},"：工具调用 + 权限隔离 + 降级策略",{"type":24,"tag":25,"props":868,"children":869},{},[870],{"type":29,"value":871},"必须包含的工程要素：",{"type":24,"tag":32,"props":873,"children":874},{},[875,880,885,890],{"type":24,"tag":36,"props":876,"children":877},{},[878],{"type":29,"value":879},"状态机",{"type":24,"tag":36,"props":881,"children":882},{},[883],{"type":29,"value":884},"工具网关",{"type":24,"tag":36,"props":886,"children":887},{},[888],{"type":29,"value":889},"评估脚本",{"type":24,"tag":36,"props":891,"children":892},{},[893],{"type":29,"value":894},"指标看板（哪怕是简易版）",{"type":24,"tag":101,"props":896,"children":898},{"id":897},"第-11-周副项目横向补能力",[899],{"type":29,"value":900},"第 11 周：副项目（横向补能力）",{"type":24,"tag":25,"props":902,"children":903},{},[904],{"type":29,"value":905},"用一个小项目补齐短板，例如：",{"type":24,"tag":32,"props":907,"children":908},{},[909,914],{"type":24,"tag":36,"props":910,"children":911},{},[912],{"type":29,"value":913},"如果主项目偏 RAG，就补一个并发可靠性小项目",{"type":24,"tag":36,"props":915,"children":916},{},[917],{"type":29,"value":918},"如果主项目偏工具执行，就补一个安全权限小项目",{"type":24,"tag":25,"props":920,"children":921},{},[922],{"type":29,"value":923},"目标不是做大，而是补全能力矩阵。",{"type":24,"tag":101,"props":925,"children":927},{"id":926},"第-12-周面试资产封装",[928],{"type":29,"value":929},"第 12 周：面试资产封装",{"type":24,"tag":25,"props":931,"children":932},{},[933],{"type":29,"value":934},"你需要产出：",{"type":24,"tag":71,"props":936,"children":937},{},[938,943,948,953],{"type":24,"tag":36,"props":939,"children":940},{},[941],{"type":29,"value":942},"项目架构图（模块职责 + 数据流）",{"type":24,"tag":36,"props":944,"children":945},{},[946],{"type":29,"value":947},"指标报告（前后对比）",{"type":24,"tag":36,"props":949,"children":950},{},[951],{"type":29,"value":952},"失败案例复盘（至少 3 个）",{"type":24,"tag":36,"props":954,"children":955},{},[956],{"type":29,"value":957},"3-5 分钟项目讲述稿",{"type":24,"tag":25,"props":959,"children":960},{},[961],{"type":29,"value":340},{"type":24,"tag":32,"props":963,"children":964},{},[965,970,975],{"type":24,"tag":36,"props":966,"children":967},{},[968],{"type":29,"value":969},"能清楚讲“为什么这样设计而不是那样”",{"type":24,"tag":36,"props":971,"children":972},{},[973],{"type":29,"value":974},"能用数据解释效果变化",{"type":24,"tag":36,"props":976,"children":977},{},[978],{"type":29,"value":979},"能回答失败场景和 trade-off",{"type":24,"tag":90,"props":981,"children":982},{},[],{"type":24,"tag":94,"props":984,"children":986},{"id":985},"六每阶段都要过的可验证标准防止自我感觉良好",[987],{"type":29,"value":988},"六、每阶段都要过的“可验证标准”（防止自我感觉良好）",{"type":24,"tag":25,"props":990,"children":991},{},[992],{"type":29,"value":993},"下面这套标准建议打印出来逐项打钩：",{"type":24,"tag":101,"props":995,"children":997},{"id":996},"_61-可运行性",[998],{"type":29,"value":999},"6.1 可运行性",{"type":24,"tag":32,"props":1001,"children":1002},{},[1003,1008,1013],{"type":24,"tag":36,"props":1004,"children":1005},{},[1006],{"type":29,"value":1007},"本地可一键启动",{"type":24,"tag":36,"props":1009,"children":1010},{},[1011],{"type":29,"value":1012},"核心流程有稳定 demo",{"type":24,"tag":36,"props":1014,"children":1015},{},[1016],{"type":29,"value":1017},"关键依赖失败时有降级",{"type":24,"tag":101,"props":1019,"children":1021},{"id":1020},"_62-可解释性",[1022],{"type":29,"value":1023},"6.2 可解释性",{"type":24,"tag":32,"props":1025,"children":1026},{},[1027,1032,1037],{"type":24,"tag":36,"props":1028,"children":1029},{},[1030],{"type":29,"value":1031},"每次 run 有结构化日志",{"type":24,"tag":36,"props":1033,"children":1034},{},[1035],{"type":29,"value":1036},"能回放关键失败样本",{"type":24,"tag":36,"props":1038,"children":1039},{},[1040],{"type":29,"value":1041},"能指出性能瓶颈位置",{"type":24,"tag":101,"props":1043,"children":1045},{"id":1044},"_63-可评估性",[1046],{"type":29,"value":1047},"6.3 可评估性",{"type":24,"tag":32,"props":1049,"children":1050},{},[1051,1056,1061],{"type":24,"tag":36,"props":1052,"children":1053},{},[1054],{"type":29,"value":1055},"有固定 eval 集（至少 20 条）",{"type":24,"tag":36,"props":1057,"children":1058},{},[1059],{"type":29,"value":1060},"有版本对比（至少 2 个版本）",{"type":24,"tag":36,"props":1062,"children":1063},{},[1064],{"type":29,"value":1065},"指标可追踪（成功率/时延/成本）",{"type":24,"tag":101,"props":1067,"children":1069},{"id":1068},"_64-可治理性",[1070],{"type":29,"value":1071},"6.4 可治理性",{"type":24,"tag":32,"props":1073,"children":1074},{},[1075,1080,1085],{"type":24,"tag":36,"props":1076,"children":1077},{},[1078],{"type":29,"value":1079},"权限边界明确",{"type":24,"tag":36,"props":1081,"children":1082},{},[1083],{"type":29,"value":1084},"敏感信息有处理策略",{"type":24,"tag":36,"props":1086,"children":1087},{},[1088],{"type":29,"value":1089},"错误有告警与追踪",{"type":24,"tag":25,"props":1091,"children":1092},{},[1093],{"type":29,"value":1094},"如果你的项目只满足“能跑”，却不满足上述四项，面试时大概率被判定为 Demo 层。",{"type":24,"tag":90,"props":1096,"children":1097},{},[],{"type":24,"tag":94,"props":1099,"children":1101},{"id":1100},"七学习资源怎么选避免学了很多能力不涨",[1102],{"type":29,"value":1103},"七、学习资源怎么选：避免“学了很多，能力不涨”",{"type":24,"tag":101,"props":1105,"children":1107},{"id":1106},"_71-选择原则",[1108],{"type":29,"value":1109},"7.1 选择原则",{"type":24,"tag":71,"props":1111,"children":1112},{},[1113,1118,1123],{"type":24,"tag":36,"props":1114,"children":1115},{},[1116],{"type":29,"value":1117},"优先“系统设计与工程实践”内容，而非 API 速成",{"type":24,"tag":36,"props":1119,"children":1120},{},[1121],{"type":29,"value":1122},"优先“有评估与失败案例”的教程，而非只展示成功结果",{"type":24,"tag":36,"props":1124,"children":1125},{},[1126],{"type":29,"value":1127},"优先“能复现实验”的资料，而非纯观点文章",{"type":24,"tag":101,"props":1129,"children":1131},{"id":1130},"_72-你应该刻意练的能力",[1132],{"type":29,"value":1133},"7.2 你应该刻意练的能力",{"type":24,"tag":32,"props":1135,"children":1136},{},[1137,1142,1147],{"type":24,"tag":36,"props":1138,"children":1139},{},[1140],{"type":29,"value":1141},"把模糊需求改写成可执行任务",{"type":24,"tag":36,"props":1143,"children":1144},{},[1145],{"type":29,"value":1146},"把自然语言约束转成 schema 与规则",{"type":24,"tag":36,"props":1148,"children":1149},{},[1150],{"type":29,"value":1151},"把失败现象定位到具体层（检索/规划/执行/权限）",{"type":24,"tag":25,"props":1153,"children":1154},{},[1155],{"type":29,"value":1156},"能力增长来自“定位与修复”，不是“多看几个框架”。",{"type":24,"tag":90,"props":1158,"children":1159},{},[],{"type":24,"tag":94,"props":1161,"children":1163},{"id":1162},"八面试前自测你真的-ready-吗",[1164],{"type":29,"value":1165},"八、面试前自测：你真的 Ready 吗？",{"type":24,"tag":25,"props":1167,"children":1168},{},[1169],{"type":29,"value":1170},"给你一份高频问题清单，建议逐条录音自答：",{"type":24,"tag":71,"props":1172,"children":1173},{},[1174,1179,1184,1189,1194,1199],{"type":24,"tag":36,"props":1175,"children":1176},{},[1177],{"type":29,"value":1178},"你的 Agent run 流程是什么状态机？",{"type":24,"tag":36,"props":1180,"children":1181},{},[1182],{"type":29,"value":1183},"如何定义成功条件？失败时如何降级？",{"type":24,"tag":36,"props":1185,"children":1186},{},[1187],{"type":29,"value":1188},"工具调用如何防止重复副作用？",{"type":24,"tag":36,"props":1190,"children":1191},{},[1192],{"type":29,"value":1193},"你如何做权限控制，怎么防 prompt 注入？",{"type":24,"tag":36,"props":1195,"children":1196},{},[1197],{"type":29,"value":1198},"你如何评估改动后是否变好？",{"type":24,"tag":36,"props":1200,"children":1201},{},[1202],{"type":29,"value":1203},"你项目的最大 trade-off 是什么，为什么这么选？",{"type":24,"tag":25,"props":1205,"children":1206},{},[1207],{"type":29,"value":1208},"判定标准：",{"type":24,"tag":32,"props":1210,"children":1211},{},[1212,1217],{"type":24,"tag":36,"props":1213,"children":1214},{},[1215],{"type":29,"value":1216},"不能只说“我们用了某某库”",{"type":24,"tag":36,"props":1218,"children":1219},{},[1220],{"type":29,"value":1221},"必须能讲“设计决策 -> 风险 -> 指标结果”",{"type":24,"tag":90,"props":1223,"children":1224},{},[],{"type":24,"tag":94,"props":1226,"children":1228},{"id":1227},"九常见误区与修正建议",[1229],{"type":29,"value":1230},"九、常见误区与修正建议",{"type":24,"tag":101,"props":1232,"children":1234},{"id":1233},"误区-1先追热门框架再补基础",[1235],{"type":29,"value":1236},"误区 1：先追热门框架，再补基础",{"type":24,"tag":25,"props":1238,"children":1239},{},[1240],{"type":29,"value":1241},"修正：先有状态机、协议、评估，再决定框架。",{"type":24,"tag":101,"props":1243,"children":1245},{"id":1244},"误区-2只做前端体验不做系统闭环",[1246],{"type":29,"value":1247},"误区 2：只做前端体验，不做系统闭环",{"type":24,"tag":25,"props":1249,"children":1250},{},[1251],{"type":29,"value":1252},"修正：最少补齐工具治理、日志、评估三件套。",{"type":24,"tag":101,"props":1254,"children":1256},{"id":1255},"误区-3只追准确率不看成本与时延",[1257],{"type":29,"value":1258},"误区 3：只追准确率，不看成本与时延",{"type":24,"tag":25,"props":1260,"children":1261},{},[1262],{"type":29,"value":1263},"修正：把质量、速度、成本三者一起管理。",{"type":24,"tag":101,"props":1265,"children":1267},{"id":1266},"误区-4把安全留到上线前再做",[1268],{"type":29,"value":1269},"误区 4：把安全留到上线前再做",{"type":24,"tag":25,"props":1271,"children":1272},{},[1273],{"type":29,"value":1274},"修正：从第一版就加权限与审计，否则重构代价极高。",{"type":24,"tag":90,"props":1276,"children":1277},{},[],{"type":24,"tag":94,"props":1279,"children":1281},{"id":1280},"十一个可执行的每周时间配比在职版",[1282],{"type":29,"value":1283},"十、一个可执行的每周时间配比（在职版）",{"type":24,"tag":25,"props":1285,"children":1286},{},[1287],{"type":29,"value":1288},"如果你是边工作边转岗，可以参考每周 12-15 小时配比：",{"type":24,"tag":32,"props":1290,"children":1291},{},[1292,1297,1302,1307],{"type":24,"tag":36,"props":1293,"children":1294},{},[1295],{"type":29,"value":1296},"40%：项目编码与调试",{"type":24,"tag":36,"props":1298,"children":1299},{},[1300],{"type":29,"value":1301},"25%：评估与复盘",{"type":24,"tag":36,"props":1303,"children":1304},{},[1305],{"type":29,"value":1306},"20%：系统性学习（原理与架构）",{"type":24,"tag":36,"props":1308,"children":1309},{},[1310],{"type":29,"value":1311},"15%：面试表达与文档沉淀",{"type":24,"tag":25,"props":1313,"children":1314},{},[1315],{"type":29,"value":1316},"关键不是学时长，而是每周都有“可验证产出”。",{"type":24,"tag":90,"props":1318,"children":1319},{},[],{"type":24,"tag":94,"props":1321,"children":1323},{"id":1322},"结语转岗成败不在会不会用-ai而在能不能把-ai-做成系统",[1324],{"type":29,"value":1325},"结语：转岗成败不在“会不会用 AI”，而在“能不能把 AI 做成系统”",{"type":24,"tag":25,"props":1327,"children":1328},{},[1329],{"type":29,"value":1330},"3 个月可以从前端转向 AI Agent，但前提是你把路线走成“工程闭环”而不是“工具收集”：",{"type":24,"tag":32,"props":1332,"children":1333},{},[1334,1339,1344],{"type":24,"tag":36,"props":1335,"children":1336},{},[1337],{"type":29,"value":1338},"有架构，不只是有代码",{"type":24,"tag":36,"props":1340,"children":1341},{},[1342],{"type":29,"value":1343},"有评估，不只是有感觉",{"type":24,"tag":36,"props":1345,"children":1346},{},[1347],{"type":29,"value":1348},"有取舍，不只是堆功能",{"type":24,"tag":25,"props":1350,"children":1351},{},[1352],{"type":29,"value":1353},"当你能稳定回答“系统如何在失败中继续工作”时，你就已经越过了 Demo 工程师的门槛。",{"type":24,"tag":25,"props":1355,"children":1356},{},[1357],{"type":29,"value":1358},"延伸阅读：",{"type":24,"tag":32,"props":1360,"children":1361},{},[1362,1372,1381],{"type":24,"tag":36,"props":1363,"children":1364},{},[1365],{"type":24,"tag":1366,"props":1367,"children":1369},"a",{"href":1368},"/topics/ai/frontend-to-ai-agent-interview-guide",[1370],{"type":29,"value":1371},"前端转 AI Agent 面试避坑指南：面试官真实槽点全拆解",{"type":24,"tag":36,"props":1373,"children":1374},{},[1375],{"type":24,"tag":1366,"props":1376,"children":1378},{"href":1377},"/topics/ai/ai-agent-core-knowledge-breakdown",[1379],{"type":29,"value":1380},"AI Agent 必考知识点：记忆机制、任务规划、工具调度完全拆解",{"type":24,"tag":36,"props":1382,"children":1383},{},[1384],{"type":24,"tag":1366,"props":1385,"children":1387},{"href":1386},"/topics/ai/ai-agent-project-credibility-guide",[1388],{"type":29,"value":1389},"AI Agent 项目怎么做才有含金量：从“LangChain 模板”到“可落地工程”",{"title":7,"searchDepth":1391,"depth":1391,"links":1392},3,[1393,1398,1399,1405,1411,1416,1422,1426,1427,1433,1434],{"id":96,"depth":1394,"text":99,"children":1395},2,[1396,1397],{"id":103,"depth":1391,"text":106},{"id":158,"depth":1391,"text":161},{"id":210,"depth":1394,"text":213},{"id":280,"depth":1394,"text":283,"children":1400},[1401,1402,1403,1404],{"id":291,"depth":1391,"text":294},{"id":356,"depth":1391,"text":359},{"id":418,"depth":1391,"text":421},{"id":480,"depth":1391,"text":483},{"id":552,"depth":1394,"text":555,"children":1406},[1407,1408,1409,1410],{"id":563,"depth":1391,"text":566},{"id":625,"depth":1391,"text":628},{"id":687,"depth":1391,"text":690},{"id":749,"depth":1391,"text":752},{"id":814,"depth":1394,"text":817,"children":1412},[1413,1414,1415],{"id":825,"depth":1391,"text":828},{"id":897,"depth":1391,"text":900},{"id":926,"depth":1391,"text":929},{"id":985,"depth":1394,"text":988,"children":1417},[1418,1419,1420,1421],{"id":996,"depth":1391,"text":999},{"id":1020,"depth":1391,"text":1023},{"id":1044,"depth":1391,"text":1047},{"id":1068,"depth":1391,"text":1071},{"id":1100,"depth":1394,"text":1103,"children":1423},[1424,1425],{"id":1106,"depth":1391,"text":1109},{"id":1130,"depth":1391,"text":1133},{"id":1162,"depth":1394,"text":1165},{"id":1227,"depth":1394,"text":1230,"children":1428},[1429,1430,1431,1432],{"id":1233,"depth":1391,"text":1236},{"id":1244,"depth":1391,"text":1247},{"id":1255,"depth":1391,"text":1258},{"id":1266,"depth":1391,"text":1269},{"id":1280,"depth":1394,"text":1283},{"id":1322,"depth":1394,"text":1325},"markdown","content:topics:ai:frontend-to-ai-agent-roadmap-3-months.md","content","topics/ai/frontend-to-ai-agent-roadmap-3-months.md","topics/ai/frontend-to-ai-agent-roadmap-3-months","md",[1442,2598,3547],{"_path":1443,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":1444,"description":1445,"date":1446,"topic":5,"author":11,"tags":1447,"image":1453,"imageAlt":1454,"pexelsPhotoId":1455,"pexelsUrl":1456,"readingTime":1457,"body":1458,"_type":1435,"_id":2595,"_source":1437,"_file":2596,"_stem":2597,"_extension":1440},"/topics/ai/cursor-keyboard-shortcuts-cheatsheet","Cursor 快捷键速查表（macOS/Windows）：从“会用”到“能提效”的 10 个工作流","把 Cursor 常用快捷键按任务分组（查代码、改代码、多文件、对话、审查与回滚），给出可直接照抄的工作流与最小回归清单，避免“快捷键背了也没变快”。","2026-03-02",[1448,1449,1450,1451,1452],"Cursor","快捷键","AI IDE","VS Code","开发效率","/images/topics/ai/cursor-keyboard-shortcuts-cheatsheet.jpg","彩色机械键盘与鼠标的工作台面",34563105,"https://www.pexels.com/photo/colorful-mechanical-keyboard-and-mouse-setup-34563105/",12,{"type":21,"children":1459,"toc":2569},[1460,1465,1483,1488,1515,1520,1556,1559,1565,1570,1603,1608,1631,1634,1640,1645,1869,1877,1880,1886,1892,1911,1919,1940,1945,1951,1966,1997,2002,2015,2021,2040,2058,2066,2071,2077,2082,2103,2111,2117,2122,2145,2150,2156,2169,2175,2193,2211,2217,2228,2246,2252,2263,2269,2274,2317,2320,2326,2334,2387,2390,2396,2402,2407,2412,2435,2453,2458,2483,2486,2492,2498,2503,2509,2514,2520,2525,2528,2534],{"type":24,"tag":25,"props":1461,"children":1462},{},[1463],{"type":29,"value":1464},"如果你在搜“Cursor 快捷键”，你大概率不是想背一张表，而是想解决这类问题：",{"type":24,"tag":32,"props":1466,"children":1467},{},[1468,1473,1478],{"type":24,"tag":36,"props":1469,"children":1470},{},[1471],{"type":29,"value":1472},"为什么我用了 AI，还是很慢？（对话来回太多、改动不可控）",{"type":24,"tag":36,"props":1474,"children":1475},{},[1476],{"type":29,"value":1477},"为什么它“看起来懂了”，却改错文件/改出回归？（上下文与范围没锁住）",{"type":24,"tag":36,"props":1479,"children":1480},{},[1481],{"type":29,"value":1482},"多文件改动怎么做得安全？（验收、回滚、最小回归集）",{"type":24,"tag":25,"props":1484,"children":1485},{},[1486],{"type":29,"value":1487},"这篇文章给你两份东西：",{"type":24,"tag":71,"props":1489,"children":1490},{},[1491,1503],{"type":24,"tag":36,"props":1492,"children":1493},{},[1494,1496,1501],{"type":29,"value":1495},"一张",{"type":24,"tag":119,"props":1497,"children":1498},{},[1499],{"type":29,"value":1500},"按任务分组",{"type":29,"value":1502},"的快捷键表（不是按功能堆在一起）",{"type":24,"tag":36,"props":1504,"children":1505},{},[1506,1508,1513],{"type":29,"value":1507},"一套“从需求到落地”的",{"type":24,"tag":119,"props":1509,"children":1510},{},[1511],{"type":29,"value":1512},"最小闭环工作流",{"type":29,"value":1514},"（每一步都有快捷键）",{"type":24,"tag":25,"props":1516,"children":1517},{},[1518],{"type":29,"value":1519},"想看系统玩法：",{"type":24,"tag":32,"props":1521,"children":1522},{},[1523,1534,1545],{"type":24,"tag":36,"props":1524,"children":1525},{},[1526,1528],{"type":29,"value":1527},"入门教程看：",{"type":24,"tag":1366,"props":1529,"children":1531},{"href":1530},"/topics/ai/cursor-tutorial",[1532],{"type":29,"value":1533},"Cursor 使用教程（2026）",{"type":24,"tag":36,"props":1535,"children":1536},{},[1537,1539],{"type":29,"value":1538},"进阶玩法看：",{"type":24,"tag":1366,"props":1540,"children":1542},{"href":1541},"/topics/ai/cursor-editor-guide",[1543],{"type":29,"value":1544},"Cursor 编辑器深度玩法",{"type":24,"tag":36,"props":1546,"children":1547},{},[1548,1550],{"type":29,"value":1549},"规则与忽略看：",{"type":24,"tag":1366,"props":1551,"children":1553},{"href":1552},"/topics/ai/cursor-rules-cursorrules",[1554],{"type":29,"value":1555},"Cursor Rules 与 .cursorrules",{"type":24,"tag":90,"props":1557,"children":1558},{},[],{"type":24,"tag":94,"props":1560,"children":1562},{"id":1561},"先给结论提效不是按得快而是闭环更短",[1563],{"type":29,"value":1564},"先给结论：提效不是“按得快”，而是“闭环更短”",{"type":24,"tag":25,"props":1566,"children":1567},{},[1568],{"type":29,"value":1569},"你可以把 Cursor 的快捷键理解为 3 条流水线：",{"type":24,"tag":32,"props":1571,"children":1572},{},[1573,1583,1593],{"type":24,"tag":36,"props":1574,"children":1575},{},[1576,1581],{"type":24,"tag":119,"props":1577,"children":1578},{},[1579],{"type":29,"value":1580},"改一小段",{"type":29,"value":1582},"（内联编辑）：把改动限制在一个函数/一段样式",{"type":24,"tag":36,"props":1584,"children":1585},{},[1586,1591],{"type":24,"tag":119,"props":1587,"children":1588},{},[1589],{"type":29,"value":1590},"改一组文件",{"type":29,"value":1592},"（Composer）：把改动限制在一组明确文件，并要求输出 diff + 验收点",{"type":24,"tag":36,"props":1594,"children":1595},{},[1596,1601],{"type":24,"tag":119,"props":1597,"children":1598},{},[1599],{"type":29,"value":1600},"聊清楚再动手",{"type":29,"value":1602},"（侧边对话）：先对齐目标、范围、验收、回滚",{"type":24,"tag":25,"props":1604,"children":1605},{},[1606],{"type":29,"value":1607},"当你觉得“它乱改/改太大”时，往往不是快捷键没记住，而是缺了两件事：",{"type":24,"tag":32,"props":1609,"children":1610},{},[1611,1621],{"type":24,"tag":36,"props":1612,"children":1613},{},[1614,1616],{"type":29,"value":1615},"没有在动手前锁定",{"type":24,"tag":119,"props":1617,"children":1618},{},[1619],{"type":29,"value":1620},"范围",{"type":24,"tag":36,"props":1622,"children":1623},{},[1624,1626],{"type":29,"value":1625},"没有在接受改动前准备",{"type":24,"tag":119,"props":1627,"children":1628},{},[1629],{"type":29,"value":1630},"验收/回滚",{"type":24,"tag":90,"props":1632,"children":1633},{},[],{"type":24,"tag":94,"props":1635,"children":1637},{"id":1636},"快捷键速查表按任务分组",[1638],{"type":29,"value":1639},"快捷键速查表（按任务分组）",{"type":24,"tag":25,"props":1641,"children":1642},{},[1643],{"type":29,"value":1644},"说明：下表按“你正在做什么”组织，而不是按“功能名字”组织。不同版本快捷键可能略有差异，但核心逻辑一致。",{"type":24,"tag":1646,"props":1647,"children":1648},"table",{},[1649,1678],{"type":24,"tag":1650,"props":1651,"children":1652},"thead",{},[1653],{"type":24,"tag":1654,"props":1655,"children":1656},"tr",{},[1657,1663,1668,1673],{"type":24,"tag":1658,"props":1659,"children":1660},"th",{},[1661],{"type":29,"value":1662},"任务",{"type":24,"tag":1658,"props":1664,"children":1665},{},[1666],{"type":29,"value":1667},"macOS",{"type":24,"tag":1658,"props":1669,"children":1670},{},[1671],{"type":29,"value":1672},"Windows",{"type":24,"tag":1658,"props":1674,"children":1675},{},[1676],{"type":29,"value":1677},"你该在什么时候用",{"type":24,"tag":1679,"props":1680,"children":1681},"tbody",{},[1682,1714,1745,1776,1807,1838],{"type":24,"tag":1654,"props":1683,"children":1684},{},[1685,1691,1700,1709],{"type":24,"tag":1686,"props":1687,"children":1688},"td",{},[1689],{"type":29,"value":1690},"改一小段（最安全）",{"type":24,"tag":1686,"props":1692,"children":1693},{},[1694],{"type":24,"tag":522,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":29,"value":1699},"Cmd + K",{"type":24,"tag":1686,"props":1701,"children":1702},{},[1703],{"type":24,"tag":522,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":29,"value":1708},"Ctrl + K",{"type":24,"tag":1686,"props":1710,"children":1711},{},[1712],{"type":29,"value":1713},"只想改一个函数/一段 CSS，不想动别的",{"type":24,"tag":1654,"props":1715,"children":1716},{},[1717,1722,1731,1740],{"type":24,"tag":1686,"props":1718,"children":1719},{},[1720],{"type":29,"value":1721},"打开 AI 对话（先对齐再动手）",{"type":24,"tag":1686,"props":1723,"children":1724},{},[1725],{"type":24,"tag":522,"props":1726,"children":1728},{"className":1727},[],[1729],{"type":29,"value":1730},"Cmd + L",{"type":24,"tag":1686,"props":1732,"children":1733},{},[1734],{"type":24,"tag":522,"props":1735,"children":1737},{"className":1736},[],[1738],{"type":29,"value":1739},"Ctrl + L",{"type":24,"tag":1686,"props":1741,"children":1742},{},[1743],{"type":29,"value":1744},"需要澄清目标、制定步骤、给验收点",{"type":24,"tag":1654,"props":1746,"children":1747},{},[1748,1753,1762,1771],{"type":24,"tag":1686,"props":1749,"children":1750},{},[1751],{"type":29,"value":1752},"多文件编辑（有组织地改一组文件）",{"type":24,"tag":1686,"props":1754,"children":1755},{},[1756],{"type":24,"tag":522,"props":1757,"children":1759},{"className":1758},[],[1760],{"type":29,"value":1761},"Cmd + I",{"type":24,"tag":1686,"props":1763,"children":1764},{},[1765],{"type":24,"tag":522,"props":1766,"children":1768},{"className":1767},[],[1769],{"type":29,"value":1770},"Ctrl + I",{"type":24,"tag":1686,"props":1772,"children":1773},{},[1774],{"type":29,"value":1775},"改动涉及多个文件：组件+样式+测试",{"type":24,"tag":1654,"props":1777,"children":1778},{},[1779,1784,1793,1802],{"type":24,"tag":1686,"props":1780,"children":1781},{},[1782],{"type":29,"value":1783},"把选中代码加入对话上下文",{"type":24,"tag":1686,"props":1785,"children":1786},{},[1787],{"type":24,"tag":522,"props":1788,"children":1790},{"className":1789},[],[1791],{"type":29,"value":1792},"Cmd + Shift + L",{"type":24,"tag":1686,"props":1794,"children":1795},{},[1796],{"type":24,"tag":522,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":29,"value":1801},"Ctrl + Shift + L",{"type":24,"tag":1686,"props":1803,"children":1804},{},[1805],{"type":29,"value":1806},"让 AI 只看你选的片段（降低噪音）",{"type":24,"tag":1654,"props":1808,"children":1809},{},[1810,1815,1824,1833],{"type":24,"tag":1686,"props":1811,"children":1812},{},[1813],{"type":29,"value":1814},"接受当前建议",{"type":24,"tag":1686,"props":1816,"children":1817},{},[1818],{"type":24,"tag":522,"props":1819,"children":1821},{"className":1820},[],[1822],{"type":29,"value":1823},"Cmd + Y",{"type":24,"tag":1686,"props":1825,"children":1826},{},[1827],{"type":24,"tag":522,"props":1828,"children":1830},{"className":1829},[],[1831],{"type":29,"value":1832},"Ctrl + Y",{"type":24,"tag":1686,"props":1834,"children":1835},{},[1836],{"type":29,"value":1837},"你已经准备好验收/回滚，并确认改动范围",{"type":24,"tag":1654,"props":1839,"children":1840},{},[1841,1846,1855,1864],{"type":24,"tag":1686,"props":1842,"children":1843},{},[1844],{"type":29,"value":1845},"拒绝当前建议",{"type":24,"tag":1686,"props":1847,"children":1848},{},[1849],{"type":24,"tag":522,"props":1850,"children":1852},{"className":1851},[],[1853],{"type":29,"value":1854},"Cmd + N",{"type":24,"tag":1686,"props":1856,"children":1857},{},[1858],{"type":24,"tag":522,"props":1859,"children":1861},{"className":1860},[],[1862],{"type":29,"value":1863},"Ctrl + N",{"type":24,"tag":1686,"props":1865,"children":1866},{},[1867],{"type":29,"value":1868},"改得太大、改错方向，立刻收手",{"type":24,"tag":57,"props":1870,"children":1871},{},[1872],{"type":24,"tag":25,"props":1873,"children":1874},{},[1875],{"type":29,"value":1876},"小技巧：把“改一小段”当默认路径。只有当你能清晰写出“会改哪几类文件、怎么验收”时再进入多文件。",{"type":24,"tag":90,"props":1878,"children":1879},{},[],{"type":24,"tag":94,"props":1881,"children":1883},{"id":1882},"_10-个可直接照抄的提效工作流每个都能闭环",[1884],{"type":29,"value":1885},"10 个可直接照抄的提效工作流（每个都能闭环）",{"type":24,"tag":101,"props":1887,"children":1889},{"id":1888},"工作流-1需求计划小步改新手最稳",[1890],{"type":29,"value":1891},"工作流 1：需求→计划→小步改（新手最稳）",{"type":24,"tag":71,"props":1893,"children":1894},{},[1895,1906],{"type":24,"tag":36,"props":1896,"children":1897},{},[1898,1904],{"type":24,"tag":522,"props":1899,"children":1901},{"className":1900},[],[1902],{"type":29,"value":1903},"Cmd/Ctrl + L",{"type":29,"value":1905}," 打开对话",{"type":24,"tag":36,"props":1907,"children":1908},{},[1909],{"type":29,"value":1910},"先发这段（可复制）：",{"type":24,"tag":57,"props":1912,"children":1913},{},[1914],{"type":24,"tag":25,"props":1915,"children":1916},{},[1917],{"type":29,"value":1918},"目标：……\n范围：只修改以下文件/模块：……\n非目标：……（明确不做）\n验收：……（可测试/可手动检查）\n输出格式：先给计划，再逐步执行；每一步写出 diff 摘要。",{"type":24,"tag":71,"props":1920,"children":1921},{"start":1391},[1922,1927],{"type":24,"tag":36,"props":1923,"children":1924},{},[1925],{"type":29,"value":1926},"让 AI 先给“计划（3~6 步）”，你确认后再执行",{"type":24,"tag":36,"props":1928,"children":1929},{},[1930,1932,1938],{"type":29,"value":1931},"任何一步涉及改代码：优先回到编辑区，选中片段用 ",{"type":24,"tag":522,"props":1933,"children":1935},{"className":1934},[],[1936],{"type":29,"value":1937},"Cmd/Ctrl + K",{"type":29,"value":1939}," 小步改",{"type":24,"tag":25,"props":1941,"children":1942},{},[1943],{"type":29,"value":1944},"为什么有效：你把“想法”变成了“可执行约束”，这就是 GEO（面向 AI/模型的可理解结构）。",{"type":24,"tag":101,"props":1946,"children":1948},{"id":1947},"工作流-2只改一个函数高频低风险",[1949],{"type":29,"value":1950},"工作流 2：只改一个函数（高频、低风险）",{"type":24,"tag":32,"props":1952,"children":1953},{},[1954],{"type":24,"tag":36,"props":1955,"children":1956},{},[1957,1959,1964],{"type":29,"value":1958},"选中函数 → ",{"type":24,"tag":522,"props":1960,"children":1962},{"className":1961},[],[1963],{"type":29,"value":1937},{"type":29,"value":1965}," → 输入指令：",{"type":24,"tag":57,"props":1967,"children":1968},{},[1969,1974],{"type":24,"tag":25,"props":1970,"children":1971},{},[1972],{"type":29,"value":1973},"把这段改成更可读：",{"type":24,"tag":32,"props":1975,"children":1976},{},[1977,1982,1987,1992],{"type":24,"tag":36,"props":1978,"children":1979},{},[1980],{"type":29,"value":1981},"用 async/await",{"type":24,"tag":36,"props":1983,"children":1984},{},[1985],{"type":29,"value":1986},"错误处理不要吞掉",{"type":24,"tag":36,"props":1988,"children":1989},{},[1990],{"type":29,"value":1991},"添加类型（若可推断）",{"type":24,"tag":36,"props":1993,"children":1994},{},[1995],{"type":29,"value":1996},"不要改函数签名",{"type":24,"tag":25,"props":1998,"children":1999},{},[2000],{"type":29,"value":2001},"验收方式（强制）：",{"type":24,"tag":32,"props":2003,"children":2004},{},[2005,2010],{"type":24,"tag":36,"props":2006,"children":2007},{},[2008],{"type":29,"value":2009},"输出前后函数行为一致（输入/输出）",{"type":24,"tag":36,"props":2011,"children":2012},{},[2013],{"type":29,"value":2014},"失败分支有可观测日志（不要悄悄 return null）",{"type":24,"tag":101,"props":2016,"children":2018},{"id":2017},"工作流-3多文件改动先定文件清单",[2019],{"type":29,"value":2020},"工作流 3：多文件改动（先定“文件清单”）",{"type":24,"tag":71,"props":2022,"children":2023},{},[2024,2035],{"type":24,"tag":36,"props":2025,"children":2026},{},[2027,2033],{"type":24,"tag":522,"props":2028,"children":2030},{"className":2029},[],[2031],{"type":29,"value":2032},"Cmd/Ctrl + I",{"type":29,"value":2034}," 进入多文件",{"type":24,"tag":36,"props":2036,"children":2037},{},[2038],{"type":29,"value":2039},"先让 AI 输出：",{"type":24,"tag":32,"props":2041,"children":2042},{},[2043,2048,2053],{"type":24,"tag":36,"props":2044,"children":2045},{},[2046],{"type":29,"value":2047},"预计会改哪些文件（最多 5 个）",{"type":24,"tag":36,"props":2049,"children":2050},{},[2051],{"type":29,"value":2052},"每个文件改什么",{"type":24,"tag":36,"props":2054,"children":2055},{},[2056],{"type":29,"value":2057},"每一步怎么验收",{"type":24,"tag":71,"props":2059,"children":2060},{"start":1391},[2061],{"type":24,"tag":36,"props":2062,"children":2063},{},[2064],{"type":29,"value":2065},"你确认文件清单后再开始生成改动",{"type":24,"tag":25,"props":2067,"children":2068},{},[2069],{"type":29,"value":2070},"关键点：多文件最容易翻车的是“它把你没想到的文件也改了”。所以文件清单是第一道闸门。",{"type":24,"tag":101,"props":2072,"children":2074},{"id":2073},"工作流-4把上下文噪音砍掉防跑偏",[2075],{"type":29,"value":2076},"工作流 4：把“上下文噪音”砍掉（防跑偏）",{"type":24,"tag":25,"props":2078,"children":2079},{},[2080],{"type":29,"value":2081},"当你怀疑它在胡说/乱改时：",{"type":24,"tag":32,"props":2083,"children":2084},{},[2085,2098],{"type":24,"tag":36,"props":2086,"children":2087},{},[2088,2090,2096],{"type":29,"value":2089},"只选择关键代码片段 → ",{"type":24,"tag":522,"props":2091,"children":2093},{"className":2092},[],[2094],{"type":29,"value":2095},"Cmd/Ctrl + Shift + L",{"type":29,"value":2097}," 加入对话",{"type":24,"tag":36,"props":2099,"children":2100},{},[2101],{"type":29,"value":2102},"然后在对话里要求：",{"type":24,"tag":57,"props":2104,"children":2105},{},[2106],{"type":24,"tag":25,"props":2107,"children":2108},{},[2109],{"type":29,"value":2110},"只基于我提供的代码片段回答，不要假设其它文件存在。",{"type":24,"tag":101,"props":2112,"children":2114},{"id":2113},"工作流-5生成变更说明让-code-review-变快",[2115],{"type":29,"value":2116},"工作流 5：生成变更说明（让 code review 变快）",{"type":24,"tag":25,"props":2118,"children":2119},{},[2120],{"type":29,"value":2121},"改完后在对话里让它输出：",{"type":24,"tag":32,"props":2123,"children":2124},{},[2125,2130,2135,2140],{"type":24,"tag":36,"props":2126,"children":2127},{},[2128],{"type":29,"value":2129},"改动摘要（3~7 条）",{"type":24,"tag":36,"props":2131,"children":2132},{},[2133],{"type":29,"value":2134},"风险点（依赖/边界条件）",{"type":24,"tag":36,"props":2136,"children":2137},{},[2138],{"type":29,"value":2139},"回滚方式",{"type":24,"tag":36,"props":2141,"children":2142},{},[2143],{"type":29,"value":2144},"验收步骤",{"type":24,"tag":25,"props":2146,"children":2147},{},[2148],{"type":29,"value":2149},"这套结构能直接贴进 PR 描述。",{"type":24,"tag":101,"props":2151,"children":2153},{"id":2152},"工作流-6写最小回归集不写回归-等事故",[2154],{"type":29,"value":2155},"工作流 6：写“最小回归集”（不写回归 = 等事故）",{"type":24,"tag":25,"props":2157,"children":2158},{},[2159,2161,2167],{"type":29,"value":2160},"每次改动都至少做 10 条最小回归（见下文清单）。你可以把它写在 ",{"type":24,"tag":522,"props":2162,"children":2164},{"className":2163},[],[2165],{"type":29,"value":2166},"README",{"type":29,"value":2168}," 或团队 wiki。",{"type":24,"tag":101,"props":2170,"children":2172},{"id":2171},"工作流-7把接受建议变成最后一步",[2173],{"type":29,"value":2174},"工作流 7：把“接受建议”变成最后一步",{"type":24,"tag":25,"props":2176,"children":2177},{},[2178,2184,2186,2191],{"type":24,"tag":522,"props":2179,"children":2181},{"className":2180},[],[2182],{"type":29,"value":2183},"Cmd/Ctrl + Y",{"type":29,"value":2185}," 应该是",{"type":24,"tag":119,"props":2187,"children":2188},{},[2189],{"type":29,"value":2190},"最后一步",{"type":29,"value":2192},"：",{"type":24,"tag":32,"props":2194,"children":2195},{},[2196,2201,2206],{"type":24,"tag":36,"props":2197,"children":2198},{},[2199],{"type":29,"value":2200},"你已经看过 diff",{"type":24,"tag":36,"props":2202,"children":2203},{},[2204],{"type":29,"value":2205},"你能说清楚“怎么验收”",{"type":24,"tag":36,"props":2207,"children":2208},{},[2209],{"type":29,"value":2210},"你知道“怎么回滚”",{"type":24,"tag":101,"props":2212,"children":2214},{"id":2213},"工作流-8拒绝建议不是失败是风控动作",[2215],{"type":29,"value":2216},"工作流 8：拒绝建议不是失败，是风控动作",{"type":24,"tag":25,"props":2218,"children":2219},{},[2220,2226],{"type":24,"tag":522,"props":2221,"children":2223},{"className":2222},[],[2224],{"type":29,"value":2225},"Cmd/Ctrl + N",{"type":29,"value":2227}," 的使用时机：",{"type":24,"tag":32,"props":2229,"children":2230},{},[2231,2236,2241],{"type":24,"tag":36,"props":2232,"children":2233},{},[2234],{"type":29,"value":2235},"它开始改你没提过的东西（范围漂移）",{"type":24,"tag":36,"props":2237,"children":2238},{},[2239],{"type":29,"value":2240},"它改了 10 个文件但你只想改 1 个",{"type":24,"tag":36,"props":2242,"children":2243},{},[2244],{"type":29,"value":2245},"它为了“更优雅”引入新依赖/新抽象",{"type":24,"tag":101,"props":2247,"children":2249},{"id":2248},"工作流-9重复任务做成模板提示词不是一次性",[2250],{"type":29,"value":2251},"工作流 9：重复任务做成模板（提示词不是一次性）",{"type":24,"tag":25,"props":2253,"children":2254},{},[2255,2257,2261],{"type":29,"value":2256},"把高频任务（比如“写组件+样式+验收”）固化成模板，放进 Rules（见：",{"type":24,"tag":1366,"props":2258,"children":2259},{"href":1552},[2260],{"type":29,"value":1555},{"type":29,"value":2262},"）。",{"type":24,"tag":101,"props":2264,"children":2266},{"id":2265},"工作流-10把快捷键表做成你自己的任务表",[2267],{"type":29,"value":2268},"工作流 10：把“快捷键表”做成你自己的任务表",{"type":24,"tag":25,"props":2270,"children":2271},{},[2272],{"type":29,"value":2273},"你不需要记住所有快捷键，只需要记住：",{"type":24,"tag":32,"props":2275,"children":2276},{},[2277,2287,2297,2307],{"type":24,"tag":36,"props":2278,"children":2279},{},[2280,2282],{"type":29,"value":2281},"小步改：",{"type":24,"tag":522,"props":2283,"children":2285},{"className":2284},[],[2286],{"type":29,"value":1937},{"type":24,"tag":36,"props":2288,"children":2289},{},[2290,2292],{"type":29,"value":2291},"先对齐：",{"type":24,"tag":522,"props":2293,"children":2295},{"className":2294},[],[2296],{"type":29,"value":1903},{"type":24,"tag":36,"props":2298,"children":2299},{},[2300,2302],{"type":29,"value":2301},"多文件：",{"type":24,"tag":522,"props":2303,"children":2305},{"className":2304},[],[2306],{"type":29,"value":2032},{"type":24,"tag":36,"props":2308,"children":2309},{},[2310,2312],{"type":29,"value":2311},"上下文聚焦：",{"type":24,"tag":522,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":29,"value":2095},{"type":24,"tag":90,"props":2318,"children":2319},{},[],{"type":24,"tag":94,"props":2321,"children":2323},{"id":2322},"必交付物-1最小回归任务清单10-条通用",[2324],{"type":29,"value":2325},"必交付物 1：最小回归任务清单（10 条，通用）",{"type":24,"tag":57,"props":2327,"children":2328},{},[2329],{"type":24,"tag":25,"props":2330,"children":2331},{},[2332],{"type":29,"value":2333},"这份清单的意义：让每次 AI 改动都能“被验证”。否则你只是把不可控变成了更快的不可控。",{"type":24,"tag":71,"props":2335,"children":2336},{},[2337,2342,2347,2352,2357,2362,2367,2372,2377,2382],{"type":24,"tag":36,"props":2338,"children":2339},{},[2340],{"type":29,"value":2341},"关键路径能跑通（手动点击/请求一次）",{"type":24,"tag":36,"props":2343,"children":2344},{},[2345],{"type":29,"value":2346},"错误路径能触发（模拟一次失败输入）",{"type":24,"tag":36,"props":2348,"children":2349},{},[2350],{"type":29,"value":2351},"控制台无新增错误（至少关注 1 次真实操作）",{"type":24,"tag":36,"props":2353,"children":2354},{},[2355],{"type":29,"value":2356},"关键 UI 未错位（移动端/桌面端各看一眼）",{"type":24,"tag":36,"props":2358,"children":2359},{},[2360],{"type":29,"value":2361},"刷新后状态正确（尤其是表单/列表）",{"type":24,"tag":36,"props":2363,"children":2364},{},[2365],{"type":29,"value":2366},"路由跳转没断（从入口到目标页）",{"type":24,"tag":36,"props":2368,"children":2369},{},[2370],{"type":29,"value":2371},"相关接口未改变契约（字段名/类型）",{"type":24,"tag":36,"props":2373,"children":2374},{},[2375],{"type":29,"value":2376},"性能没有明显退化（首屏、交互卡顿）",{"type":24,"tag":36,"props":2378,"children":2379},{},[2380],{"type":29,"value":2381},"回滚方案可执行（知道回滚哪几个文件/commit）",{"type":24,"tag":36,"props":2383,"children":2384},{},[2385],{"type":29,"value":2386},"写下“这次改动解决了什么、风险是什么”（可贴 PR）",{"type":24,"tag":90,"props":2388,"children":2389},{},[],{"type":24,"tag":94,"props":2391,"children":2393},{"id":2392},"必交付物-2失败案例复盘真实会发生",[2394],{"type":29,"value":2395},"必交付物 2：失败案例复盘（真实会发生）",{"type":24,"tag":101,"props":2397,"children":2399},{"id":2398},"现象快捷键用得很熟但交付还是慢",[2400],{"type":29,"value":2401},"现象：快捷键用得很熟，但交付还是慢",{"type":24,"tag":25,"props":2403,"children":2404},{},[2405],{"type":29,"value":2406},"典型原因：你把 Cursor 当成“更聪明的搜索框”，不断对话，直到它给出你想要的答案。",{"type":24,"tag":25,"props":2408,"children":2409},{},[2410],{"type":29,"value":2411},"复现路径：",{"type":24,"tag":32,"props":2413,"children":2414},{},[2415,2420,2425,2430],{"type":24,"tag":36,"props":2416,"children":2417},{},[2418],{"type":29,"value":2419},"你直接说“把页面做得更好看、更高级”",{"type":24,"tag":36,"props":2421,"children":2422},{},[2423],{"type":29,"value":2424},"AI 开始大改样式、抽象组件、甚至引入新依赖",{"type":24,"tag":36,"props":2426,"children":2427},{},[2428],{"type":29,"value":2429},"你为了省事按了“接受建议”",{"type":24,"tag":36,"props":2431,"children":2432},{},[2433],{"type":29,"value":2434},"最后发现：设计没统一、移动端崩、甚至埋了性能问题",{"type":24,"tag":25,"props":2436,"children":2437},{},[2438,2440,2444,2446,2451],{"type":29,"value":2439},"根因：缺少",{"type":24,"tag":119,"props":2441,"children":2442},{},[2443],{"type":29,"value":1620},{"type":29,"value":2445},"与",{"type":24,"tag":119,"props":2447,"children":2448},{},[2449],{"type":29,"value":2450},"验收",{"type":29,"value":2452},"。",{"type":24,"tag":25,"props":2454,"children":2455},{},[2456],{"type":29,"value":2457},"修复方式（可照抄）：",{"type":24,"tag":32,"props":2459,"children":2460},{},[2461,2466,2478],{"type":24,"tag":36,"props":2462,"children":2463},{},[2464],{"type":29,"value":2465},"把需求拆成 3 个可验证目标：例如“按钮样式统一”“首屏 CTA 更明显”“移动端间距不挤”",{"type":24,"tag":36,"props":2467,"children":2468},{},[2469,2471,2476],{"type":29,"value":2470},"每个目标只用 ",{"type":24,"tag":522,"props":2472,"children":2474},{"className":2473},[],[2475],{"type":29,"value":1937},{"type":29,"value":2477}," 改一个局部",{"type":24,"tag":36,"props":2479,"children":2480},{},[2481],{"type":29,"value":2482},"每次接受建议前跑一遍“最小回归集”",{"type":24,"tag":90,"props":2484,"children":2485},{},[],{"type":24,"tag":94,"props":2487,"children":2489},{"id":2488},"faq高频问题",[2490],{"type":29,"value":2491},"FAQ（高频问题）",{"type":24,"tag":101,"props":2493,"children":2495},{"id":2494},"q1我应该先记快捷键还是先学工作流",[2496],{"type":29,"value":2497},"Q1：我应该先记快捷键还是先学工作流？",{"type":24,"tag":25,"props":2499,"children":2500},{},[2501],{"type":29,"value":2502},"先学工作流。快捷键只是把工作流的步骤变短。",{"type":24,"tag":101,"props":2504,"children":2506},{"id":2505},"q2为什么我一用多文件就容易翻车",[2507],{"type":29,"value":2508},"Q2：为什么我一用多文件就容易翻车？",{"type":24,"tag":25,"props":2510,"children":2511},{},[2512],{"type":29,"value":2513},"因为多文件意味着范围更大、依赖更多、验收更难。先锁定“文件清单 + 每步验收”，再让它动手。",{"type":24,"tag":101,"props":2515,"children":2517},{"id":2516},"q3有没有万能提示词",[2518],{"type":29,"value":2519},"Q3：有没有“万能提示词”？",{"type":24,"tag":25,"props":2521,"children":2522},{},[2523],{"type":29,"value":2524},"没有，但有“万能结构”：目标、范围、非目标、验收、输出格式。",{"type":24,"tag":90,"props":2526,"children":2527},{},[],{"type":24,"tag":94,"props":2529,"children":2531},{"id":2530},"延伸阅读建议按顺序",[2532],{"type":29,"value":2533},"延伸阅读（建议按顺序）",{"type":24,"tag":32,"props":2535,"children":2536},{},[2537,2544,2551,2558],{"type":24,"tag":36,"props":2538,"children":2539},{},[2540],{"type":24,"tag":1366,"props":2541,"children":2542},{"href":1530},[2543],{"type":29,"value":1533},{"type":24,"tag":36,"props":2545,"children":2546},{},[2547],{"type":24,"tag":1366,"props":2548,"children":2549},{"href":1541},[2550],{"type":29,"value":1544},{"type":24,"tag":36,"props":2552,"children":2553},{},[2554],{"type":24,"tag":1366,"props":2555,"children":2556},{"href":1552},[2557],{"type":29,"value":1555},{"type":24,"tag":36,"props":2559,"children":2560},{},[2561,2563],{"type":29,"value":2562},"如果你更关心“网页制作落地”：看这篇 ",{"type":24,"tag":1366,"props":2564,"children":2566},{"href":2565},"/topics/practical-tips/htmlpage-quick-landing-page",[2567],{"type":29,"value":2568},"3 分钟用 HTMLPAGE 做落地页",{"title":7,"searchDepth":1391,"depth":1391,"links":2570},[2571,2572,2573,2585,2586,2589,2594],{"id":1561,"depth":1394,"text":1564},{"id":1636,"depth":1394,"text":1639},{"id":1882,"depth":1394,"text":1885,"children":2574},[2575,2576,2577,2578,2579,2580,2581,2582,2583,2584],{"id":1888,"depth":1391,"text":1891},{"id":1947,"depth":1391,"text":1950},{"id":2017,"depth":1391,"text":2020},{"id":2073,"depth":1391,"text":2076},{"id":2113,"depth":1391,"text":2116},{"id":2152,"depth":1391,"text":2155},{"id":2171,"depth":1391,"text":2174},{"id":2213,"depth":1391,"text":2216},{"id":2248,"depth":1391,"text":2251},{"id":2265,"depth":1391,"text":2268},{"id":2322,"depth":1394,"text":2325},{"id":2392,"depth":1394,"text":2395,"children":2587},[2588],{"id":2398,"depth":1391,"text":2401},{"id":2488,"depth":1394,"text":2491,"children":2590},[2591,2592,2593],{"id":2494,"depth":1391,"text":2497},{"id":2505,"depth":1391,"text":2508},{"id":2516,"depth":1391,"text":2519},{"id":2530,"depth":1394,"text":2533},"content:topics:ai:cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet",{"_path":2599,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2600,"description":2601,"date":10,"topic":5,"author":11,"tags":2602,"image":2606,"imageAlt":2607,"pexelsPhotoId":2608,"pexelsUrl":2609,"readingTime":2610,"body":2611,"_type":1435,"_id":3544,"_source":1437,"_file":3545,"_stem":3546,"_extension":1440},"/topics/ai/cursor-vs-copilot-vscode-workflow","Cursor vs GitHub Copilot vs VS Code：怎么选、怎么搭配、怎么把风险关在笼子里","用“任务类型×风险×验收成本”的选择矩阵解释 Cursor/Copilot/VS Code 的差异，并给出一套可落地的协作工作流（范围闸门、最小回归集、回滚策略）。",[1448,2603,1451,2604,2605],"GitHub Copilot","AI 编程","工作流","/images/topics/ai/cursor-vs-copilot-vscode-workflow.jpg","团队在电脑前进行协作讨论",1181371,"https://www.pexels.com/photo/man-wearing-blue-dress-shirt-1181371/",15,{"type":21,"children":2612,"toc":3522},[2613,2618,2623,2641,2646,2664,2667,2673,2678,2709,2714,2717,2723,2731,2935,2943,2956,2959,2965,2971,2984,2989,3002,3008,3013,3046,3052,3057,3075,3078,3084,3089,3095,3100,3133,3139,3152,3157,3170,3176,3188,3194,3199,3212,3217,3220,3226,3231,3352,3355,3361,3371,3380,3398,3407,3415,3424,3442,3445,3451,3457,3462,3468,3473,3476,3481],{"type":24,"tag":25,"props":2614,"children":2615},{},[2616],{"type":29,"value":2617},"“Cursor 和 Copilot 到底有什么区别？”",{"type":24,"tag":25,"props":2619,"children":2620},{},[2621],{"type":29,"value":2622},"这个问题问得越早越好，因为你一旦把工具选错，后面所有痛苦都不是“提示词不够好”，而是：",{"type":24,"tag":32,"props":2624,"children":2625},{},[2626,2631,2636],{"type":24,"tag":36,"props":2627,"children":2628},{},[2629],{"type":29,"value":2630},"改动不可控（范围漂移、改错文件）",{"type":24,"tag":36,"props":2632,"children":2633},{},[2634],{"type":29,"value":2635},"验收成本爆炸（不知道要测什么）",{"type":24,"tag":36,"props":2637,"children":2638},{},[2639],{"type":29,"value":2640},"团队协作崩盘（没有闸门、没有回滚）",{"type":24,"tag":25,"props":2642,"children":2643},{},[2644],{"type":29,"value":2645},"这篇文章用一张选择矩阵 + 一套可执行工作流，帮你做到两件事：",{"type":24,"tag":71,"props":2647,"children":2648},{},[2649,2654],{"type":24,"tag":36,"props":2650,"children":2651},{},[2652],{"type":29,"value":2653},"知道什么时候用 Cursor、什么时候用 Copilot、什么时候“纯 VS Code 更快”",{"type":24,"tag":36,"props":2655,"children":2656},{},[2657,2659],{"type":29,"value":2658},"就算用 AI，也能把风险关在笼子里：",{"type":24,"tag":119,"props":2660,"children":2661},{},[2662],{"type":29,"value":2663},"可审查、可验证、可回滚",{"type":24,"tag":90,"props":2665,"children":2666},{},[],{"type":24,"tag":94,"props":2668,"children":2670},{"id":2669},"结论先说三者不是互斥而是分工",[2671],{"type":29,"value":2672},"结论先说：三者不是互斥，而是分工",{"type":24,"tag":25,"props":2674,"children":2675},{},[2676],{"type":29,"value":2677},"你可以把它们看成三层能力：",{"type":24,"tag":32,"props":2679,"children":2680},{},[2681,2690,2700],{"type":24,"tag":36,"props":2682,"children":2683},{},[2684,2688],{"type":24,"tag":119,"props":2685,"children":2686},{},[2687],{"type":29,"value":1451},{"type":29,"value":2689},"：编辑器与生态（调试、插件、任务、终端、语言服务）",{"type":24,"tag":36,"props":2691,"children":2692},{},[2693,2698],{"type":24,"tag":119,"props":2694,"children":2695},{},[2696],{"type":29,"value":2697},"Copilot",{"type":29,"value":2699},"：代码补全与局部建议（“我正在写这一行/这一段”）",{"type":24,"tag":36,"props":2701,"children":2702},{},[2703,2707],{"type":24,"tag":119,"props":2704,"children":2705},{},[2706],{"type":29,"value":1448},{"type":29,"value":2708},"：以项目为单位的 AI 协作（对话、索引、多文件编辑、规则）",{"type":24,"tag":25,"props":2710,"children":2711},{},[2712],{"type":29,"value":2713},"最常见的误区是：把“局部补全能力”当作“能做架构与多文件落地”。",{"type":24,"tag":90,"props":2715,"children":2716},{},[],{"type":24,"tag":94,"props":2718,"children":2720},{"id":2719},"选择矩阵按任务类型选工具不是按偏好",[2721],{"type":29,"value":2722},"选择矩阵：按任务类型选工具（不是按偏好）",{"type":24,"tag":57,"props":2724,"children":2725},{},[2726],{"type":24,"tag":25,"props":2727,"children":2728},{},[2729],{"type":29,"value":2730},"你只要把自己的任务放进表格，就能得到推荐路径。",{"type":24,"tag":1646,"props":2732,"children":2733},{},[2734,2766],{"type":24,"tag":1650,"props":2735,"children":2736},{},[2737],{"type":24,"tag":1654,"props":2738,"children":2739},{},[2740,2745,2751,2756,2761],{"type":24,"tag":1658,"props":2741,"children":2742},{},[2743],{"type":29,"value":2744},"任务类型",{"type":24,"tag":1658,"props":2746,"children":2748},{"align":2747},"right",[2749],{"type":29,"value":2750},"风险",{"type":24,"tag":1658,"props":2752,"children":2753},{"align":2747},[2754],{"type":29,"value":2755},"验收成本",{"type":24,"tag":1658,"props":2757,"children":2758},{},[2759],{"type":29,"value":2760},"更推荐",{"type":24,"tag":1658,"props":2762,"children":2763},{},[2764],{"type":29,"value":2765},"为什么",{"type":24,"tag":1679,"props":2767,"children":2768},{},[2769,2796,2829,2855,2882,2909],{"type":24,"tag":1654,"props":2770,"children":2771},{},[2772,2777,2782,2786,2791],{"type":24,"tag":1686,"props":2773,"children":2774},{},[2775],{"type":29,"value":2776},"写一段代码/补一个 if",{"type":24,"tag":1686,"props":2778,"children":2779},{"align":2747},[2780],{"type":29,"value":2781},"低",{"type":24,"tag":1686,"props":2783,"children":2784},{"align":2747},[2785],{"type":29,"value":2781},{"type":24,"tag":1686,"props":2787,"children":2788},{},[2789],{"type":29,"value":2790},"Copilot / Cursor 内联编辑",{"type":24,"tag":1686,"props":2792,"children":2793},{},[2794],{"type":29,"value":2795},"局部建议足够，成本最低",{"type":24,"tag":1654,"props":2797,"children":2798},{},[2799,2804,2809,2813,2824],{"type":24,"tag":1686,"props":2800,"children":2801},{},[2802],{"type":29,"value":2803},"重构一个函数",{"type":24,"tag":1686,"props":2805,"children":2806},{"align":2747},[2807],{"type":29,"value":2808},"中",{"type":24,"tag":1686,"props":2810,"children":2811},{"align":2747},[2812],{"type":29,"value":2808},{"type":24,"tag":1686,"props":2814,"children":2815},{},[2816,2818],{"type":29,"value":2817},"Cursor ",{"type":24,"tag":522,"props":2819,"children":2821},{"className":2820},[],[2822],{"type":29,"value":2823},"内联编辑",{"type":24,"tag":1686,"props":2825,"children":2826},{},[2827],{"type":29,"value":2828},"需要解释、需要约束输出",{"type":24,"tag":1654,"props":2830,"children":2831},{},[2832,2837,2841,2845,2850],{"type":24,"tag":1686,"props":2833,"children":2834},{},[2835],{"type":29,"value":2836},"改一个组件 + 样式",{"type":24,"tag":1686,"props":2838,"children":2839},{"align":2747},[2840],{"type":29,"value":2808},{"type":24,"tag":1686,"props":2842,"children":2843},{"align":2747},[2844],{"type":29,"value":2808},{"type":24,"tag":1686,"props":2846,"children":2847},{},[2848],{"type":29,"value":2849},"Cursor（小范围多文件）",{"type":24,"tag":1686,"props":2851,"children":2852},{},[2853],{"type":29,"value":2854},"需要同时改模板与样式",{"type":24,"tag":1654,"props":2856,"children":2857},{},[2858,2863,2868,2872,2877],{"type":24,"tag":1686,"props":2859,"children":2860},{},[2861],{"type":29,"value":2862},"改 3~5 个文件（组件+api+测试）",{"type":24,"tag":1686,"props":2864,"children":2865},{"align":2747},[2866],{"type":29,"value":2867},"高",{"type":24,"tag":1686,"props":2869,"children":2870},{"align":2747},[2871],{"type":29,"value":2867},{"type":24,"tag":1686,"props":2873,"children":2874},{},[2875],{"type":29,"value":2876},"Cursor Composer + 闸门",{"type":24,"tag":1686,"props":2878,"children":2879},{},[2880],{"type":29,"value":2881},"需要计划、验收、回滚",{"type":24,"tag":1654,"props":2883,"children":2884},{},[2885,2890,2895,2899,2904],{"type":24,"tag":1686,"props":2886,"children":2887},{},[2888],{"type":29,"value":2889},"重写一段架构/引入新依赖",{"type":24,"tag":1686,"props":2891,"children":2892},{"align":2747},[2893],{"type":29,"value":2894},"很高",{"type":24,"tag":1686,"props":2896,"children":2897},{"align":2747},[2898],{"type":29,"value":2894},{"type":24,"tag":1686,"props":2900,"children":2901},{},[2902],{"type":29,"value":2903},"先人脑设计 + VS Code 实现",{"type":24,"tag":1686,"props":2905,"children":2906},{},[2907],{"type":29,"value":2908},"AI 易发散，最好先设计再执行",{"type":24,"tag":1654,"props":2910,"children":2911},{},[2912,2917,2921,2925,2930],{"type":24,"tag":1686,"props":2913,"children":2914},{},[2915],{"type":29,"value":2916},"排查线上问题/性能抖动",{"type":24,"tag":1686,"props":2918,"children":2919},{"align":2747},[2920],{"type":29,"value":2867},{"type":24,"tag":1686,"props":2922,"children":2923},{"align":2747},[2924],{"type":29,"value":2894},{"type":24,"tag":1686,"props":2926,"children":2927},{},[2928],{"type":29,"value":2929},"VS Code + 工具链优先，AI 辅助归纳",{"type":24,"tag":1686,"props":2931,"children":2932},{},[2933],{"type":29,"value":2934},"需要证据，不要“猜”",{"type":24,"tag":25,"props":2936,"children":2937},{},[2938],{"type":24,"tag":119,"props":2939,"children":2940},{},[2941],{"type":29,"value":2942},"一句话规则：",{"type":24,"tag":32,"props":2944,"children":2945},{},[2946,2951],{"type":24,"tag":36,"props":2947,"children":2948},{},[2949],{"type":29,"value":2950},"当你的改动可以用“10 条最小回归集”覆盖时，用 Cursor。",{"type":24,"tag":36,"props":2952,"children":2953},{},[2954],{"type":29,"value":2955},"当你的改动无法验证时，先别让 AI 动手。",{"type":24,"tag":90,"props":2957,"children":2958},{},[],{"type":24,"tag":94,"props":2960,"children":2962},{"id":2961},"差异拆解到底差在哪里",[2963],{"type":29,"value":2964},"差异拆解：到底差在哪里？",{"type":24,"tag":101,"props":2966,"children":2968},{"id":2967},"_1-上下文来源补全-vs-项目索引",[2969],{"type":29,"value":2970},"1) 上下文来源：补全 vs 项目索引",{"type":24,"tag":32,"props":2972,"children":2973},{},[2974,2979],{"type":24,"tag":36,"props":2975,"children":2976},{},[2977],{"type":29,"value":2978},"Copilot 更擅长：你正在写的这几行、当前文件的局部上下文",{"type":24,"tag":36,"props":2980,"children":2981},{},[2982],{"type":29,"value":2983},"Cursor 更擅长：项目级索引 + 多文件关联理解",{"type":24,"tag":25,"props":2985,"children":2986},{},[2987],{"type":29,"value":2988},"因此：",{"type":24,"tag":32,"props":2990,"children":2991},{},[2992,2997],{"type":24,"tag":36,"props":2993,"children":2994},{},[2995],{"type":29,"value":2996},"写代码片段：Copilot 速度更快",{"type":24,"tag":36,"props":2998,"children":2999},{},[3000],{"type":29,"value":3001},"改一坨工程：Cursor 更有胜算（但更需要闸门）",{"type":24,"tag":101,"props":3003,"children":3005},{"id":3004},"_2-交互方式你能不能控制范围",[3006],{"type":29,"value":3007},"2) 交互方式：你能不能控制范围",{"type":24,"tag":25,"props":3009,"children":3010},{},[3011],{"type":29,"value":3012},"范围控制的三个层级：",{"type":24,"tag":71,"props":3014,"children":3015},{},[3016,3026,3036],{"type":24,"tag":36,"props":3017,"children":3018},{},[3019,3021],{"type":29,"value":3020},"内联编辑（选中一段）→ ",{"type":24,"tag":119,"props":3022,"children":3023},{},[3024],{"type":29,"value":3025},"最强范围控制",{"type":24,"tag":36,"props":3027,"children":3028},{},[3029,3031],{"type":29,"value":3030},"Composer 多文件（先列文件清单）→ ",{"type":24,"tag":119,"props":3032,"children":3033},{},[3034],{"type":29,"value":3035},"可控但要闸门",{"type":24,"tag":36,"props":3037,"children":3038},{},[3039,3041],{"type":29,"value":3040},"大对话（泛目标）→ ",{"type":24,"tag":119,"props":3042,"children":3043},{},[3044],{"type":29,"value":3045},"最容易跑偏",{"type":24,"tag":101,"props":3047,"children":3049},{"id":3048},"_3-输出形态建议-vs-可审查的变更",[3050],{"type":29,"value":3051},"3) 输出形态：建议 vs 可审查的变更",{"type":24,"tag":25,"props":3053,"children":3054},{},[3055],{"type":29,"value":3056},"最好的 AI 输出不是“给我一段代码”，而是：",{"type":24,"tag":32,"props":3058,"children":3059},{},[3060,3065,3070],{"type":24,"tag":36,"props":3061,"children":3062},{},[3063],{"type":29,"value":3064},"改动摘要（做了什么）",{"type":24,"tag":36,"props":3066,"children":3067},{},[3068],{"type":29,"value":3069},"diff 级别的可审查变更",{"type":24,"tag":36,"props":3071,"children":3072},{},[3073],{"type":29,"value":3074},"验收步骤与回滚方案",{"type":24,"tag":90,"props":3076,"children":3077},{},[],{"type":24,"tag":94,"props":3079,"children":3081},{"id":3080},"一套可落地的团队工作流把风险关住",[3082],{"type":29,"value":3083},"一套可落地的团队工作流（把风险关住）",{"type":24,"tag":25,"props":3085,"children":3086},{},[3087],{"type":29,"value":3088},"下面这套流程，你可以直接写进团队规范：",{"type":24,"tag":101,"props":3090,"children":3092},{"id":3091},"step-1先写任务单geo-友好结构",[3093],{"type":29,"value":3094},"Step 1：先写任务单（GEO 友好结构）",{"type":24,"tag":25,"props":3096,"children":3097},{},[3098],{"type":29,"value":3099},"模板：",{"type":24,"tag":32,"props":3101,"children":3102},{},[3103,3108,3113,3118,3123,3128],{"type":24,"tag":36,"props":3104,"children":3105},{},[3106],{"type":29,"value":3107},"目标：……",{"type":24,"tag":36,"props":3109,"children":3110},{},[3111],{"type":29,"value":3112},"背景：……",{"type":24,"tag":36,"props":3114,"children":3115},{},[3116],{"type":29,"value":3117},"范围：只改这些文件/模块：……",{"type":24,"tag":36,"props":3119,"children":3120},{},[3121],{"type":29,"value":3122},"非目标：不做哪些事情：……",{"type":24,"tag":36,"props":3124,"children":3125},{},[3126],{"type":29,"value":3127},"验收：如何判断完成（可测试/可观察）：……",{"type":24,"tag":36,"props":3129,"children":3130},{},[3131],{"type":29,"value":3132},"回滚：如果失败怎么撤回：……",{"type":24,"tag":101,"props":3134,"children":3136},{"id":3135},"step-2用范围闸门限制-ai",[3137],{"type":29,"value":3138},"Step 2：用“范围闸门”限制 AI",{"type":24,"tag":32,"props":3140,"children":3141},{},[3142,3147],{"type":24,"tag":36,"props":3143,"children":3144},{},[3145],{"type":29,"value":3146},"单文件改动：优先 Cursor 内联编辑",{"type":24,"tag":36,"props":3148,"children":3149},{},[3150],{"type":29,"value":3151},"多文件改动：必须先让 AI 输出“文件清单（≤5）+ 每步验收”",{"type":24,"tag":25,"props":3153,"children":3154},{},[3155],{"type":29,"value":3156},"如果 AI 输出的文件清单超过 5 个：",{"type":24,"tag":32,"props":3158,"children":3159},{},[3160,3165],{"type":24,"tag":36,"props":3161,"children":3162},{},[3163],{"type":29,"value":3164},"不是它太强，是任务太大",{"type":24,"tag":36,"props":3166,"children":3167},{},[3168],{"type":29,"value":3169},"你需要拆任务，而不是继续推进",{"type":24,"tag":101,"props":3171,"children":3173},{"id":3172},"step-3最小回归集10-条",[3174],{"type":29,"value":3175},"Step 3：最小回归集（10 条）",{"type":24,"tag":25,"props":3177,"children":3178},{},[3179,3181,3186],{"type":29,"value":3180},"每次接受改动前必须跑（可参考：",{"type":24,"tag":1366,"props":3182,"children":3183},{"href":1443},[3184],{"type":29,"value":3185},"Cursor 快捷键速查表",{"type":29,"value":3187}," 里的清单）。",{"type":24,"tag":101,"props":3189,"children":3191},{"id":3190},"step-4回滚策略不用等事故才想",[3192],{"type":29,"value":3193},"Step 4：回滚策略（不用等事故才想）",{"type":24,"tag":25,"props":3195,"children":3196},{},[3197],{"type":29,"value":3198},"回滚最常见的两条路：",{"type":24,"tag":32,"props":3200,"children":3201},{},[3202,3207],{"type":24,"tag":36,"props":3203,"children":3204},{},[3205],{"type":29,"value":3206},"git 回滚 commit",{"type":24,"tag":36,"props":3208,"children":3209},{},[3210],{"type":29,"value":3211},"对关键文件保留前版本（至少能快速恢复）",{"type":24,"tag":25,"props":3213,"children":3214},{},[3215],{"type":29,"value":3216},"你需要做到：任何一轮 AI 改动都能在 5 分钟内撤回。",{"type":24,"tag":90,"props":3218,"children":3219},{},[],{"type":24,"tag":94,"props":3221,"children":3223},{"id":3222},"必交付物对比矩阵可复制",[3224],{"type":29,"value":3225},"必交付物：对比矩阵（可复制）",{"type":24,"tag":25,"props":3227,"children":3228},{},[3229],{"type":29,"value":3230},"下面这张表可以直接贴到你的团队 wiki：",{"type":24,"tag":1646,"props":3232,"children":3233},{},[3234,3257],{"type":24,"tag":1650,"props":3235,"children":3236},{},[3237],{"type":24,"tag":1654,"props":3238,"children":3239},{},[3240,3245,3249,3253],{"type":24,"tag":1658,"props":3241,"children":3242},{},[3243],{"type":29,"value":3244},"维度",{"type":24,"tag":1658,"props":3246,"children":3247},{},[3248],{"type":29,"value":1451},{"type":24,"tag":1658,"props":3250,"children":3251},{},[3252],{"type":29,"value":2697},{"type":24,"tag":1658,"props":3254,"children":3255},{},[3256],{"type":29,"value":1448},{"type":24,"tag":1679,"props":3258,"children":3259},{},[3260,3283,3306,3329],{"type":24,"tag":1654,"props":3261,"children":3262},{},[3263,3268,3273,3278],{"type":24,"tag":1686,"props":3264,"children":3265},{},[3266],{"type":29,"value":3267},"强项",{"type":24,"tag":1686,"props":3269,"children":3270},{},[3271],{"type":29,"value":3272},"工具链、调试、生态",{"type":24,"tag":1686,"props":3274,"children":3275},{},[3276],{"type":29,"value":3277},"补全与局部建议",{"type":24,"tag":1686,"props":3279,"children":3280},{},[3281],{"type":29,"value":3282},"项目上下文、多文件落地",{"type":24,"tag":1654,"props":3284,"children":3285},{},[3286,3291,3296,3301],{"type":24,"tag":1686,"props":3287,"children":3288},{},[3289],{"type":29,"value":3290},"适合任务",{"type":24,"tag":1686,"props":3292,"children":3293},{},[3294],{"type":29,"value":3295},"排查、调试、验证",{"type":24,"tag":1686,"props":3297,"children":3298},{},[3299],{"type":29,"value":3300},"写一段、补一段",{"type":24,"tag":1686,"props":3302,"children":3303},{},[3304],{"type":29,"value":3305},"改一段、改一组文件",{"type":24,"tag":1654,"props":3307,"children":3308},{},[3309,3314,3319,3324],{"type":24,"tag":1686,"props":3310,"children":3311},{},[3312],{"type":29,"value":3313},"最大风险",{"type":24,"tag":1686,"props":3315,"children":3316},{},[3317],{"type":29,"value":3318},"无",{"type":24,"tag":1686,"props":3320,"children":3321},{},[3322],{"type":29,"value":3323},"过度依赖建议",{"type":24,"tag":1686,"props":3325,"children":3326},{},[3327],{"type":29,"value":3328},"范围漂移、多文件回归",{"type":24,"tag":1654,"props":3330,"children":3331},{},[3332,3337,3342,3347],{"type":24,"tag":1686,"props":3333,"children":3334},{},[3335],{"type":29,"value":3336},"必须搭配",{"type":24,"tag":1686,"props":3338,"children":3339},{},[3340],{"type":29,"value":3341},"规范与检查",{"type":24,"tag":1686,"props":3343,"children":3344},{},[3345],{"type":29,"value":3346},"代码评审",{"type":24,"tag":1686,"props":3348,"children":3349},{},[3350],{"type":29,"value":3351},"闸门 + 最小回归集",{"type":24,"tag":90,"props":3353,"children":3354},{},[],{"type":24,"tag":94,"props":3356,"children":3358},{"id":3357},"失败案例多文件看似成功实际埋雷",[3359],{"type":29,"value":3360},"失败案例：多文件“看似成功”，实际埋雷",{"type":24,"tag":25,"props":3362,"children":3363},{},[3364,3369],{"type":24,"tag":119,"props":3365,"children":3366},{},[3367],{"type":29,"value":3368},"现象",{"type":29,"value":3370},"：AI 说“我已经把所有地方都改了”，你也接受了，结果上线后 404 或样式错位。",{"type":24,"tag":25,"props":3372,"children":3373},{},[3374,3379],{"type":24,"tag":119,"props":3375,"children":3376},{},[3377],{"type":29,"value":3378},"复现条件",{"type":29,"value":2192},{"type":24,"tag":32,"props":3381,"children":3382},{},[3383,3388,3393],{"type":24,"tag":36,"props":3384,"children":3385},{},[3386],{"type":29,"value":3387},"你给了一个大目标（例如“把所有按钮统一成主题色”）",{"type":24,"tag":36,"props":3389,"children":3390},{},[3391],{"type":29,"value":3392},"它改了组件、样式、甚至主题配置",{"type":24,"tag":36,"props":3394,"children":3395},{},[3396],{"type":29,"value":3397},"你没有按页面模块走一遍，直接合并",{"type":24,"tag":25,"props":3399,"children":3400},{},[3401,3406],{"type":24,"tag":119,"props":3402,"children":3403},{},[3404],{"type":29,"value":3405},"根因",{"type":29,"value":2192},{"type":24,"tag":32,"props":3408,"children":3409},{},[3410],{"type":24,"tag":36,"props":3411,"children":3412},{},[3413],{"type":29,"value":3414},"改动范围大，但验收仍按“小改动”的方式做（只看一处）",{"type":24,"tag":25,"props":3416,"children":3417},{},[3418,3423],{"type":24,"tag":119,"props":3419,"children":3420},{},[3421],{"type":29,"value":3422},"修复",{"type":29,"value":2192},{"type":24,"tag":32,"props":3425,"children":3426},{},[3427,3432,3437],{"type":24,"tag":36,"props":3428,"children":3429},{},[3430],{"type":29,"value":3431},"强制把任务拆成“模块级目标”：Hero、Feature、Pricing、Form",{"type":24,"tag":36,"props":3433,"children":3434},{},[3435],{"type":29,"value":3436},"每个模块改完就验收一次",{"type":24,"tag":36,"props":3438,"children":3439},{},[3440],{"type":29,"value":3441},"验收通过再进入下一个模块",{"type":24,"tag":90,"props":3443,"children":3444},{},[],{"type":24,"tag":94,"props":3446,"children":3448},{"id":3447},"faq",[3449],{"type":29,"value":3450},"FAQ",{"type":24,"tag":101,"props":3452,"children":3454},{"id":3453},"q1我已经用了-cursor为什么还要用-copilot",[3455],{"type":29,"value":3456},"Q1：我已经用了 Cursor，为什么还要用 Copilot？",{"type":24,"tag":25,"props":3458,"children":3459},{},[3460],{"type":29,"value":3461},"因为“补全”这种高频低风险任务，Copilot 的交互成本更低；Cursor 更适合需要解释与约束的改动。",{"type":24,"tag":101,"props":3463,"children":3465},{"id":3464},"q2什么时候应该完全不用-ai",[3466],{"type":29,"value":3467},"Q2：什么时候应该完全不用 AI？",{"type":24,"tag":25,"props":3469,"children":3470},{},[3471],{"type":29,"value":3472},"当你无法定义验收标准时。比如“更高级”“更好看”这种目标，先做信息结构与设计规则，再让 AI 帮你落地局部。",{"type":24,"tag":90,"props":3474,"children":3475},{},[],{"type":24,"tag":94,"props":3477,"children":3479},{"id":3478},"延伸阅读",[3480],{"type":29,"value":3478},{"type":24,"tag":32,"props":3482,"children":3483},{},[3484,3493,3502,3511],{"type":24,"tag":36,"props":3485,"children":3486},{},[3487,3489],{"type":29,"value":3488},"Cursor 入门：",{"type":24,"tag":1366,"props":3490,"children":3491},{"href":1530},[3492],{"type":29,"value":1533},{"type":24,"tag":36,"props":3494,"children":3495},{},[3496,3498],{"type":29,"value":3497},"Cursor 进阶：",{"type":24,"tag":1366,"props":3499,"children":3500},{"href":1541},[3501],{"type":29,"value":1544},{"type":24,"tag":36,"props":3503,"children":3504},{},[3505,3507],{"type":29,"value":3506},"规则配置：",{"type":24,"tag":1366,"props":3508,"children":3509},{"href":1552},[3510],{"type":29,"value":1555},{"type":24,"tag":36,"props":3512,"children":3513},{},[3514,3516],{"type":29,"value":3515},"Copilot 实战：",{"type":24,"tag":1366,"props":3517,"children":3519},{"href":3518},"/topics/ai/github-copilot-tips",[3520],{"type":29,"value":3521},"GitHub Copilot 实用技巧",{"title":7,"searchDepth":1391,"depth":1391,"links":3523},[3524,3525,3526,3531,3537,3538,3539,3543],{"id":2669,"depth":1394,"text":2672},{"id":2719,"depth":1394,"text":2722},{"id":2961,"depth":1394,"text":2964,"children":3527},[3528,3529,3530],{"id":2967,"depth":1391,"text":2970},{"id":3004,"depth":1391,"text":3007},{"id":3048,"depth":1391,"text":3051},{"id":3080,"depth":1394,"text":3083,"children":3532},[3533,3534,3535,3536],{"id":3091,"depth":1391,"text":3094},{"id":3135,"depth":1391,"text":3138},{"id":3172,"depth":1391,"text":3175},{"id":3190,"depth":1391,"text":3193},{"id":3222,"depth":1394,"text":3225},{"id":3357,"depth":1394,"text":3360},{"id":3447,"depth":1394,"text":3450,"children":3540},[3541,3542],{"id":3453,"depth":1391,"text":3456},{"id":3464,"depth":1391,"text":3467},{"id":3478,"depth":1394,"text":3478},"content:topics:ai:cursor-vs-copilot-vscode-workflow.md","topics/ai/cursor-vs-copilot-vscode-workflow.md","topics/ai/cursor-vs-copilot-vscode-workflow",{"_path":3548,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3549,"description":3550,"date":3551,"topic":5,"author":11,"tags":3552,"image":3557,"featured":3558,"readingTime":2610,"body":3559,"_type":1435,"_id":4208,"_source":1437,"_file":4209,"_stem":4210,"_extension":1440},"/topics/ai/ai-debugging-troubleshooting-guide","AI 辅助调试与问题排查：让 AI 成为你的调试搭档","深入探讨如何利用 AI 工具提升调试效率，包括错误信息分析、日志解读、性能问题定位、复杂 bug 排查等实战场景，构建 AI 驱动的调试工作流。","2026-01-18",[3553,3554,3555,1452,3556],"AI 调试","问题排查","Debug","错误处理","/images/topics/ai/ai-debugging-guide.jpg",true,{"type":21,"children":3560,"toc":4179},[3561,3567,3573,3578,3583,3588,3594,3600,3605,3613,3641,3649,3672,3678,3689,3698,3706,3714,3747,3755,3785,3798,3806,3811,3819,3827,3838,3844,3852,3863,3871,3880,3886,3892,3897,3906,3912,3917,3926,3932,3938,3947,3953,3962,3968,3979,3985,3991,4000,4006,4015,4021,4027,4035,4041,4050,4058,4066,4069,4075,4080,4099,4111,4114,4120,4125,4134,4139,4142,4148,4153,4171],{"type":24,"tag":94,"props":3562,"children":3564},{"id":3563},"ai-辅助调试与问题排查",[3565],{"type":29,"value":3566},"AI 辅助调试与问题排查",{"type":24,"tag":94,"props":3568,"children":3570},{"id":3569},"引言调试的痛与-ai-的解药",[3571],{"type":29,"value":3572},"引言：调试的痛与 AI 的解药",{"type":24,"tag":25,"props":3574,"children":3575},{},[3576],{"type":29,"value":3577},"调试是每个程序员的日常，也是最消耗时间和精力的工作之一。我们都有过这样的经历：盯着一个莫名其妙的错误信息，翻遍 Stack Overflow，尝试各种方案，几个小时后才发现是一个愚蠢的拼写错误。",{"type":24,"tag":25,"props":3579,"children":3580},{},[3581],{"type":29,"value":3582},"AI 工具的出现，正在改变调试的方式。不是替代你的思考，而是加速你的分析过程——帮你快速理解错误、缩小排查范围、验证假设。",{"type":24,"tag":25,"props":3584,"children":3585},{},[3586],{"type":29,"value":3587},"这篇文章分享我在实际项目中使用 AI 辅助调试的经验和方法论。",{"type":24,"tag":94,"props":3589,"children":3591},{"id":3590},"第一部分建立-ai-调试的思维模型",[3592],{"type":29,"value":3593},"第一部分：建立 AI 调试的思维模型",{"type":24,"tag":101,"props":3595,"children":3597},{"id":3596},"_11-ai-在调试中的角色",[3598],{"type":29,"value":3599},"1.1 AI 在调试中的角色",{"type":24,"tag":25,"props":3601,"children":3602},{},[3603],{"type":29,"value":3604},"把 AI 想象成一个经验丰富但不了解你项目的高级工程师。它：",{"type":24,"tag":25,"props":3606,"children":3607},{},[3608],{"type":24,"tag":119,"props":3609,"children":3610},{},[3611],{"type":29,"value":3612},"擅长的事情：",{"type":24,"tag":32,"props":3614,"children":3615},{},[3616,3621,3626,3631,3636],{"type":24,"tag":36,"props":3617,"children":3618},{},[3619],{"type":29,"value":3620},"解读错误信息的含义",{"type":24,"tag":36,"props":3622,"children":3623},{},[3624],{"type":29,"value":3625},"提供可能的原因列表",{"type":24,"tag":36,"props":3627,"children":3628},{},[3629],{"type":29,"value":3630},"给出排查方向建议",{"type":24,"tag":36,"props":3632,"children":3633},{},[3634],{"type":29,"value":3635},"解释复杂的技术概念",{"type":24,"tag":36,"props":3637,"children":3638},{},[3639],{"type":29,"value":3640},"生成调试代码片段",{"type":24,"tag":25,"props":3642,"children":3643},{},[3644],{"type":24,"tag":119,"props":3645,"children":3646},{},[3647],{"type":29,"value":3648},"不擅长的事情：",{"type":24,"tag":32,"props":3650,"children":3651},{},[3652,3657,3662,3667],{"type":24,"tag":36,"props":3653,"children":3654},{},[3655],{"type":29,"value":3656},"了解你的业务逻辑",{"type":24,"tag":36,"props":3658,"children":3659},{},[3660],{"type":29,"value":3661},"知道你的代码历史",{"type":24,"tag":36,"props":3663,"children":3664},{},[3665],{"type":29,"value":3666},"理解项目特定的约定",{"type":24,"tag":36,"props":3668,"children":3669},{},[3670],{"type":29,"value":3671},"做出架构级判断",{"type":24,"tag":101,"props":3673,"children":3675},{"id":3674},"_12-有效提问的结构",[3676],{"type":29,"value":3677},"1.2 有效提问的结构",{"type":24,"tag":3679,"props":3680,"children":3684},"pre",{"code":3681,"language":1435,"meta":7,"className":3682},"## 高效的调试提问模板\n\n**问题描述**\n[简洁描述遇到的问题]\n\n**错误信息**\n",[3683],"language-markdown",[3685],{"type":24,"tag":522,"props":3686,"children":3687},{"__ignoreMap":7},[3688],{"type":29,"value":3681},{"type":24,"tag":25,"props":3690,"children":3691},{},[3692],{"type":24,"tag":3693,"props":3694,"children":3695},"span",{},[3696],{"type":29,"value":3697},"完整的错误信息，不要截断",{"type":24,"tag":3679,"props":3699,"children":3701},{"code":3700},"\n**相关代码**\n```javascript\n[精简但完整的相关代码]\n",[3702],{"type":24,"tag":522,"props":3703,"children":3704},{"__ignoreMap":7},[3705],{"type":29,"value":3700},{"type":24,"tag":25,"props":3707,"children":3708},{},[3709],{"type":24,"tag":119,"props":3710,"children":3711},{},[3712],{"type":29,"value":3713},"环境信息",{"type":24,"tag":32,"props":3715,"children":3716},{},[3717,3727,3737],{"type":24,"tag":36,"props":3718,"children":3719},{},[3720,3722],{"type":29,"value":3721},"运行环境：",{"type":24,"tag":3693,"props":3723,"children":3724},{},[3725],{"type":29,"value":3726},"Node 版本/浏览器版本",{"type":24,"tag":36,"props":3728,"children":3729},{},[3730,3732],{"type":29,"value":3731},"框架版本：",{"type":24,"tag":3693,"props":3733,"children":3734},{},[3735],{"type":29,"value":3736},"相关框架版本",{"type":24,"tag":36,"props":3738,"children":3739},{},[3740,3742],{"type":29,"value":3741},"操作系统：",{"type":24,"tag":3693,"props":3743,"children":3744},{},[3745],{"type":29,"value":3746},"如果相关",{"type":24,"tag":25,"props":3748,"children":3749},{},[3750],{"type":24,"tag":119,"props":3751,"children":3752},{},[3753],{"type":29,"value":3754},"已尝试的方案",{"type":24,"tag":32,"props":3756,"children":3757},{},[3758,3772],{"type":24,"tag":36,"props":3759,"children":3760},{},[3761,3766,3767],{"type":24,"tag":3693,"props":3762,"children":3763},{},[3764],{"type":29,"value":3765},"方案1",{"type":29,"value":2192},{"type":24,"tag":3693,"props":3768,"children":3769},{},[3770],{"type":29,"value":3771},"结果",{"type":24,"tag":36,"props":3773,"children":3774},{},[3775,3780,3781],{"type":24,"tag":3693,"props":3776,"children":3777},{},[3778],{"type":29,"value":3779},"方案2",{"type":29,"value":2192},{"type":24,"tag":3693,"props":3782,"children":3783},{},[3784],{"type":29,"value":3771},{"type":24,"tag":25,"props":3786,"children":3787},{},[3788,3793],{"type":24,"tag":119,"props":3789,"children":3790},{},[3791],{"type":29,"value":3792},"期望的结果",{"type":24,"tag":3693,"props":3794,"children":3795},{},[3796],{"type":29,"value":3797},"描述期望的行为",{"type":24,"tag":3679,"props":3799,"children":3801},{"code":3800},"\n### 1.3 分级调试策略\n\n",[3802],{"type":24,"tag":522,"props":3803,"children":3804},{"__ignoreMap":7},[3805],{"type":29,"value":3800},{"type":24,"tag":25,"props":3807,"children":3808},{},[3809],{"type":29,"value":3810},"┌───────────────────────────────────────────────────────────┐\n│                    AI 辅助调试决策树                        │\n├───────────────────────────────────────────────────────────┤\n│                                                           │\n│  Level 1：简单错误（5分钟内解决）                           │\n│  ├── 语法错误、拼写错误                                    │\n│  ├── 方法：直接复制错误信息给 AI                           │\n│  └── 工具：Copilot Chat / ChatGPT                        │\n│                                                           │\n│  Level 2：中等复杂度（30分钟内解决）                        │\n│  ├── 类型错误、逻辑错误、API 使用错误                      │\n│  ├── 方法：提供错误信息 + 相关代码 + 上下文                 │\n│  └── 工具：Cursor Chat / Claude                          │\n│                                                           │\n│  Level 3：复杂问题（需要深入分析）                          │\n│  ├── 竞态条件、内存泄漏、性能问题                          │\n│  ├── 方法：详细描述场景 + 提供多个文件 + 讨论               │\n│  └── 工具：Cursor Composer / 专门的 AI 会话                │\n│                                                           │\n│  Level 4：架构级问题                                       │\n│  ├── 设计缺陷、技术债务                                    │\n│  ├── 方法：AI 辅助分析 + 人工判断                          │\n│  └── 工具：与团队讨论 + AI 作为顾问                        │\n│                                                           │\n└───────────────────────────────────────────────────────────┘",{"type":24,"tag":3679,"props":3812,"children":3814},{"code":3813},"\n## 第二部分：错误信息分析\n\n### 2.1 前端错误分析\n\n**场景 1：React 错误边界触发**\n\n```typescript\n// 错误信息：\n// Error: Hydration failed because the initial UI does not match \n// what was rendered on the server.\n\n// 提问方式：\n/**\n * 我在 Next.js 14 App Router 项目中遇到这个错误：\n * \n * Error: Hydration failed because the initial UI does not match \n * what was rendered on the server.\n * \n * 相关代码：\n */\nfunction UserStatus() {\n  const [isLoggedIn, setIsLoggedIn] = useState(false);\n  \n  useEffect(() => {\n    setIsLoggedIn(localStorage.getItem('token') !== null);\n  }, []);\n  \n  return \u003Cdiv>{isLoggedIn ? '已登录' : '未登录'}\u003C/div>;\n}\n\n// AI 会分析出：\n// 1. 服务端渲染时 localStorage 不可用，默认 false\n// 2. 客户端 hydration 时可能是 true\n// 3. 导致服务端和客户端渲染结果不一致\n\n// AI 建议的解决方案：\nfunction UserStatus() {\n  const [isLoggedIn, setIsLoggedIn] = useState\u003Cboolean | null>(null);\n  \n  useEffect(() => {\n    setIsLoggedIn(localStorage.getItem('token') !== null);\n  }, []);\n  \n  // 初始状态显示加载中，避免 hydration 不匹配\n  if (isLoggedIn === null) {\n    return \u003Cdiv>加载中...\u003C/div>;\n  }\n  \n  return \u003Cdiv>{isLoggedIn ? '已登录' : '未登录'}\u003C/div>;\n}\n",[3815],{"type":24,"tag":522,"props":3816,"children":3817},{"__ignoreMap":7},[3818],{"type":29,"value":3813},{"type":24,"tag":25,"props":3820,"children":3821},{},[3822],{"type":24,"tag":119,"props":3823,"children":3824},{},[3825],{"type":29,"value":3826},"场景 2：Vue 响应式警告",{"type":24,"tag":3679,"props":3828,"children":3833},{"code":3829,"language":3830,"meta":7,"className":3831},"// 警告信息：\n// [Vue warn]: Property \"xxx\" was accessed during render but is not \n// defined on instance.\n\n// 提问方式：\n/**\n * Vue 3 项目中出现这个警告：\n * [Vue warn]: Property \"userInfo\" was accessed during render \n * but is not defined on instance.\n * \n * 组件代码：\n */\n\u003Ctemplate>\n  \u003Cdiv>{{ userInfo.name }}\u003C/div>\n\u003C/template>\n\n\u003Cscript setup>\nconst { data: userInfo } = await useFetch('/api/user');\n\u003C/script>\n\n// AI 分析：\n// 1. useFetch 是异步的，初始渲染时 userInfo 可能是 undefined\n// 2. 直接访问 userInfo.name 会报错\n\n// AI 建议：\n\u003Ctemplate>\n  \u003Cdiv v-if=\"userInfo\">{{ userInfo.name }}\u003C/div>\n  \u003Cdiv v-else>加载中...\u003C/div>\n\u003C/template>\n\n\u003Cscript setup>\nconst { data: userInfo, pending } = await useFetch('/api/user');\n\u003C/script>\n","typescript",[3832],"language-typescript",[3834],{"type":24,"tag":522,"props":3835,"children":3836},{"__ignoreMap":7},[3837],{"type":29,"value":3829},{"type":24,"tag":101,"props":3839,"children":3841},{"id":3840},"_22-后端错误分析",[3842],{"type":29,"value":3843},"2.2 后端错误分析",{"type":24,"tag":25,"props":3845,"children":3846},{},[3847],{"type":24,"tag":119,"props":3848,"children":3849},{},[3850],{"type":29,"value":3851},"场景 1：Node.js 内存问题",{"type":24,"tag":3679,"props":3853,"children":3858},{"code":3854,"language":3855,"meta":7,"className":3856},"// 错误信息：\n// FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - \n// JavaScript heap out of memory\n\n// 提问方式（包含上下文）：\n/**\n * Node.js 服务运行几小时后崩溃，错误信息：\n * FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - \n * JavaScript heap out of memory\n * \n * 服务功能：处理 CSV 文件上传，每次约 100MB\n * \n * 处理代码：\n */\nasync function processCSV(filePath) {\n  const content = fs.readFileSync(filePath, 'utf-8');\n  const rows = content.split('\\n');\n  const results = [];\n  \n  for (const row of rows) {\n    const processed = await processRow(row);\n    results.push(processed);\n  }\n  \n  return results;\n}\n\n// AI 分析会指出：\n// 1. 一次性读取整个文件到内存\n// 2. 所有处理结果累积在 results 数组\n// 3. 建议使用流式处理\n\n// AI 提供的优化方案：\nconst { createReadStream } = require('fs');\nconst { createInterface } = require('readline');\n\nasync function processCSVStream(filePath, onRow) {\n  const fileStream = createReadStream(filePath);\n  const rl = createInterface({\n    input: fileStream,\n    crlfDelay: Infinity\n  });\n  \n  let count = 0;\n  for await (const line of rl) {\n    await onRow(line);\n    count++;\n    \n    // 每处理 1000 行，给 GC 机会运行\n    if (count % 1000 === 0) {\n      await new Promise(r => setImmediate(r));\n    }\n  }\n}\n","javascript",[3857],"language-javascript",[3859],{"type":24,"tag":522,"props":3860,"children":3861},{"__ignoreMap":7},[3862],{"type":29,"value":3854},{"type":24,"tag":25,"props":3864,"children":3865},{},[3866],{"type":24,"tag":119,"props":3867,"children":3868},{},[3869],{"type":29,"value":3870},"场景 2：数据库连接问题",{"type":24,"tag":3679,"props":3872,"children":3875},{"code":3873,"language":3830,"meta":7,"className":3874},"// 错误信息：\n// Error: Connection pool exhausted - \n// max connections (10) already in use\n\n// 提问方式：\n/**\n * PostgreSQL 连接池耗尽错误，高并发时出现：\n * Error: Connection pool exhausted\n * \n * 当前配置：\n * - max connections: 10\n * - 并发请求: 约 100/秒\n * \n * 数据库调用代码：\n */\nasync function getUserData(userId: string) {\n  const client = await pool.connect();\n  try {\n    const user = await client.query('SELECT * FROM users WHERE id = $1', [userId]);\n    const orders = await client.query('SELECT * FROM orders WHERE user_id = $1', [userId]);\n    const payments = await client.query('SELECT * FROM payments WHERE user_id = $1', [userId]);\n    return { user: user.rows[0], orders: orders.rows, payments: payments.rows };\n  } finally {\n    client.release();\n  }\n}\n\n// AI 会分析出多个可能原因并给出综合方案\n",[3832],[3876],{"type":24,"tag":522,"props":3877,"children":3878},{"__ignoreMap":7},[3879],{"type":29,"value":3873},{"type":24,"tag":94,"props":3881,"children":3883},{"id":3882},"第三部分日志分析与问题定位",[3884],{"type":29,"value":3885},"第三部分：日志分析与问题定位",{"type":24,"tag":101,"props":3887,"children":3889},{"id":3888},"_31-结构化日志分析",[3890],{"type":29,"value":3891},"3.1 结构化日志分析",{"type":24,"tag":25,"props":3893,"children":3894},{},[3895],{"type":29,"value":3896},"当面对大量日志时，让 AI 帮你快速定位问题：",{"type":24,"tag":3679,"props":3898,"children":3901},{"code":3899,"language":3855,"meta":7,"className":3900},"// 提问示例：\n/**\n * 分析以下日志，找出导致请求失败的原因：\n * \n * 日志片段：\n */\nconst logs = `\n2024-01-15 10:23:45.123 INFO  [req-abc123] 收到请求 POST /api/order\n2024-01-15 10:23:45.125 DEBUG [req-abc123] 用户认证通过 userId=u001\n2024-01-15 10:23:45.130 DEBUG [req-abc123] 开始库存检查 productId=p001\n2024-01-15 10:23:45.145 DEBUG [req-abc123] 库存检查通过 available=50\n2024-01-15 10:23:45.150 DEBUG [req-abc123] 开始创建订单\n2024-01-15 10:23:45.200 DEBUG [req-abc123] 数据库连接获取成功\n2024-01-15 10:23:45.250 ERROR [req-abc123] 订单创建失败 error=\"deadlock detected\"\n2024-01-15 10:23:45.251 WARN  [req-abc123] 事务回滚\n2024-01-15 10:23:45.255 INFO  [req-abc123] 响应 500 耗时 132ms\n`;\n\n// AI 分析结果会包括：\n// 1. 问题定位：数据库死锁\n// 2. 可能原因：并发订单创建导致锁竞争\n// 3. 排查建议：检查事务隔离级别、锁顺序\n",[3857],[3902],{"type":24,"tag":522,"props":3903,"children":3904},{"__ignoreMap":7},[3905],{"type":29,"value":3899},{"type":24,"tag":101,"props":3907,"children":3909},{"id":3908},"_32-创建调试日志",[3910],{"type":29,"value":3911},"3.2 创建调试日志",{"type":24,"tag":25,"props":3913,"children":3914},{},[3915],{"type":29,"value":3916},"让 AI 帮你生成调试用的日志代码：",{"type":24,"tag":3679,"props":3918,"children":3921},{"code":3919,"language":3830,"meta":7,"className":3920},"// 请求：\n// \"为这个函数添加详细的调试日志，包括入参、关键步骤、耗时和结果\"\n\n// 原代码：\nasync function processOrder(order: Order): Promise\u003COrderResult> {\n  const inventory = await checkInventory(order.items);\n  const payment = await processPayment(order.userId, order.total);\n  const result = await createOrder(order, payment.transactionId);\n  return result;\n}\n\n// AI 生成的带日志版本：\nasync function processOrder(order: Order): Promise\u003COrderResult> {\n  const requestId = generateRequestId();\n  const startTime = performance.now();\n  \n  logger.info({\n    requestId,\n    event: 'order_processing_start',\n    orderId: order.id,\n    userId: order.userId,\n    itemCount: order.items.length,\n    total: order.total\n  });\n  \n  try {\n    // 库存检查\n    const inventoryStart = performance.now();\n    const inventory = await checkInventory(order.items);\n    logger.debug({\n      requestId,\n      event: 'inventory_check_complete',\n      duration: performance.now() - inventoryStart,\n      available: inventory.allAvailable\n    });\n    \n    // 支付处理\n    const paymentStart = performance.now();\n    const payment = await processPayment(order.userId, order.total);\n    logger.debug({\n      requestId,\n      event: 'payment_complete',\n      duration: performance.now() - paymentStart,\n      transactionId: payment.transactionId\n    });\n    \n    // 创建订单\n    const createStart = performance.now();\n    const result = await createOrder(order, payment.transactionId);\n    logger.debug({\n      requestId,\n      event: 'order_created',\n      duration: performance.now() - createStart,\n      resultOrderId: result.orderId\n    });\n    \n    logger.info({\n      requestId,\n      event: 'order_processing_complete',\n      duration: performance.now() - startTime,\n      success: true\n    });\n    \n    return result;\n  } catch (error) {\n    logger.error({\n      requestId,\n      event: 'order_processing_failed',\n      duration: performance.now() - startTime,\n      error: error.message,\n      stack: error.stack\n    });\n    throw error;\n  }\n}\n",[3832],[3922],{"type":24,"tag":522,"props":3923,"children":3924},{"__ignoreMap":7},[3925],{"type":29,"value":3919},{"type":24,"tag":94,"props":3927,"children":3929},{"id":3928},"第四部分性能问题排查",[3930],{"type":29,"value":3931},"第四部分：性能问题排查",{"type":24,"tag":101,"props":3933,"children":3935},{"id":3934},"_41-前端性能分析",[3936],{"type":29,"value":3937},"4.1 前端性能分析",{"type":24,"tag":3679,"props":3939,"children":3942},{"code":3940,"language":3830,"meta":7,"className":3941},"// 场景：页面加载慢，需要分析原因\n\n// 提问方式：\n/**\n * 页面首屏加载需要 5 秒，以下是 Performance API 数据，\n * 请分析性能瓶颈：\n */\nconst performanceData = {\n  // Navigation Timing\n  dns: 50,           // DNS 查询\n  tcp: 100,          // TCP 连接\n  ttfb: 800,         // 首字节时间\n  download: 200,     // 文档下载\n  domParsing: 300,   // DOM 解析\n  domContentLoaded: 1500,\n  load: 5000,\n  \n  // Resource Timing (主要资源)\n  resources: [\n    { name: 'main.js', size: '2.5MB', duration: 1200 },\n    { name: 'vendor.js', size: '1.8MB', duration: 900 },\n    { name: 'styles.css', size: '500KB', duration: 300 },\n    { name: 'hero-image.jpg', size: '3MB', duration: 1500 },\n  ],\n  \n  // Long Tasks\n  longTasks: [\n    { startTime: 1600, duration: 800, name: 'script-evaluation' },\n    { startTime: 2500, duration: 400, name: 'layout' }\n  ]\n};\n\n// AI 会分析出：\n// 1. JS bundle 过大（4.3MB），需要代码分割\n// 2. 图片未优化（3MB 的 hero 图片）\n// 3. 存在长任务阻塞主线程\n// 并给出具体优化建议\n",[3832],[3943],{"type":24,"tag":522,"props":3944,"children":3945},{"__ignoreMap":7},[3946],{"type":29,"value":3940},{"type":24,"tag":101,"props":3948,"children":3950},{"id":3949},"_42-内存泄漏排查",[3951],{"type":29,"value":3952},"4.2 内存泄漏排查",{"type":24,"tag":3679,"props":3954,"children":3957},{"code":3955,"language":3830,"meta":7,"className":3956},"// 场景：应用运行一段时间后变卡\n\n// 提问方式：\n/**\n * React 应用运行一段时间后内存持续增长，以下是 Heap Snapshot 对比：\n * \n * 初始状态：50MB\n * 运行 1 小时后：150MB\n * 运行 2 小时后：280MB\n * \n * Retained objects 增长最快的：\n * - (closure) - 增长 50MB\n * - HTMLDivElement - 增长 30MB\n * - Array - 增长 20MB\n * \n * 可疑代码：\n */\nfunction DataDashboard() {\n  const [data, setData] = useState([]);\n  const chartRef = useRef(null);\n  \n  useEffect(() => {\n    // 每秒刷新数据\n    const interval = setInterval(async () => {\n      const newData = await fetchLatestData();\n      setData(prev => [...prev, ...newData]);  // 数据不断累积\n    }, 1000);\n    \n    // 初始化图表\n    const chart = new Chart(chartRef.current, {\n      // 配置...\n    });\n    \n    // 没有 cleanup！\n  }, []);\n  \n  return \u003Ccanvas ref={chartRef} />;\n}\n\n// AI 会指出：\n// 1. interval 没有清理\n// 2. Chart 实例没有销毁\n// 3. data 无限增长\n// 并提供修复代码\n",[3832],[3958],{"type":24,"tag":522,"props":3959,"children":3960},{"__ignoreMap":7},[3961],{"type":29,"value":3955},{"type":24,"tag":101,"props":3963,"children":3965},{"id":3964},"_43-数据库查询优化",[3966],{"type":29,"value":3967},"4.3 数据库查询优化",{"type":24,"tag":3679,"props":3969,"children":3974},{"code":3970,"language":3971,"meta":7,"className":3972},"-- 场景：查询很慢，让 AI 分析执行计划\n\n-- 提问方式：\n-- 以下查询在数据量大时很慢（orders 表 1000 万行），\n-- 执行计划如下，请分析并优化：\n\nEXPLAIN ANALYZE\nSELECT o.*, u.name, u.email\nFROM orders o\nJOIN users u ON o.user_id = u.id\nWHERE o.status = 'pending'\n  AND o.created_at > '2024-01-01'\nORDER BY o.created_at DESC\nLIMIT 20;\n\n-- 执行计划：\n/*\nSort  (cost=156847.23..157847.23 rows=400000 width=250)\n  Sort Key: o.created_at DESC\n  ->  Hash Join  (cost=1500.00..89847.23 rows=400000 width=250)\n        Hash Cond: (o.user_id = u.id)\n        ->  Seq Scan on orders o  (cost=0.00..85000.00 rows=400000)\n              Filter: ((status = 'pending') AND (created_at > '2024-01-01'))\n        ->  Hash  (cost=1000.00..1000.00 rows=50000 width=100)\n              ->  Seq Scan on users u  (cost=0.00..1000.00 rows=50000)\nPlanning Time: 0.5 ms\nExecution Time: 3500 ms\n*/\n\n-- AI 会分析出问题并建议：\n-- 1. orders 表全表扫描 - 需要复合索引\n-- 2. 建议创建索引：\nCREATE INDEX idx_orders_status_created ON orders(status, created_at DESC);\n\n-- 3. 如果 status 选择性不高，考虑部分索引：\nCREATE INDEX idx_orders_pending ON orders(created_at DESC) \nWHERE status = 'pending';\n","sql",[3973],"language-sql",[3975],{"type":24,"tag":522,"props":3976,"children":3977},{"__ignoreMap":7},[3978],{"type":29,"value":3970},{"type":24,"tag":94,"props":3980,"children":3982},{"id":3981},"第五部分复杂-bug-排查",[3983],{"type":29,"value":3984},"第五部分：复杂 Bug 排查",{"type":24,"tag":101,"props":3986,"children":3988},{"id":3987},"_51-竞态条件",[3989],{"type":29,"value":3990},"5.1 竞态条件",{"type":24,"tag":3679,"props":3992,"children":3995},{"code":3993,"language":3830,"meta":7,"className":3994},"// 场景：偶发的数据不一致问题\n\n// 提问方式：\n/**\n * 用户反馈偶尔看到错误的账户余额，但刷新后正常。\n * 怀疑是竞态条件，以下是相关代码：\n */\nasync function updateBalance(userId: string, amount: number) {\n  // 读取当前余额\n  const user = await db.users.findOne({ id: userId });\n  const newBalance = user.balance + amount;\n  \n  // 更新余额\n  await db.users.update({ id: userId }, { balance: newBalance });\n  \n  // 记录交易\n  await db.transactions.create({\n    userId,\n    amount,\n    balanceAfter: newBalance,\n    createdAt: new Date()\n  });\n  \n  return newBalance;\n}\n\n// 并发调用场景：\n// 用户同时发起两笔交易：+100 和 -50\n// 期望结果：原余额 1000 → 1050\n// 实际可能：原余额 1000 → 1100 或 950\n\n// AI 会分析竞态条件并提供解决方案：\nasync function updateBalanceAtomic(userId: string, amount: number) {\n  // 方案 1：使用数据库原子操作\n  const result = await db.users.findOneAndUpdate(\n    { id: userId },\n    { $inc: { balance: amount } },\n    { returnDocument: 'after' }\n  );\n  \n  await db.transactions.create({\n    userId,\n    amount,\n    balanceAfter: result.balance,\n    createdAt: new Date()\n  });\n  \n  return result.balance;\n}\n\n// 方案 2：使用乐观锁\nasync function updateBalanceOptimistic(userId: string, amount: number) {\n  const maxRetries = 3;\n  \n  for (let i = 0; i \u003C maxRetries; i++) {\n    const user = await db.users.findOne({ id: userId });\n    const newBalance = user.balance + amount;\n    \n    const updated = await db.users.updateOne(\n      { id: userId, version: user.version },\n      { balance: newBalance, version: user.version + 1 }\n    );\n    \n    if (updated.modifiedCount === 1) {\n      await db.transactions.create({...});\n      return newBalance;\n    }\n    \n    // 版本冲突，重试\n    await sleep(10 * (i + 1));\n  }\n  \n  throw new Error('Update failed after retries');\n}\n",[3832],[3996],{"type":24,"tag":522,"props":3997,"children":3998},{"__ignoreMap":7},[3999],{"type":29,"value":3993},{"type":24,"tag":101,"props":4001,"children":4003},{"id":4002},"_52-分布式系统问题",[4004],{"type":29,"value":4005},"5.2 分布式系统问题",{"type":24,"tag":3679,"props":4007,"children":4010},{"code":4008,"language":3830,"meta":7,"className":4009},"// 场景：微服务间的数据不一致\n\n// 提问方式：\n/**\n * 订单服务和库存服务偶尔出现数据不一致：\n * - 订单显示已创建\n * - 库存未扣减\n * \n * 当前流程：\n */\n// Order Service\nasync function createOrder(orderData) {\n  // 1. 调用库存服务扣减库存\n  await inventoryService.deduct(orderData.items);\n  \n  // 2. 创建订单\n  const order = await orderRepository.create(orderData);\n  \n  // 3. 发送订单创建事件\n  await eventBus.publish('order.created', order);\n  \n  return order;\n}\n\n// 问题分析：如果步骤 2 或 3 失败，库存已经扣减但订单未创建\n\n// AI 会建议使用 Saga 模式或事务发件箱模式\n",[3832],[4011],{"type":24,"tag":522,"props":4012,"children":4013},{"__ignoreMap":7},[4014],{"type":29,"value":4008},{"type":24,"tag":94,"props":4016,"children":4018},{"id":4017},"第六部分ai-调试工作流",[4019],{"type":29,"value":4020},"第六部分：AI 调试工作流",{"type":24,"tag":101,"props":4022,"children":4024},{"id":4023},"_61-我的调试流程",[4025],{"type":29,"value":4026},"6.1 我的调试流程",{"type":24,"tag":3679,"props":4028,"children":4030},{"code":4029},"┌────────────────────────────────────────────────────────────┐\n│                    AI 辅助调试工作流                         │\n├────────────────────────────────────────────────────────────┤\n│                                                            │\n│  Step 1: 问题收集                                          │\n│  ├── 复制完整错误信息                                       │\n│  ├── 截图相关日志                                          │\n│  └── 记录复现步骤                                          │\n│                                                            │\n│  Step 2: 快速分析                                          │\n│  ├── 将错误信息发给 AI                                      │\n│  ├── 获取可能原因列表                                       │\n│  └── 评估哪些最可能                                         │\n│                                                            │\n│  Step 3: 深入调查                                          │\n│  ├── 根据 AI 建议添加日志/断点                              │\n│  ├── 收集更多信息                                          │\n│  └── 再次询问 AI（带新信息）                                │\n│                                                            │\n│  Step 4: 验证修复                                          │\n│  ├── AI 生成修复代码                                        │\n│  ├── 人工审查确认                                          │\n│  └── 测试验证                                               │\n│                                                            │\n│  Step 5: 预防措施                                          │\n│  ├── AI 建议类似问题的预防方法                              │\n│  ├── 添加相关测试用例                                       │\n│  └── 更新文档/知识库                                        │\n│                                                            │\n└────────────────────────────────────────────────────────────┘\n",[4031],{"type":24,"tag":522,"props":4032,"children":4033},{"__ignoreMap":7},[4034],{"type":29,"value":4029},{"type":24,"tag":101,"props":4036,"children":4038},{"id":4037},"_62-调试对话模板",[4039],{"type":29,"value":4040},"6.2 调试对话模板",{"type":24,"tag":3679,"props":4042,"children":4045},{"code":4043,"language":1435,"meta":7,"className":4044},"## 第一轮：问题描述\n\n我遇到了一个问题：[简述问题]\n\n错误信息：\n",[3683],[4046],{"type":24,"tag":522,"props":4047,"children":4048},{"__ignoreMap":7},[4049],{"type":29,"value":4043},{"type":24,"tag":25,"props":4051,"children":4052},{},[4053],{"type":24,"tag":3693,"props":4054,"children":4055},{},[4056],{"type":29,"value":4057},"粘贴完整错误",{"type":24,"tag":3679,"props":4059,"children":4061},{"code":4060},"\n相关代码：\n```javascript\n[粘贴代码]\n",[4062],{"type":24,"tag":522,"props":4063,"children":4064},{"__ignoreMap":7},[4065],{"type":29,"value":4060},{"type":24,"tag":90,"props":4067,"children":4068},{},[],{"type":24,"tag":94,"props":4070,"children":4072},{"id":4071},"第二轮补充信息",[4073],{"type":29,"value":4074},"第二轮：补充信息",{"type":24,"tag":25,"props":4076,"children":4077},{},[4078],{"type":29,"value":4079},"根据你的建议，我添加了日志，发现：",{"type":24,"tag":32,"props":4081,"children":4082},{},[4083,4091],{"type":24,"tag":36,"props":4084,"children":4085},{},[4086],{"type":24,"tag":3693,"props":4087,"children":4088},{},[4089],{"type":29,"value":4090},"发现 1",{"type":24,"tag":36,"props":4092,"children":4093},{},[4094],{"type":24,"tag":3693,"props":4095,"children":4096},{},[4097],{"type":29,"value":4098},"发现 2",{"type":24,"tag":25,"props":4100,"children":4101},{},[4102,4104,4109],{"type":29,"value":4103},"这是否说明问题出在 ",{"type":24,"tag":3693,"props":4105,"children":4106},{},[4107],{"type":29,"value":4108},"你的猜测",{"type":29,"value":4110},"？",{"type":24,"tag":90,"props":4112,"children":4113},{},[],{"type":24,"tag":94,"props":4115,"children":4117},{"id":4116},"第三轮确认修复",[4118],{"type":29,"value":4119},"第三轮：确认修复",{"type":24,"tag":25,"props":4121,"children":4122},{},[4123],{"type":29,"value":4124},"我按照你的建议修改了代码：",{"type":24,"tag":3679,"props":4126,"children":4129},{"code":4127,"language":3855,"meta":7,"className":4128},"[粘贴修改后的代码]\n",[3857],[4130],{"type":24,"tag":522,"props":4131,"children":4132},{"__ignoreMap":7},[4133],{"type":29,"value":4127},{"type":24,"tag":25,"props":4135,"children":4136},{},[4137],{"type":29,"value":4138},"请确认这个修复是否正确，以及是否有其他潜在问题。",{"type":24,"tag":90,"props":4140,"children":4141},{},[],{"type":24,"tag":94,"props":4143,"children":4145},{"id":4144},"第四轮预防",[4146],{"type":29,"value":4147},"第四轮：预防",{"type":24,"tag":25,"props":4149,"children":4150},{},[4151],{"type":29,"value":4152},"这个问题已解决。请建议：",{"type":24,"tag":71,"props":4154,"children":4155},{},[4156,4161,4166],{"type":24,"tag":36,"props":4157,"children":4158},{},[4159],{"type":29,"value":4160},"如何防止类似问题再次发生？",{"type":24,"tag":36,"props":4162,"children":4163},{},[4164],{"type":29,"value":4165},"应该添加什么测试用例？",{"type":24,"tag":36,"props":4167,"children":4168},{},[4169],{"type":29,"value":4170},"有什么最佳实践可以参考？",{"type":24,"tag":3679,"props":4172,"children":4174},{"code":4173},"\n## 结语：AI 是放大器，不是替代品\n\nAI 调试工具能够显著加速问题排查过程，但它不能替代你的思考。最有价值的能力组合是：\n\n- **你的领域知识** + **AI 的广博见识**\n- **你对项目的理解** + **AI 的分析能力**\n- **你的判断力** + **AI 的执行速度**\n\n调试的本质是假设-验证的循环。AI 帮你更快地生成假设、更高效地验证假设，但做出最终判断的还是你。\n\n学会与 AI 高效协作调试，不是依赖 AI 给你答案，而是让 AI 帮你更快地找到自己的答案。\n\n---\n\n## 参考资源\n\n- [Chrome DevTools 官方文档](https://developer.chrome.com/docs/devtools)\n- [Node.js 调试指南](https://nodejs.org/en/docs/guides/debugging-getting-started)\n- [React DevTools 使用指南](https://react.dev/learn/react-developer-tools)\n",[4175],{"type":24,"tag":522,"props":4176,"children":4177},{"__ignoreMap":7},[4178],{"type":29,"value":4173},{"title":7,"searchDepth":1391,"depth":1391,"links":4180},[4181,4182,4183,4188,4192,4197,4201,4205,4206,4207],{"id":3563,"depth":1394,"text":3566},{"id":3569,"depth":1394,"text":3572},{"id":3590,"depth":1394,"text":3593,"children":4184},[4185,4186,4187],{"id":3596,"depth":1391,"text":3599},{"id":3674,"depth":1391,"text":3677},{"id":3840,"depth":1391,"text":3843},{"id":3882,"depth":1394,"text":3885,"children":4189},[4190,4191],{"id":3888,"depth":1391,"text":3891},{"id":3908,"depth":1391,"text":3911},{"id":3928,"depth":1394,"text":3931,"children":4193},[4194,4195,4196],{"id":3934,"depth":1391,"text":3937},{"id":3949,"depth":1391,"text":3952},{"id":3964,"depth":1391,"text":3967},{"id":3981,"depth":1394,"text":3984,"children":4198},[4199,4200],{"id":3987,"depth":1391,"text":3990},{"id":4002,"depth":1391,"text":4005},{"id":4017,"depth":1394,"text":4020,"children":4202},[4203,4204],{"id":4023,"depth":1391,"text":4026},{"id":4037,"depth":1391,"text":4040},{"id":4071,"depth":1394,"text":4074},{"id":4116,"depth":1394,"text":4119},{"id":4144,"depth":1394,"text":4147},"content:topics:ai:ai-debugging-troubleshooting-guide.md","topics/ai/ai-debugging-troubleshooting-guide.md","topics/ai/ai-debugging-troubleshooting-guide",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":4212,"image":18,"featured":6,"readingTime":19,"body":4213,"_type":1435,"_id":1436,"_source":1437,"_file":1438,"_stem":1439,"_extension":1440},[13,14,15,16,17],{"type":21,"children":4214,"toc":5323},[4215,4219,4234,4238,4245,4249,4264,4267,4271,4275,4279,4314,4318,4322,4349,4353,4356,4360,4364,4391,4395,4410,4413,4417,4421,4425,4429,4444,4448,4459,4463,4474,4478,4482,4497,4501,4512,4516,4527,4531,4535,4550,4554,4565,4569,4580,4584,4588,4603,4607,4623,4627,4638,4641,4645,4649,4653,4657,4672,4676,4687,4691,4702,4706,4710,4725,4729,4740,4744,4755,4759,4763,4778,4782,4793,4797,4808,4812,4816,4831,4835,4846,4850,4861,4864,4868,4872,4876,4880,4907,4911,4930,4934,4938,4949,4953,4957,4961,4980,4984,4999,5002,5006,5010,5014,5029,5033,5048,5052,5067,5071,5086,5090,5093,5097,5101,5116,5120,5135,5139,5142,5146,5150,5177,5181,5192,5195,5199,5203,5207,5211,5215,5219,5223,5227,5231,5234,5238,5242,5261,5265,5268,5272,5276,5291,5295,5299],{"type":24,"tag":25,"props":4216,"children":4217},{},[4218],{"type":29,"value":30},{"type":24,"tag":32,"props":4220,"children":4221},{},[4222,4226,4230],{"type":24,"tag":36,"props":4223,"children":4224},{},[4225],{"type":29,"value":40},{"type":24,"tag":36,"props":4227,"children":4228},{},[4229],{"type":29,"value":45},{"type":24,"tag":36,"props":4231,"children":4232},{},[4233],{"type":29,"value":50},{"type":24,"tag":25,"props":4235,"children":4236},{},[4237],{"type":29,"value":55},{"type":24,"tag":57,"props":4239,"children":4240},{},[4241],{"type":24,"tag":25,"props":4242,"children":4243},{},[4244],{"type":29,"value":64},{"type":24,"tag":25,"props":4246,"children":4247},{},[4248],{"type":29,"value":69},{"type":24,"tag":71,"props":4250,"children":4251},{},[4252,4256,4260],{"type":24,"tag":36,"props":4253,"children":4254},{},[4255],{"type":29,"value":78},{"type":24,"tag":36,"props":4257,"children":4258},{},[4259],{"type":29,"value":83},{"type":24,"tag":36,"props":4261,"children":4262},{},[4263],{"type":29,"value":88},{"type":24,"tag":90,"props":4265,"children":4266},{},[],{"type":24,"tag":94,"props":4268,"children":4269},{"id":96},[4270],{"type":29,"value":99},{"type":24,"tag":101,"props":4272,"children":4273},{"id":103},[4274],{"type":29,"value":106},{"type":24,"tag":25,"props":4276,"children":4277},{},[4278],{"type":29,"value":111},{"type":24,"tag":71,"props":4280,"children":4281},{},[4282,4290,4298,4306],{"type":24,"tag":36,"props":4283,"children":4284},{},[4285,4289],{"type":24,"tag":119,"props":4286,"children":4287},{},[4288],{"type":29,"value":123},{"type":29,"value":125},{"type":24,"tag":36,"props":4291,"children":4292},{},[4293,4297],{"type":24,"tag":119,"props":4294,"children":4295},{},[4296],{"type":29,"value":133},{"type":29,"value":135},{"type":24,"tag":36,"props":4299,"children":4300},{},[4301,4305],{"type":24,"tag":119,"props":4302,"children":4303},{},[4304],{"type":29,"value":143},{"type":29,"value":145},{"type":24,"tag":36,"props":4307,"children":4308},{},[4309,4313],{"type":24,"tag":119,"props":4310,"children":4311},{},[4312],{"type":29,"value":153},{"type":29,"value":155},{"type":24,"tag":101,"props":4315,"children":4316},{"id":158},[4317],{"type":29,"value":161},{"type":24,"tag":25,"props":4319,"children":4320},{},[4321],{"type":29,"value":166},{"type":24,"tag":32,"props":4323,"children":4324},{},[4325,4333,4341],{"type":24,"tag":36,"props":4326,"children":4327},{},[4328,4332],{"type":24,"tag":119,"props":4329,"children":4330},{},[4331],{"type":29,"value":177},{"type":29,"value":179},{"type":24,"tag":36,"props":4334,"children":4335},{},[4336,4340],{"type":24,"tag":119,"props":4337,"children":4338},{},[4339],{"type":29,"value":187},{"type":29,"value":189},{"type":24,"tag":36,"props":4342,"children":4343},{},[4344,4348],{"type":24,"tag":119,"props":4345,"children":4346},{},[4347],{"type":29,"value":197},{"type":29,"value":199},{"type":24,"tag":25,"props":4350,"children":4351},{},[4352],{"type":29,"value":204},{"type":24,"tag":90,"props":4354,"children":4355},{},[],{"type":24,"tag":94,"props":4357,"children":4358},{"id":210},[4359],{"type":29,"value":213},{"type":24,"tag":25,"props":4361,"children":4362},{},[4363],{"type":29,"value":218},{"type":24,"tag":32,"props":4365,"children":4366},{},[4367,4375,4383],{"type":24,"tag":36,"props":4368,"children":4369},{},[4370,4374],{"type":24,"tag":119,"props":4371,"children":4372},{},[4373],{"type":29,"value":229},{"type":29,"value":231},{"type":24,"tag":36,"props":4376,"children":4377},{},[4378,4382],{"type":24,"tag":119,"props":4379,"children":4380},{},[4381],{"type":29,"value":239},{"type":29,"value":241},{"type":24,"tag":36,"props":4384,"children":4385},{},[4386,4390],{"type":24,"tag":119,"props":4387,"children":4388},{},[4389],{"type":29,"value":249},{"type":29,"value":251},{"type":24,"tag":25,"props":4392,"children":4393},{},[4394],{"type":29,"value":256},{"type":24,"tag":71,"props":4396,"children":4397},{},[4398,4402,4406],{"type":24,"tag":36,"props":4399,"children":4400},{},[4401],{"type":29,"value":264},{"type":24,"tag":36,"props":4403,"children":4404},{},[4405],{"type":29,"value":269},{"type":24,"tag":36,"props":4407,"children":4408},{},[4409],{"type":29,"value":274},{"type":24,"tag":90,"props":4411,"children":4412},{},[],{"type":24,"tag":94,"props":4414,"children":4415},{"id":280},[4416],{"type":29,"value":283},{"type":24,"tag":25,"props":4418,"children":4419},{},[4420],{"type":29,"value":288},{"type":24,"tag":101,"props":4422,"children":4423},{"id":291},[4424],{"type":29,"value":294},{"type":24,"tag":25,"props":4426,"children":4427},{},[4428],{"type":29,"value":299},{"type":24,"tag":32,"props":4430,"children":4431},{},[4432,4436,4440],{"type":24,"tag":36,"props":4433,"children":4434},{},[4435],{"type":29,"value":307},{"type":24,"tag":36,"props":4437,"children":4438},{},[4439],{"type":29,"value":312},{"type":24,"tag":36,"props":4441,"children":4442},{},[4443],{"type":29,"value":317},{"type":24,"tag":25,"props":4445,"children":4446},{},[4447],{"type":29,"value":322},{"type":24,"tag":32,"props":4449,"children":4450},{},[4451,4455],{"type":24,"tag":36,"props":4452,"children":4453},{},[4454],{"type":29,"value":330},{"type":24,"tag":36,"props":4456,"children":4457},{},[4458],{"type":29,"value":335},{"type":24,"tag":25,"props":4460,"children":4461},{},[4462],{"type":29,"value":340},{"type":24,"tag":32,"props":4464,"children":4465},{},[4466,4470],{"type":24,"tag":36,"props":4467,"children":4468},{},[4469],{"type":29,"value":348},{"type":24,"tag":36,"props":4471,"children":4472},{},[4473],{"type":29,"value":353},{"type":24,"tag":101,"props":4475,"children":4476},{"id":356},[4477],{"type":29,"value":359},{"type":24,"tag":25,"props":4479,"children":4480},{},[4481],{"type":29,"value":299},{"type":24,"tag":32,"props":4483,"children":4484},{},[4485,4489,4493],{"type":24,"tag":36,"props":4486,"children":4487},{},[4488],{"type":29,"value":371},{"type":24,"tag":36,"props":4490,"children":4491},{},[4492],{"type":29,"value":376},{"type":24,"tag":36,"props":4494,"children":4495},{},[4496],{"type":29,"value":381},{"type":24,"tag":25,"props":4498,"children":4499},{},[4500],{"type":29,"value":322},{"type":24,"tag":32,"props":4502,"children":4503},{},[4504,4508],{"type":24,"tag":36,"props":4505,"children":4506},{},[4507],{"type":29,"value":393},{"type":24,"tag":36,"props":4509,"children":4510},{},[4511],{"type":29,"value":398},{"type":24,"tag":25,"props":4513,"children":4514},{},[4515],{"type":29,"value":340},{"type":24,"tag":32,"props":4517,"children":4518},{},[4519,4523],{"type":24,"tag":36,"props":4520,"children":4521},{},[4522],{"type":29,"value":410},{"type":24,"tag":36,"props":4524,"children":4525},{},[4526],{"type":29,"value":415},{"type":24,"tag":101,"props":4528,"children":4529},{"id":418},[4530],{"type":29,"value":421},{"type":24,"tag":25,"props":4532,"children":4533},{},[4534],{"type":29,"value":299},{"type":24,"tag":32,"props":4536,"children":4537},{},[4538,4542,4546],{"type":24,"tag":36,"props":4539,"children":4540},{},[4541],{"type":29,"value":433},{"type":24,"tag":36,"props":4543,"children":4544},{},[4545],{"type":29,"value":438},{"type":24,"tag":36,"props":4547,"children":4548},{},[4549],{"type":29,"value":443},{"type":24,"tag":25,"props":4551,"children":4552},{},[4553],{"type":29,"value":322},{"type":24,"tag":32,"props":4555,"children":4556},{},[4557,4561],{"type":24,"tag":36,"props":4558,"children":4559},{},[4560],{"type":29,"value":455},{"type":24,"tag":36,"props":4562,"children":4563},{},[4564],{"type":29,"value":460},{"type":24,"tag":25,"props":4566,"children":4567},{},[4568],{"type":29,"value":340},{"type":24,"tag":32,"props":4570,"children":4571},{},[4572,4576],{"type":24,"tag":36,"props":4573,"children":4574},{},[4575],{"type":29,"value":472},{"type":24,"tag":36,"props":4577,"children":4578},{},[4579],{"type":29,"value":477},{"type":24,"tag":101,"props":4581,"children":4582},{"id":480},[4583],{"type":29,"value":483},{"type":24,"tag":25,"props":4585,"children":4586},{},[4587],{"type":29,"value":299},{"type":24,"tag":32,"props":4589,"children":4590},{},[4591,4595,4599],{"type":24,"tag":36,"props":4592,"children":4593},{},[4594],{"type":29,"value":495},{"type":24,"tag":36,"props":4596,"children":4597},{},[4598],{"type":29,"value":500},{"type":24,"tag":36,"props":4600,"children":4601},{},[4602],{"type":29,"value":505},{"type":24,"tag":25,"props":4604,"children":4605},{},[4606],{"type":29,"value":322},{"type":24,"tag":32,"props":4608,"children":4609},{},[4610,4614],{"type":24,"tag":36,"props":4611,"children":4612},{},[4613],{"type":29,"value":517},{"type":24,"tag":36,"props":4615,"children":4616},{},[4617,4622],{"type":24,"tag":522,"props":4618,"children":4620},{"className":4619},[],[4621],{"type":29,"value":527},{"type":29,"value":529},{"type":24,"tag":25,"props":4624,"children":4625},{},[4626],{"type":29,"value":340},{"type":24,"tag":32,"props":4628,"children":4629},{},[4630,4634],{"type":24,"tag":36,"props":4631,"children":4632},{},[4633],{"type":29,"value":541},{"type":24,"tag":36,"props":4635,"children":4636},{},[4637],{"type":29,"value":546},{"type":24,"tag":90,"props":4639,"children":4640},{},[],{"type":24,"tag":94,"props":4642,"children":4643},{"id":552},[4644],{"type":29,"value":555},{"type":24,"tag":25,"props":4646,"children":4647},{},[4648],{"type":29,"value":560},{"type":24,"tag":101,"props":4650,"children":4651},{"id":563},[4652],{"type":29,"value":566},{"type":24,"tag":25,"props":4654,"children":4655},{},[4656],{"type":29,"value":299},{"type":24,"tag":32,"props":4658,"children":4659},{},[4660,4664,4668],{"type":24,"tag":36,"props":4661,"children":4662},{},[4663],{"type":29,"value":578},{"type":24,"tag":36,"props":4665,"children":4666},{},[4667],{"type":29,"value":583},{"type":24,"tag":36,"props":4669,"children":4670},{},[4671],{"type":29,"value":588},{"type":24,"tag":25,"props":4673,"children":4674},{},[4675],{"type":29,"value":322},{"type":24,"tag":32,"props":4677,"children":4678},{},[4679,4683],{"type":24,"tag":36,"props":4680,"children":4681},{},[4682],{"type":29,"value":600},{"type":24,"tag":36,"props":4684,"children":4685},{},[4686],{"type":29,"value":605},{"type":24,"tag":25,"props":4688,"children":4689},{},[4690],{"type":29,"value":340},{"type":24,"tag":32,"props":4692,"children":4693},{},[4694,4698],{"type":24,"tag":36,"props":4695,"children":4696},{},[4697],{"type":29,"value":617},{"type":24,"tag":36,"props":4699,"children":4700},{},[4701],{"type":29,"value":622},{"type":24,"tag":101,"props":4703,"children":4704},{"id":625},[4705],{"type":29,"value":628},{"type":24,"tag":25,"props":4707,"children":4708},{},[4709],{"type":29,"value":299},{"type":24,"tag":32,"props":4711,"children":4712},{},[4713,4717,4721],{"type":24,"tag":36,"props":4714,"children":4715},{},[4716],{"type":29,"value":640},{"type":24,"tag":36,"props":4718,"children":4719},{},[4720],{"type":29,"value":645},{"type":24,"tag":36,"props":4722,"children":4723},{},[4724],{"type":29,"value":650},{"type":24,"tag":25,"props":4726,"children":4727},{},[4728],{"type":29,"value":322},{"type":24,"tag":32,"props":4730,"children":4731},{},[4732,4736],{"type":24,"tag":36,"props":4733,"children":4734},{},[4735],{"type":29,"value":662},{"type":24,"tag":36,"props":4737,"children":4738},{},[4739],{"type":29,"value":667},{"type":24,"tag":25,"props":4741,"children":4742},{},[4743],{"type":29,"value":340},{"type":24,"tag":32,"props":4745,"children":4746},{},[4747,4751],{"type":24,"tag":36,"props":4748,"children":4749},{},[4750],{"type":29,"value":679},{"type":24,"tag":36,"props":4752,"children":4753},{},[4754],{"type":29,"value":684},{"type":24,"tag":101,"props":4756,"children":4757},{"id":687},[4758],{"type":29,"value":690},{"type":24,"tag":25,"props":4760,"children":4761},{},[4762],{"type":29,"value":299},{"type":24,"tag":32,"props":4764,"children":4765},{},[4766,4770,4774],{"type":24,"tag":36,"props":4767,"children":4768},{},[4769],{"type":29,"value":702},{"type":24,"tag":36,"props":4771,"children":4772},{},[4773],{"type":29,"value":707},{"type":24,"tag":36,"props":4775,"children":4776},{},[4777],{"type":29,"value":712},{"type":24,"tag":25,"props":4779,"children":4780},{},[4781],{"type":29,"value":322},{"type":24,"tag":32,"props":4783,"children":4784},{},[4785,4789],{"type":24,"tag":36,"props":4786,"children":4787},{},[4788],{"type":29,"value":724},{"type":24,"tag":36,"props":4790,"children":4791},{},[4792],{"type":29,"value":729},{"type":24,"tag":25,"props":4794,"children":4795},{},[4796],{"type":29,"value":340},{"type":24,"tag":32,"props":4798,"children":4799},{},[4800,4804],{"type":24,"tag":36,"props":4801,"children":4802},{},[4803],{"type":29,"value":741},{"type":24,"tag":36,"props":4805,"children":4806},{},[4807],{"type":29,"value":746},{"type":24,"tag":101,"props":4809,"children":4810},{"id":749},[4811],{"type":29,"value":752},{"type":24,"tag":25,"props":4813,"children":4814},{},[4815],{"type":29,"value":299},{"type":24,"tag":32,"props":4817,"children":4818},{},[4819,4823,4827],{"type":24,"tag":36,"props":4820,"children":4821},{},[4822],{"type":29,"value":764},{"type":24,"tag":36,"props":4824,"children":4825},{},[4826],{"type":29,"value":769},{"type":24,"tag":36,"props":4828,"children":4829},{},[4830],{"type":29,"value":774},{"type":24,"tag":25,"props":4832,"children":4833},{},[4834],{"type":29,"value":322},{"type":24,"tag":32,"props":4836,"children":4837},{},[4838,4842],{"type":24,"tag":36,"props":4839,"children":4840},{},[4841],{"type":29,"value":786},{"type":24,"tag":36,"props":4843,"children":4844},{},[4845],{"type":29,"value":791},{"type":24,"tag":25,"props":4847,"children":4848},{},[4849],{"type":29,"value":340},{"type":24,"tag":32,"props":4851,"children":4852},{},[4853,4857],{"type":24,"tag":36,"props":4854,"children":4855},{},[4856],{"type":29,"value":803},{"type":24,"tag":36,"props":4858,"children":4859},{},[4860],{"type":29,"value":808},{"type":24,"tag":90,"props":4862,"children":4863},{},[],{"type":24,"tag":94,"props":4865,"children":4866},{"id":814},[4867],{"type":29,"value":817},{"type":24,"tag":25,"props":4869,"children":4870},{},[4871],{"type":29,"value":822},{"type":24,"tag":101,"props":4873,"children":4874},{"id":825},[4875],{"type":29,"value":828},{"type":24,"tag":25,"props":4877,"children":4878},{},[4879],{"type":29,"value":833},{"type":24,"tag":71,"props":4881,"children":4882},{},[4883,4891,4899],{"type":24,"tag":36,"props":4884,"children":4885},{},[4886,4890],{"type":24,"tag":119,"props":4887,"children":4888},{},[4889],{"type":29,"value":844},{"type":29,"value":846},{"type":24,"tag":36,"props":4892,"children":4893},{},[4894,4898],{"type":24,"tag":119,"props":4895,"children":4896},{},[4897],{"type":29,"value":854},{"type":29,"value":856},{"type":24,"tag":36,"props":4900,"children":4901},{},[4902,4906],{"type":24,"tag":119,"props":4903,"children":4904},{},[4905],{"type":29,"value":864},{"type":29,"value":866},{"type":24,"tag":25,"props":4908,"children":4909},{},[4910],{"type":29,"value":871},{"type":24,"tag":32,"props":4912,"children":4913},{},[4914,4918,4922,4926],{"type":24,"tag":36,"props":4915,"children":4916},{},[4917],{"type":29,"value":879},{"type":24,"tag":36,"props":4919,"children":4920},{},[4921],{"type":29,"value":884},{"type":24,"tag":36,"props":4923,"children":4924},{},[4925],{"type":29,"value":889},{"type":24,"tag":36,"props":4927,"children":4928},{},[4929],{"type":29,"value":894},{"type":24,"tag":101,"props":4931,"children":4932},{"id":897},[4933],{"type":29,"value":900},{"type":24,"tag":25,"props":4935,"children":4936},{},[4937],{"type":29,"value":905},{"type":24,"tag":32,"props":4939,"children":4940},{},[4941,4945],{"type":24,"tag":36,"props":4942,"children":4943},{},[4944],{"type":29,"value":913},{"type":24,"tag":36,"props":4946,"children":4947},{},[4948],{"type":29,"value":918},{"type":24,"tag":25,"props":4950,"children":4951},{},[4952],{"type":29,"value":923},{"type":24,"tag":101,"props":4954,"children":4955},{"id":926},[4956],{"type":29,"value":929},{"type":24,"tag":25,"props":4958,"children":4959},{},[4960],{"type":29,"value":934},{"type":24,"tag":71,"props":4962,"children":4963},{},[4964,4968,4972,4976],{"type":24,"tag":36,"props":4965,"children":4966},{},[4967],{"type":29,"value":942},{"type":24,"tag":36,"props":4969,"children":4970},{},[4971],{"type":29,"value":947},{"type":24,"tag":36,"props":4973,"children":4974},{},[4975],{"type":29,"value":952},{"type":24,"tag":36,"props":4977,"children":4978},{},[4979],{"type":29,"value":957},{"type":24,"tag":25,"props":4981,"children":4982},{},[4983],{"type":29,"value":340},{"type":24,"tag":32,"props":4985,"children":4986},{},[4987,4991,4995],{"type":24,"tag":36,"props":4988,"children":4989},{},[4990],{"type":29,"value":969},{"type":24,"tag":36,"props":4992,"children":4993},{},[4994],{"type":29,"value":974},{"type":24,"tag":36,"props":4996,"children":4997},{},[4998],{"type":29,"value":979},{"type":24,"tag":90,"props":5000,"children":5001},{},[],{"type":24,"tag":94,"props":5003,"children":5004},{"id":985},[5005],{"type":29,"value":988},{"type":24,"tag":25,"props":5007,"children":5008},{},[5009],{"type":29,"value":993},{"type":24,"tag":101,"props":5011,"children":5012},{"id":996},[5013],{"type":29,"value":999},{"type":24,"tag":32,"props":5015,"children":5016},{},[5017,5021,5025],{"type":24,"tag":36,"props":5018,"children":5019},{},[5020],{"type":29,"value":1007},{"type":24,"tag":36,"props":5022,"children":5023},{},[5024],{"type":29,"value":1012},{"type":24,"tag":36,"props":5026,"children":5027},{},[5028],{"type":29,"value":1017},{"type":24,"tag":101,"props":5030,"children":5031},{"id":1020},[5032],{"type":29,"value":1023},{"type":24,"tag":32,"props":5034,"children":5035},{},[5036,5040,5044],{"type":24,"tag":36,"props":5037,"children":5038},{},[5039],{"type":29,"value":1031},{"type":24,"tag":36,"props":5041,"children":5042},{},[5043],{"type":29,"value":1036},{"type":24,"tag":36,"props":5045,"children":5046},{},[5047],{"type":29,"value":1041},{"type":24,"tag":101,"props":5049,"children":5050},{"id":1044},[5051],{"type":29,"value":1047},{"type":24,"tag":32,"props":5053,"children":5054},{},[5055,5059,5063],{"type":24,"tag":36,"props":5056,"children":5057},{},[5058],{"type":29,"value":1055},{"type":24,"tag":36,"props":5060,"children":5061},{},[5062],{"type":29,"value":1060},{"type":24,"tag":36,"props":5064,"children":5065},{},[5066],{"type":29,"value":1065},{"type":24,"tag":101,"props":5068,"children":5069},{"id":1068},[5070],{"type":29,"value":1071},{"type":24,"tag":32,"props":5072,"children":5073},{},[5074,5078,5082],{"type":24,"tag":36,"props":5075,"children":5076},{},[5077],{"type":29,"value":1079},{"type":24,"tag":36,"props":5079,"children":5080},{},[5081],{"type":29,"value":1084},{"type":24,"tag":36,"props":5083,"children":5084},{},[5085],{"type":29,"value":1089},{"type":24,"tag":25,"props":5087,"children":5088},{},[5089],{"type":29,"value":1094},{"type":24,"tag":90,"props":5091,"children":5092},{},[],{"type":24,"tag":94,"props":5094,"children":5095},{"id":1100},[5096],{"type":29,"value":1103},{"type":24,"tag":101,"props":5098,"children":5099},{"id":1106},[5100],{"type":29,"value":1109},{"type":24,"tag":71,"props":5102,"children":5103},{},[5104,5108,5112],{"type":24,"tag":36,"props":5105,"children":5106},{},[5107],{"type":29,"value":1117},{"type":24,"tag":36,"props":5109,"children":5110},{},[5111],{"type":29,"value":1122},{"type":24,"tag":36,"props":5113,"children":5114},{},[5115],{"type":29,"value":1127},{"type":24,"tag":101,"props":5117,"children":5118},{"id":1130},[5119],{"type":29,"value":1133},{"type":24,"tag":32,"props":5121,"children":5122},{},[5123,5127,5131],{"type":24,"tag":36,"props":5124,"children":5125},{},[5126],{"type":29,"value":1141},{"type":24,"tag":36,"props":5128,"children":5129},{},[5130],{"type":29,"value":1146},{"type":24,"tag":36,"props":5132,"children":5133},{},[5134],{"type":29,"value":1151},{"type":24,"tag":25,"props":5136,"children":5137},{},[5138],{"type":29,"value":1156},{"type":24,"tag":90,"props":5140,"children":5141},{},[],{"type":24,"tag":94,"props":5143,"children":5144},{"id":1162},[5145],{"type":29,"value":1165},{"type":24,"tag":25,"props":5147,"children":5148},{},[5149],{"type":29,"value":1170},{"type":24,"tag":71,"props":5151,"children":5152},{},[5153,5157,5161,5165,5169,5173],{"type":24,"tag":36,"props":5154,"children":5155},{},[5156],{"type":29,"value":1178},{"type":24,"tag":36,"props":5158,"children":5159},{},[5160],{"type":29,"value":1183},{"type":24,"tag":36,"props":5162,"children":5163},{},[5164],{"type":29,"value":1188},{"type":24,"tag":36,"props":5166,"children":5167},{},[5168],{"type":29,"value":1193},{"type":24,"tag":36,"props":5170,"children":5171},{},[5172],{"type":29,"value":1198},{"type":24,"tag":36,"props":5174,"children":5175},{},[5176],{"type":29,"value":1203},{"type":24,"tag":25,"props":5178,"children":5179},{},[5180],{"type":29,"value":1208},{"type":24,"tag":32,"props":5182,"children":5183},{},[5184,5188],{"type":24,"tag":36,"props":5185,"children":5186},{},[5187],{"type":29,"value":1216},{"type":24,"tag":36,"props":5189,"children":5190},{},[5191],{"type":29,"value":1221},{"type":24,"tag":90,"props":5193,"children":5194},{},[],{"type":24,"tag":94,"props":5196,"children":5197},{"id":1227},[5198],{"type":29,"value":1230},{"type":24,"tag":101,"props":5200,"children":5201},{"id":1233},[5202],{"type":29,"value":1236},{"type":24,"tag":25,"props":5204,"children":5205},{},[5206],{"type":29,"value":1241},{"type":24,"tag":101,"props":5208,"children":5209},{"id":1244},[5210],{"type":29,"value":1247},{"type":24,"tag":25,"props":5212,"children":5213},{},[5214],{"type":29,"value":1252},{"type":24,"tag":101,"props":5216,"children":5217},{"id":1255},[5218],{"type":29,"value":1258},{"type":24,"tag":25,"props":5220,"children":5221},{},[5222],{"type":29,"value":1263},{"type":24,"tag":101,"props":5224,"children":5225},{"id":1266},[5226],{"type":29,"value":1269},{"type":24,"tag":25,"props":5228,"children":5229},{},[5230],{"type":29,"value":1274},{"type":24,"tag":90,"props":5232,"children":5233},{},[],{"type":24,"tag":94,"props":5235,"children":5236},{"id":1280},[5237],{"type":29,"value":1283},{"type":24,"tag":25,"props":5239,"children":5240},{},[5241],{"type":29,"value":1288},{"type":24,"tag":32,"props":5243,"children":5244},{},[5245,5249,5253,5257],{"type":24,"tag":36,"props":5246,"children":5247},{},[5248],{"type":29,"value":1296},{"type":24,"tag":36,"props":5250,"children":5251},{},[5252],{"type":29,"value":1301},{"type":24,"tag":36,"props":5254,"children":5255},{},[5256],{"type":29,"value":1306},{"type":24,"tag":36,"props":5258,"children":5259},{},[5260],{"type":29,"value":1311},{"type":24,"tag":25,"props":5262,"children":5263},{},[5264],{"type":29,"value":1316},{"type":24,"tag":90,"props":5266,"children":5267},{},[],{"type":24,"tag":94,"props":5269,"children":5270},{"id":1322},[5271],{"type":29,"value":1325},{"type":24,"tag":25,"props":5273,"children":5274},{},[5275],{"type":29,"value":1330},{"type":24,"tag":32,"props":5277,"children":5278},{},[5279,5283,5287],{"type":24,"tag":36,"props":5280,"children":5281},{},[5282],{"type":29,"value":1338},{"type":24,"tag":36,"props":5284,"children":5285},{},[5286],{"type":29,"value":1343},{"type":24,"tag":36,"props":5288,"children":5289},{},[5290],{"type":29,"value":1348},{"type":24,"tag":25,"props":5292,"children":5293},{},[5294],{"type":29,"value":1353},{"type":24,"tag":25,"props":5296,"children":5297},{},[5298],{"type":29,"value":1358},{"type":24,"tag":32,"props":5300,"children":5301},{},[5302,5309,5316],{"type":24,"tag":36,"props":5303,"children":5304},{},[5305],{"type":24,"tag":1366,"props":5306,"children":5307},{"href":1368},[5308],{"type":29,"value":1371},{"type":24,"tag":36,"props":5310,"children":5311},{},[5312],{"type":24,"tag":1366,"props":5313,"children":5314},{"href":1377},[5315],{"type":29,"value":1380},{"type":24,"tag":36,"props":5317,"children":5318},{},[5319],{"type":24,"tag":1366,"props":5320,"children":5321},{"href":1386},[5322],{"type":29,"value":1389},{"title":7,"searchDepth":1391,"depth":1391,"links":5324},[5325,5329,5330,5336,5342,5347,5353,5357,5358,5364,5365],{"id":96,"depth":1394,"text":99,"children":5326},[5327,5328],{"id":103,"depth":1391,"text":106},{"id":158,"depth":1391,"text":161},{"id":210,"depth":1394,"text":213},{"id":280,"depth":1394,"text":283,"children":5331},[5332,5333,5334,5335],{"id":291,"depth":1391,"text":294},{"id":356,"depth":1391,"text":359},{"id":418,"depth":1391,"text":421},{"id":480,"depth":1391,"text":483},{"id":552,"depth":1394,"text":555,"children":5337},[5338,5339,5340,5341],{"id":563,"depth":1391,"text":566},{"id":625,"depth":1391,"text":628},{"id":687,"depth":1391,"text":690},{"id":749,"depth":1391,"text":752},{"id":814,"depth":1394,"text":817,"children":5343},[5344,5345,5346],{"id":825,"depth":1391,"text":828},{"id":897,"depth":1391,"text":900},{"id":926,"depth":1391,"text":929},{"id":985,"depth":1394,"text":988,"children":5348},[5349,5350,5351,5352],{"id":996,"depth":1391,"text":999},{"id":1020,"depth":1391,"text":1023},{"id":1044,"depth":1391,"text":1047},{"id":1068,"depth":1391,"text":1071},{"id":1100,"depth":1394,"text":1103,"children":5354},[5355,5356],{"id":1106,"depth":1391,"text":1109},{"id":1130,"depth":1391,"text":1133},{"id":1162,"depth":1394,"text":1165},{"id":1227,"depth":1394,"text":1230,"children":5359},[5360,5361,5362,5363],{"id":1233,"depth":1391,"text":1236},{"id":1244,"depth":1391,"text":1247},{"id":1255,"depth":1391,"text":1258},{"id":1266,"depth":1391,"text":1269},{"id":1280,"depth":1394,"text":1283},{"id":1322,"depth":1394,"text":1325},1775358508872]