[{"data":1,"prerenderedAt":2962},["ShallowReactive",2],{"article-/topics/nuxt/zero-downtime-deployment-canary-release-guide":3,"related-nuxt":376,"content-query-PBeU8JWAfT":2688},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":12,"image":18,"imageQuery":19,"pexelsPhotoId":20,"pexelsUrl":21,"featured":6,"readingTime":22,"body":23,"_type":370,"_id":371,"_source":372,"_file":373,"_stem":374,"_extension":375},"/topics/nuxt/zero-downtime-deployment-canary-release-guide","nuxt",false,"","零停机部署与灰度发布：别把发布成功定义成“服务没挂”，而要看用户是否无感","零停机部署和灰度发布真正解决的不是流程好看，而是控制变更风险、缩短回滚时间和降低用户感知。本文从发布路径、健康门槛和版本治理出发，讲清这套机制怎么落地。","2026-05-01","HTMLPAGE 团队",[13,14,15,16,17],"Zero Downtime Deployment","Canary Release","Nuxt","Release Engineering","DevOps","/images/topics/nuxt/zero-downtime-deployment-canary-release-guide.jpg","devops release monitoring charts on laptop screen",7108129,"https://www.pexels.com/photo/gray-laptop-on-the-table-7108129/",15,{"type":24,"children":25,"toc":358},"root",[26,34,39,48,55,60,75,80,85,90,113,118,124,129,134,139,162,167,173,178,201,206,212,217,235,240,245,250,279,284,312,317,322,327],{"type":27,"tag":28,"props":29,"children":30},"element","p",{},[31],{"type":32,"value":33},"text","很多团队会把发布成功定义成一句很低的标准：服务没挂、页面能打开、报警没响。",{"type":27,"tag":28,"props":35,"children":36},{},[37],{"type":32,"value":38},"但真正成熟的发布体系追求的是另一件事：",{"type":27,"tag":28,"props":40,"children":41},{},[42],{"type":27,"tag":43,"props":44,"children":45},"strong",{},[46],{"type":32,"value":47},"用户几乎感知不到你刚刚发了一个版本。",{"type":27,"tag":49,"props":50,"children":52},"h2",{"id":51},"零停机部署关注的是切换瞬间灰度发布关注的是放量路径",[53],{"type":32,"value":54},"零停机部署关注的是“切换瞬间”，灰度发布关注的是“放量路径”",{"type":27,"tag":28,"props":56,"children":57},{},[58],{"type":32,"value":59},"这两个概念经常一起出现，但并不完全相同。",{"type":27,"tag":61,"props":62,"children":63},"ul",{},[64,70],{"type":27,"tag":65,"props":66,"children":67},"li",{},[68],{"type":32,"value":69},"零停机部署解决的是新旧版本切换时服务不中断",{"type":27,"tag":65,"props":71,"children":72},{},[73],{"type":32,"value":74},"灰度发布解决的是新版本如何逐步放量、逐步验证",{"type":27,"tag":28,"props":76,"children":77},{},[78],{"type":32,"value":79},"如果只做零停机切换，没有灰度验证，服务虽然不会瞬断，风险仍然会一次性暴露给所有用户。",{"type":27,"tag":49,"props":81,"children":83},{"id":82},"先建立版本切换的最小安全条件",[84],{"type":32,"value":82},{"type":27,"tag":28,"props":86,"children":87},{},[88],{"type":32,"value":89},"要真正做到零停机，团队至少要先回答：",{"type":27,"tag":61,"props":91,"children":92},{},[93,98,103,108],{"type":27,"tag":65,"props":94,"children":95},{},[96],{"type":32,"value":97},"新版本何时算 ready",{"type":27,"tag":65,"props":99,"children":100},{},[101],{"type":32,"value":102},"老版本何时允许摘流",{"type":27,"tag":65,"props":104,"children":105},{},[106],{"type":32,"value":107},"会话、缓存和静态资源是否兼容",{"type":27,"tag":65,"props":109,"children":110},{},[111],{"type":32,"value":112},"数据结构变更是否支持双版本共存",{"type":27,"tag":28,"props":114,"children":115},{},[116],{"type":32,"value":117},"这些问题不清楚，所谓零停机通常只是“碰巧没出事”。",{"type":27,"tag":49,"props":119,"children":121},{"id":120},"灰度发布要绑定可观测信号而不是只绑定比例",[122],{"type":32,"value":123},"灰度发布要绑定可观测信号，而不是只绑定比例",{"type":27,"tag":28,"props":125,"children":126},{},[127],{"type":32,"value":128},"灰度发布最常见的误区，是把重点放在 5%、10%、20% 这些比例上。",{"type":27,"tag":28,"props":130,"children":131},{},[132],{"type":32,"value":133},"但比例本身没有意义，关键是每一步放量都依据什么判断。",{"type":27,"tag":28,"props":135,"children":136},{},[137],{"type":32,"value":138},"更稳的信号通常包括：",{"type":27,"tag":61,"props":140,"children":141},{},[142,147,152,157],{"type":27,"tag":65,"props":143,"children":144},{},[145],{"type":32,"value":146},"错误率",{"type":27,"tag":65,"props":148,"children":149},{},[150],{"type":32,"value":151},"延迟变化",{"type":27,"tag":65,"props":153,"children":154},{},[155],{"type":32,"value":156},"关键接口成功率",{"type":27,"tag":65,"props":158,"children":159},{},[160],{"type":32,"value":161},"关键转化路径指标",{"type":27,"tag":28,"props":163,"children":164},{},[165],{"type":32,"value":166},"如果没有这些信号，灰度只是一种更慢的全量发布。",{"type":27,"tag":49,"props":168,"children":170},{"id":169},"nuxt-应用发布时要特别关注哪些兼容问题",[171],{"type":32,"value":172},"Nuxt 应用发布时要特别关注哪些兼容问题",{"type":27,"tag":28,"props":174,"children":175},{},[176],{"type":32,"value":177},"Nuxt 项目常见的风险点包括：",{"type":27,"tag":61,"props":179,"children":180},{},[181,186,191,196],{"type":27,"tag":65,"props":182,"children":183},{},[184],{"type":32,"value":185},"新旧版本静态资源 hash 不一致",{"type":27,"tag":65,"props":187,"children":188},{},[189],{"type":32,"value":190},"SSR 与客户端 hydration 结果不一致",{"type":27,"tag":65,"props":192,"children":193},{},[194],{"type":32,"value":195},"环境配置切换后行为改变",{"type":27,"tag":65,"props":197,"children":198},{},[199],{"type":32,"value":200},"API 响应结构更新导致旧页面失效",{"type":27,"tag":28,"props":202,"children":203},{},[204],{"type":32,"value":205},"这也是为什么零停机与灰度发布不能只由平台层决定，应用层也必须配合设计。",{"type":27,"tag":49,"props":207,"children":209},{"id":208},"常见失败案例灰度做了问题还是在全量后才暴露",[210],{"type":32,"value":211},"常见失败案例：灰度做了，问题还是在全量后才暴露",{"type":27,"tag":28,"props":213,"children":214},{},[215],{"type":32,"value":216},"这类情况通常不是灰度没做，而是灰度维度太粗：",{"type":27,"tag":61,"props":218,"children":219},{},[220,225,230],{"type":27,"tag":65,"props":221,"children":222},{},[223],{"type":32,"value":224},"只看服务层指标，不看业务指标",{"type":27,"tag":65,"props":226,"children":227},{},[228],{"type":32,"value":229},"只看平均值，不看特定设备或路由",{"type":27,"tag":65,"props":231,"children":232},{},[233],{"type":32,"value":234},"只灰度流量，不灰度依赖与配置",{"type":27,"tag":28,"props":236,"children":237},{},[238],{"type":32,"value":239},"结果是前期看起来正常，真正放量后才出现结构性问题。",{"type":27,"tag":49,"props":241,"children":243},{"id":242},"一个更稳的发布路径",[244],{"type":32,"value":242},{"type":27,"tag":28,"props":246,"children":247},{},[248],{"type":32,"value":249},"推荐的做法通常是：",{"type":27,"tag":251,"props":252,"children":253},"ol",{},[254,259,264,269,274],{"type":27,"tag":65,"props":255,"children":256},{},[257],{"type":32,"value":258},"先保证新旧版本能短时间共存",{"type":27,"tag":65,"props":260,"children":261},{},[262],{"type":32,"value":263},"用 readiness 和健康信号决定切换时机",{"type":27,"tag":65,"props":265,"children":266},{},[267],{"type":32,"value":268},"先灰度低风险流量，再逐步放大范围",{"type":27,"tag":65,"props":270,"children":271},{},[272],{"type":32,"value":273},"每一步放量都绑定明确观测指标和回滚门槛",{"type":27,"tag":65,"props":275,"children":276},{},[277],{"type":32,"value":278},"回滚路径必须预先演练，而不是出事后临时决定",{"type":27,"tag":49,"props":280,"children":282},{"id":281},"一份可直接复用的检查清单",[283],{"type":32,"value":281},{"type":27,"tag":61,"props":285,"children":286},{},[287,292,297,302,307],{"type":27,"tag":65,"props":288,"children":289},{},[290],{"type":32,"value":291},"新旧版本是否支持短时间共存和快速切换",{"type":27,"tag":65,"props":293,"children":294},{},[295],{"type":32,"value":296},"readiness 门槛是否真实反映可用状态",{"type":27,"tag":65,"props":298,"children":299},{},[300],{"type":32,"value":301},"灰度步骤是否绑定错误率、延迟和业务指标",{"type":27,"tag":65,"props":303,"children":304},{},[305],{"type":32,"value":306},"静态资源、缓存和 API 变更是否考虑了兼容窗口",{"type":27,"tag":65,"props":308,"children":309},{},[310],{"type":32,"value":311},"回滚机制是否简单、明确并经过演练",{"type":27,"tag":49,"props":313,"children":315},{"id":314},"总结",[316],{"type":32,"value":314},{"type":27,"tag":28,"props":318,"children":319},{},[320],{"type":32,"value":321},"零停机部署与灰度发布的价值，不是让发布流程看起来更专业，而是让变更风险被拆小、被看见、被快速回退。只要切换条件、观测指标和回滚路径一起设计，发布就会真正变稳。",{"type":27,"tag":28,"props":323,"children":324},{},[325],{"type":32,"value":326},"进一步阅读：",{"type":27,"tag":61,"props":328,"children":329},{},[330,340,349],{"type":27,"tag":65,"props":331,"children":332},{},[333],{"type":27,"tag":334,"props":335,"children":337},"a",{"href":336},"/topics/nuxt/kubernetes-production-configuration-guide",[338],{"type":32,"value":339},"Kubernetes 生产环境配置",{"type":27,"tag":65,"props":341,"children":342},{},[343],{"type":27,"tag":334,"props":344,"children":346},{"href":345},"/topics/nuxt/dockerized-nuxt-deployment-guide",[347],{"type":32,"value":348},"Docker 容器化部署指南",{"type":27,"tag":65,"props":350,"children":351},{},[352],{"type":27,"tag":334,"props":353,"children":355},{"href":354},"/topics/nuxt/nuxt-observability-logging-guide",[356],{"type":32,"value":357},"Nuxt 应用监控与日志",{"title":7,"searchDepth":359,"depth":359,"links":360},3,[361,363,364,365,366,367,368,369],{"id":51,"depth":362,"text":54},2,{"id":82,"depth":362,"text":82},{"id":120,"depth":362,"text":123},{"id":169,"depth":362,"text":172},{"id":208,"depth":362,"text":211},{"id":242,"depth":362,"text":242},{"id":281,"depth":362,"text":281},{"id":314,"depth":362,"text":314},"markdown","content:topics:nuxt:zero-downtime-deployment-canary-release-guide.md","content","topics/nuxt/zero-downtime-deployment-canary-release-guide.md","topics/nuxt/zero-downtime-deployment-canary-release-guide","md",[377,1363,2147],{"_path":378,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":379,"description":380,"date":381,"topic":5,"author":11,"tags":382,"image":388,"featured":389,"readingTime":390,"body":391,"_type":370,"_id":1360,"_source":372,"_file":1361,"_stem":1362,"_extension":375},"/topics/nuxt/nitro-engine-deep-dive","Nitro 引擎深度剖析","讲透 Nuxt/Nitro 的运行时模型、路由与中间件、存储层与缓存、部署适配与性能调优，帮助你把服务端能力当成可控的工程系统。","2026-01-20",[15,383,384,385,386,387],"Nitro","SSR","Serverless","Edge","缓存","/images/topics/nuxt/nitro.jpg",true,21,{"type":24,"children":392,"toc":1328},[393,398,410,415,474,479,484,488,494,499,522,527,545,548,554,559,582,587,590,612,624,642,653,666,672,695,698,704,709,740,745,758,761,767,779,792,797,815,820,833,836,842,847,865,871,890,896,901,906,935,938,944,949,967,972,990,996,1009,1015,1028,1034,1047,1052,1065,1068,1074,1080,1093,1099,1112,1118,1131,1134,1140,1145,1168,1173,1186,1189,1195,1200,1258,1263,1281,1284,1288,1300,1305],{"type":27,"tag":49,"props":394,"children":396},{"id":395},"nitro-引擎深度剖析",[397],{"type":32,"value":379},{"type":27,"tag":28,"props":399,"children":400},{},[401,403,408],{"type":32,"value":402},"在 Nuxt 3/4 的体系里，Nitro 不是“一个服务器”，而是一套",{"type":27,"tag":43,"props":404,"children":405},{},[406],{"type":32,"value":407},"可移植的服务端运行时与构建产物规范",{"type":32,"value":409},"。",{"type":27,"tag":28,"props":411,"children":412},{},[413],{"type":32,"value":414},"它把你在开发时写的：",{"type":27,"tag":61,"props":416,"children":417},{},[418,430,441,452,463],{"type":27,"tag":65,"props":419,"children":420},{},[421,428],{"type":27,"tag":422,"props":423,"children":425},"code",{"className":424},[],[426],{"type":32,"value":427},"server/api/*",{"type":32,"value":429},"（API 路由）",{"type":27,"tag":65,"props":431,"children":432},{},[433,439],{"type":27,"tag":422,"props":434,"children":436},{"className":435},[],[437],{"type":32,"value":438},"server/routes/*",{"type":32,"value":440},"（更底层路由）",{"type":27,"tag":65,"props":442,"children":443},{},[444,450],{"type":27,"tag":422,"props":445,"children":447},{"className":446},[],[448],{"type":32,"value":449},"server/middleware/*",{"type":32,"value":451},"（中间件）",{"type":27,"tag":65,"props":453,"children":454},{},[455,461],{"type":27,"tag":422,"props":456,"children":458},{"className":457},[],[459],{"type":32,"value":460},"server/plugins/*",{"type":32,"value":462},"（启动插件）",{"type":27,"tag":65,"props":464,"children":465},{},[466,472],{"type":27,"tag":422,"props":467,"children":469},{"className":468},[],[470],{"type":32,"value":471},"storage",{"type":32,"value":473},"（KV/文件/内存等存储抽象）",{"type":27,"tag":28,"props":475,"children":476},{},[477],{"type":32,"value":478},"统一编译成一个可以部署到多种环境的产物：Node Server、Serverless、Edge（取决于适配器与能力集）。",{"type":27,"tag":28,"props":480,"children":481},{},[482],{"type":32,"value":483},"这篇文章按“你要在生产上稳定运行”的视角，拆解 Nitro 的关键构件，并给出性能与可观测性落地建议。",{"type":27,"tag":485,"props":486,"children":487},"hr",{},[],{"type":27,"tag":49,"props":489,"children":491},{"id":490},"_1-nitro-的定位从-nuxt-ssr-到通用服务端运行时",[492],{"type":32,"value":493},"1. Nitro 的定位：从 Nuxt SSR 到“通用服务端运行时”",{"type":27,"tag":28,"props":495,"children":496},{},[497],{"type":32,"value":498},"Nitro 解决两类问题：",{"type":27,"tag":251,"props":500,"children":501},{},[502,512],{"type":27,"tag":65,"props":503,"children":504},{},[505,510],{"type":27,"tag":43,"props":506,"children":507},{},[508],{"type":32,"value":509},"运行时统一",{"type":32,"value":511},"：开发/生产环境一致的请求处理模型",{"type":27,"tag":65,"props":513,"children":514},{},[515,520],{"type":27,"tag":43,"props":516,"children":517},{},[518],{"type":32,"value":519},"部署可移植",{"type":32,"value":521},"：同一套代码可输出到不同部署目标",{"type":27,"tag":28,"props":523,"children":524},{},[525],{"type":32,"value":526},"你可以把 Nitro 看作 Nuxt 的“服务端内核”，而 Nuxt 只是围绕它提供：",{"type":27,"tag":61,"props":528,"children":529},{},[530,535,540],{"type":27,"tag":65,"props":531,"children":532},{},[533],{"type":32,"value":534},"视图渲染（SSR/RSC 相关能力）",{"type":27,"tag":65,"props":536,"children":537},{},[538],{"type":32,"value":539},"资源构建（Vite/Webpack）",{"type":27,"tag":65,"props":541,"children":542},{},[543],{"type":32,"value":544},"路由与数据获取的上层抽象",{"type":27,"tag":485,"props":546,"children":547},{},[],{"type":27,"tag":49,"props":549,"children":551},{"id":550},"_2-请求生命周期一次请求在-nitro-里怎么走",[552],{"type":32,"value":553},"2. 请求生命周期：一次请求在 Nitro 里怎么走？",{"type":27,"tag":28,"props":555,"children":556},{},[557],{"type":32,"value":558},"简化后的请求链路：",{"type":27,"tag":251,"props":560,"children":561},{},[562,567,572,577],{"type":27,"tag":65,"props":563,"children":564},{},[565],{"type":32,"value":566},"入口适配器接收请求（Node/Serverless/Edge）",{"type":27,"tag":65,"props":568,"children":569},{},[570],{"type":32,"value":571},"进入 Nitro 的 H3 请求处理器（统一事件模型）",{"type":27,"tag":65,"props":573,"children":574},{},[575],{"type":32,"value":576},"依次执行：中间件 → 路由匹配 → handler",{"type":27,"tag":65,"props":578,"children":579},{},[580],{"type":32,"value":581},"写回响应（含 headers、缓存策略、流式输出等）",{"type":27,"tag":28,"props":583,"children":584},{},[585],{"type":32,"value":586},"关键点：Nitro 用统一的事件对象承载请求上下文，这让你在不同部署目标下写出的 server 代码保持一致。",{"type":27,"tag":485,"props":588,"children":589},{},[],{"type":27,"tag":49,"props":591,"children":593},{"id":592},"_3-路由系统serverapi-与-serverroutes-的区别",[594,596,602,604,610],{"type":32,"value":595},"3. 路由系统：",{"type":27,"tag":422,"props":597,"children":599},{"className":598},[],[600],{"type":32,"value":601},"server/api",{"type":32,"value":603}," 与 ",{"type":27,"tag":422,"props":605,"children":607},{"className":606},[],[608],{"type":32,"value":609},"server/routes",{"type":32,"value":611}," 的区别",{"type":27,"tag":613,"props":614,"children":616},"h3",{"id":615},"_31-serverapi",[617,619],{"type":32,"value":618},"3.1 ",{"type":27,"tag":422,"props":620,"children":622},{"className":621},[],[623],{"type":32,"value":427},{"type":27,"tag":61,"props":625,"children":626},{},[627,632,637],{"type":27,"tag":65,"props":628,"children":629},{},[630],{"type":32,"value":631},"面向 API 的约定式目录",{"type":27,"tag":65,"props":633,"children":634},{},[635],{"type":32,"value":636},"通常返回 JSON",{"type":27,"tag":65,"props":638,"children":639},{},[640],{"type":32,"value":641},"与 Nuxt 的开发体验高度整合",{"type":27,"tag":613,"props":643,"children":645},{"id":644},"_32-serverroutes",[646,648],{"type":32,"value":647},"3.2 ",{"type":27,"tag":422,"props":649,"children":651},{"className":650},[],[652],{"type":32,"value":438},{"type":27,"tag":61,"props":654,"children":655},{},[656,661],{"type":27,"tag":65,"props":657,"children":658},{},[659],{"type":32,"value":660},"更底层，更贴近“HTTP 路由”",{"type":27,"tag":65,"props":662,"children":663},{},[664],{"type":32,"value":665},"更适合做：Webhook、回调、代理、特殊 content-type",{"type":27,"tag":613,"props":667,"children":669},{"id":668},"_33-实践建议",[670],{"type":32,"value":671},"3.3 实践建议",{"type":27,"tag":61,"props":673,"children":674},{},[675,685],{"type":27,"tag":65,"props":676,"children":677},{},[678,680],{"type":32,"value":679},"普通业务 API：优先 ",{"type":27,"tag":422,"props":681,"children":683},{"className":682},[],[684],{"type":32,"value":601},{"type":27,"tag":65,"props":686,"children":687},{},[688,690],{"type":32,"value":689},"需要更强控制（stream、代理、非 JSON）：用 ",{"type":27,"tag":422,"props":691,"children":693},{"className":692},[],[694],{"type":32,"value":609},{"type":27,"tag":485,"props":696,"children":697},{},[],{"type":27,"tag":49,"props":699,"children":701},{"id":700},"_4-中间件全局逻辑的正确放置",[702],{"type":32,"value":703},"4. 中间件：全局逻辑的正确放置",{"type":27,"tag":28,"props":705,"children":706},{},[707],{"type":32,"value":708},"Nitro 中的中间件通常用于：",{"type":27,"tag":61,"props":710,"children":711},{},[712,717,730,735],{"type":27,"tag":65,"props":713,"children":714},{},[715],{"type":32,"value":716},"鉴权/鉴别请求来源",{"type":27,"tag":65,"props":718,"children":719},{},[720,722,728],{"type":32,"value":721},"注入 ",{"type":27,"tag":422,"props":723,"children":725},{"className":724},[],[726],{"type":32,"value":727},"requestId",{"type":32,"value":729},"、trace 信息",{"type":27,"tag":65,"props":731,"children":732},{},[733],{"type":32,"value":734},"统一错误处理与日志",{"type":27,"tag":65,"props":736,"children":737},{},[738],{"type":32,"value":739},"基础安全 headers",{"type":27,"tag":28,"props":741,"children":742},{},[743],{"type":32,"value":744},"一个推荐的中间件职责边界：",{"type":27,"tag":61,"props":746,"children":747},{},[748,753],{"type":27,"tag":65,"props":749,"children":750},{},[751],{"type":32,"value":752},"中间件只做“横切关注点”",{"type":27,"tag":65,"props":754,"children":755},{},[756],{"type":32,"value":757},"不做具体业务（避免耦合与隐式依赖）",{"type":27,"tag":485,"props":759,"children":760},{},[],{"type":27,"tag":49,"props":762,"children":764},{"id":763},"_5-storage-抽象让缓存与数据存取可替换",[765],{"type":32,"value":766},"5. Storage 抽象：让缓存与数据存取可替换",{"type":27,"tag":28,"props":768,"children":769},{},[770,772,777],{"type":32,"value":771},"Nitro 的一个被低估的能力是 ",{"type":27,"tag":422,"props":773,"children":775},{"className":774},[],[776],{"type":32,"value":471},{"type":32,"value":778},"：",{"type":27,"tag":61,"props":780,"children":781},{},[782,787],{"type":27,"tag":65,"props":783,"children":784},{},[785],{"type":32,"value":786},"提供 KV 风格 API",{"type":27,"tag":65,"props":788,"children":789},{},[790],{"type":32,"value":791},"可接入内存、文件、Redis 等（取决于配置与环境）",{"type":27,"tag":28,"props":793,"children":794},{},[795],{"type":32,"value":796},"你可以用它做：",{"type":27,"tag":61,"props":798,"children":799},{},[800,805,810],{"type":27,"tag":65,"props":801,"children":802},{},[803],{"type":32,"value":804},"缓存（页面片段、API 结果）",{"type":27,"tag":65,"props":806,"children":807},{},[808],{"type":32,"value":809},"限流计数器",{"type":27,"tag":65,"props":811,"children":812},{},[813],{"type":32,"value":814},"临时会话信息",{"type":27,"tag":28,"props":816,"children":817},{},[818],{"type":32,"value":819},"设计原则：",{"type":27,"tag":61,"props":821,"children":822},{},[823,828],{"type":27,"tag":65,"props":824,"children":825},{},[826],{"type":32,"value":827},"把 storage 当成“可失效缓存”，不要当主数据库",{"type":27,"tag":65,"props":829,"children":830},{},[831],{"type":32,"value":832},"明确 TTL 与清理策略",{"type":27,"tag":485,"props":834,"children":835},{},[],{"type":27,"tag":49,"props":837,"children":839},{"id":838},"_6-缓存策略把快变成可控的工程能力",[840],{"type":32,"value":841},"6. 缓存策略：把“快”变成可控的工程能力",{"type":27,"tag":28,"props":843,"children":844},{},[845],{"type":32,"value":846},"Nitro 里的缓存往往涉及三层：",{"type":27,"tag":251,"props":848,"children":849},{},[850,855,860],{"type":27,"tag":65,"props":851,"children":852},{},[853],{"type":32,"value":854},"CDN 缓存（边缘）",{"type":27,"tag":65,"props":856,"children":857},{},[858],{"type":32,"value":859},"Nitro 运行时缓存（storage）",{"type":27,"tag":65,"props":861,"children":862},{},[863],{"type":32,"value":864},"上游服务缓存（数据库/服务端）",{"type":27,"tag":613,"props":866,"children":868},{"id":867},"_61-api-缓存的推荐做法",[869],{"type":32,"value":870},"6.1 API 缓存的推荐做法",{"type":27,"tag":61,"props":872,"children":873},{},[874,885],{"type":27,"tag":65,"props":875,"children":876},{},[877,879],{"type":32,"value":878},"对“读多写少”的接口做 ",{"type":27,"tag":422,"props":880,"children":882},{"className":881},[],[883],{"type":32,"value":884},"stale-while-revalidate",{"type":27,"tag":65,"props":886,"children":887},{},[888],{"type":32,"value":889},"缓存 key 必须包含：用户态/语言/地区/权限等关键维度",{"type":27,"tag":613,"props":891,"children":893},{"id":892},"_62-不要缓存带用户身份的响应除非你非常确定",[894],{"type":32,"value":895},"6.2 不要缓存“带用户身份”的响应（除非你非常确定）",{"type":27,"tag":28,"props":897,"children":898},{},[899],{"type":32,"value":900},"最容易出事故的是把 A 用户的数据缓存给 B 用户。",{"type":27,"tag":28,"props":902,"children":903},{},[904],{"type":32,"value":905},"建议：",{"type":27,"tag":61,"props":907,"children":908},{},[909,914],{"type":27,"tag":65,"props":910,"children":911},{},[912],{"type":32,"value":913},"默认对用户态接口不缓存",{"type":27,"tag":65,"props":915,"children":916},{},[917,919,925,927,933],{"type":32,"value":918},"必须缓存时，key 中加入 ",{"type":27,"tag":422,"props":920,"children":922},{"className":921},[],[923],{"type":32,"value":924},"userId",{"type":32,"value":926}," 或 ",{"type":27,"tag":422,"props":928,"children":930},{"className":929},[],[931],{"type":32,"value":932},"session",{"type":32,"value":934}," 维度",{"type":27,"tag":485,"props":936,"children":937},{},[],{"type":27,"tag":49,"props":939,"children":941},{"id":940},"_7-部署适配为什么同一套代码能跑在不同环境",[942],{"type":32,"value":943},"7. 部署适配：为什么同一套代码能跑在不同环境？",{"type":27,"tag":28,"props":945,"children":946},{},[947],{"type":32,"value":948},"Nitro 的部署产物通常包含：",{"type":27,"tag":61,"props":950,"children":951},{},[952,957,962],{"type":27,"tag":65,"props":953,"children":954},{},[955],{"type":32,"value":956},"编译后的 server bundle",{"type":27,"tag":65,"props":958,"children":959},{},[960],{"type":32,"value":961},"路由清单与运行时配置",{"type":27,"tag":65,"props":963,"children":964},{},[965],{"type":32,"value":966},"静态资源与预渲染结果（如果启用）",{"type":27,"tag":28,"props":968,"children":969},{},[970],{"type":32,"value":971},"在不同目标下的差异主要在：",{"type":27,"tag":61,"props":973,"children":974},{},[975,980,985],{"type":27,"tag":65,"props":976,"children":977},{},[978],{"type":32,"value":979},"运行时能力（Node API 是否可用）",{"type":27,"tag":65,"props":981,"children":982},{},[983],{"type":32,"value":984},"冷启动与并发模型",{"type":27,"tag":65,"props":986,"children":987},{},[988],{"type":32,"value":989},"文件系统是否可写",{"type":27,"tag":613,"props":991,"children":993},{"id":992},"_71-node-server",[994],{"type":32,"value":995},"7.1 Node Server",{"type":27,"tag":61,"props":997,"children":998},{},[999,1004],{"type":27,"tag":65,"props":1000,"children":1001},{},[1002],{"type":32,"value":1003},"能力最完整",{"type":27,"tag":65,"props":1005,"children":1006},{},[1007],{"type":32,"value":1008},"适合长连接、websocket（需配合平台）",{"type":27,"tag":613,"props":1010,"children":1012},{"id":1011},"_72-serverless",[1013],{"type":32,"value":1014},"7.2 Serverless",{"type":27,"tag":61,"props":1016,"children":1017},{},[1018,1023],{"type":27,"tag":65,"props":1019,"children":1020},{},[1021],{"type":32,"value":1022},"冷启动成本、执行时长限制",{"type":27,"tag":65,"props":1024,"children":1025},{},[1026],{"type":32,"value":1027},"更适合 API 型工作负载",{"type":27,"tag":613,"props":1029,"children":1031},{"id":1030},"_73-edge",[1032],{"type":32,"value":1033},"7.3 Edge",{"type":27,"tag":61,"props":1035,"children":1036},{},[1037,1042],{"type":27,"tag":65,"props":1038,"children":1039},{},[1040],{"type":32,"value":1041},"延迟更低",{"type":27,"tag":65,"props":1043,"children":1044},{},[1045],{"type":32,"value":1046},"运行时限制更严格（例如 Node API 不可用）",{"type":27,"tag":28,"props":1048,"children":1049},{},[1050],{"type":32,"value":1051},"实践建议：",{"type":27,"tag":61,"props":1053,"children":1054},{},[1055,1060],{"type":27,"tag":65,"props":1056,"children":1057},{},[1058],{"type":32,"value":1059},"如果你依赖复杂 Node 能力（例如图像处理、原生模块），优先 Node/Serverless",{"type":27,"tag":65,"props":1061,"children":1062},{},[1063],{"type":32,"value":1064},"如果你追求极致延迟且逻辑简单，考虑 Edge",{"type":27,"tag":485,"props":1066,"children":1067},{},[],{"type":27,"tag":49,"props":1069,"children":1071},{"id":1070},"_8-性能调优nitro-侧你能做什么",[1072],{"type":32,"value":1073},"8. 性能调优：Nitro 侧你能做什么？",{"type":27,"tag":613,"props":1075,"children":1077},{"id":1076},"_81-减少阻塞-io",[1078],{"type":32,"value":1079},"8.1 减少阻塞 I/O",{"type":27,"tag":61,"props":1081,"children":1082},{},[1083,1088],{"type":27,"tag":65,"props":1084,"children":1085},{},[1086],{"type":32,"value":1087},"避免请求内做同步文件读写",{"type":27,"tag":65,"props":1089,"children":1090},{},[1091],{"type":32,"value":1092},"对“配置/规则”等可缓存数据做启动预热",{"type":27,"tag":613,"props":1094,"children":1096},{"id":1095},"_82-控制上游依赖",[1097],{"type":32,"value":1098},"8.2 控制上游依赖",{"type":27,"tag":61,"props":1100,"children":1101},{},[1102,1107],{"type":27,"tag":65,"props":1103,"children":1104},{},[1105],{"type":32,"value":1106},"给外部请求设超时（例如 2~3s）",{"type":27,"tag":65,"props":1108,"children":1109},{},[1110],{"type":32,"value":1111},"加重试要谨慎（避免雪崩）",{"type":27,"tag":613,"props":1113,"children":1115},{"id":1114},"_83-响应体积与压缩",[1116],{"type":32,"value":1117},"8.3 响应体积与压缩",{"type":27,"tag":61,"props":1119,"children":1120},{},[1121,1126],{"type":27,"tag":65,"props":1122,"children":1123},{},[1124],{"type":32,"value":1125},"JSON 输出控制字段",{"type":27,"tag":65,"props":1127,"children":1128},{},[1129],{"type":32,"value":1130},"开启 gzip/br",{"type":27,"tag":485,"props":1132,"children":1133},{},[],{"type":27,"tag":49,"props":1135,"children":1137},{"id":1136},"_9-可观测性没有观测就没有稳定",[1138],{"type":32,"value":1139},"9. 可观测性：没有观测就没有“稳定”",{"type":27,"tag":28,"props":1141,"children":1142},{},[1143],{"type":32,"value":1144},"建议 Nitro 侧最小可观测集合：",{"type":27,"tag":61,"props":1146,"children":1147},{},[1148,1153,1158,1163],{"type":27,"tag":65,"props":1149,"children":1150},{},[1151],{"type":32,"value":1152},"requestId/traceId",{"type":27,"tag":65,"props":1154,"children":1155},{},[1156],{"type":32,"value":1157},"关键路由耗时（p50/p95）",{"type":27,"tag":65,"props":1159,"children":1160},{},[1161],{"type":32,"value":1162},"错误率（按路由/按状态码）",{"type":27,"tag":65,"props":1164,"children":1165},{},[1166],{"type":32,"value":1167},"上游依赖耗时（DB/HTTP）",{"type":27,"tag":28,"props":1169,"children":1170},{},[1171],{"type":32,"value":1172},"落地方式：",{"type":27,"tag":61,"props":1174,"children":1175},{},[1176,1181],{"type":27,"tag":65,"props":1177,"children":1178},{},[1179],{"type":32,"value":1180},"在中间件注入 requestId",{"type":27,"tag":65,"props":1182,"children":1183},{},[1184],{"type":32,"value":1185},"在统一错误处理处记录结构化日志",{"type":27,"tag":485,"props":1187,"children":1188},{},[],{"type":27,"tag":49,"props":1190,"children":1192},{"id":1191},"_10-一个推荐的-nitro-工程结构",[1193],{"type":32,"value":1194},"10. 一个推荐的 Nitro 工程结构",{"type":27,"tag":28,"props":1196,"children":1197},{},[1198],{"type":32,"value":1199},"在 Nuxt 项目里，你可以这样组织服务端代码：",{"type":27,"tag":61,"props":1201,"children":1202},{},[1203,1214,1225,1236,1247],{"type":27,"tag":65,"props":1204,"children":1205},{},[1206,1212],{"type":27,"tag":422,"props":1207,"children":1209},{"className":1208},[],[1210],{"type":32,"value":1211},"server/middleware/",{"type":32,"value":1213},"：鉴权、日志、headers、rate limit",{"type":27,"tag":65,"props":1215,"children":1216},{},[1217,1223],{"type":27,"tag":422,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":32,"value":1222},"server/api/",{"type":32,"value":1224},"：业务 API（薄控制器）",{"type":27,"tag":65,"props":1226,"children":1227},{},[1228,1234],{"type":27,"tag":422,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":32,"value":1233},"server/services/",{"type":32,"value":1235},"：领域服务（可复用）",{"type":27,"tag":65,"props":1237,"children":1238},{},[1239,1245],{"type":27,"tag":422,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":32,"value":1244},"server/repositories/",{"type":32,"value":1246},"：数据访问层",{"type":27,"tag":65,"props":1248,"children":1249},{},[1250,1256],{"type":27,"tag":422,"props":1251,"children":1253},{"className":1252},[],[1254],{"type":32,"value":1255},"server/utils/",{"type":32,"value":1257},"：纯工具",{"type":27,"tag":28,"props":1259,"children":1260},{},[1261],{"type":32,"value":1262},"目标是：",{"type":27,"tag":61,"props":1264,"children":1265},{},[1266,1271,1276],{"type":27,"tag":65,"props":1267,"children":1268},{},[1269],{"type":32,"value":1270},"handler 只做协议适配",{"type":27,"tag":65,"props":1272,"children":1273},{},[1274],{"type":32,"value":1275},"业务逻辑可复用、可测试",{"type":27,"tag":65,"props":1277,"children":1278},{},[1279],{"type":32,"value":1280},"横切能力集中化",{"type":27,"tag":485,"props":1282,"children":1283},{},[],{"type":27,"tag":49,"props":1285,"children":1286},{"id":314},[1287],{"type":32,"value":314},{"type":27,"tag":28,"props":1289,"children":1290},{},[1291,1293,1298],{"type":32,"value":1292},"Nitro 的本质是：把 Nuxt 的服务端能力变成一个",{"type":27,"tag":43,"props":1294,"children":1295},{},[1296],{"type":32,"value":1297},"可编译、可移植、可观测",{"type":32,"value":1299},"的运行时系统。",{"type":27,"tag":28,"props":1301,"children":1302},{},[1303],{"type":32,"value":1304},"你一旦理解了它的生命周期与边界，就可以更有信心地在 Nuxt 里做：",{"type":27,"tag":61,"props":1306,"children":1307},{},[1308,1313,1318,1323],{"type":27,"tag":65,"props":1309,"children":1310},{},[1311],{"type":32,"value":1312},"性能友好的 API",{"type":27,"tag":65,"props":1314,"children":1315},{},[1316],{"type":32,"value":1317},"可控的缓存",{"type":27,"tag":65,"props":1319,"children":1320},{},[1321],{"type":32,"value":1322},"稳定的鉴权与错误处理",{"type":27,"tag":65,"props":1324,"children":1325},{},[1326],{"type":32,"value":1327},"面向多环境部署的工程架构",{"title":7,"searchDepth":359,"depth":359,"links":1329},[1330,1331,1332,1333,1341,1342,1343,1347,1352,1357,1358,1359],{"id":395,"depth":362,"text":379},{"id":490,"depth":362,"text":493},{"id":550,"depth":362,"text":553},{"id":592,"depth":362,"text":1334,"children":1335},"3. 路由系统：server/api 与 server/routes 的区别",[1336,1338,1340],{"id":615,"depth":359,"text":1337},"3.1 server/api/*",{"id":644,"depth":359,"text":1339},"3.2 server/routes/*",{"id":668,"depth":359,"text":671},{"id":700,"depth":362,"text":703},{"id":763,"depth":362,"text":766},{"id":838,"depth":362,"text":841,"children":1344},[1345,1346],{"id":867,"depth":359,"text":870},{"id":892,"depth":359,"text":895},{"id":940,"depth":362,"text":943,"children":1348},[1349,1350,1351],{"id":992,"depth":359,"text":995},{"id":1011,"depth":359,"text":1014},{"id":1030,"depth":359,"text":1033},{"id":1070,"depth":362,"text":1073,"children":1353},[1354,1355,1356],{"id":1076,"depth":359,"text":1079},{"id":1095,"depth":359,"text":1098},{"id":1114,"depth":359,"text":1117},{"id":1136,"depth":362,"text":1139},{"id":1191,"depth":362,"text":1194},{"id":314,"depth":362,"text":314},"content:topics:nuxt:nitro-engine-deep-dive.md","topics/nuxt/nitro-engine-deep-dive.md","topics/nuxt/nitro-engine-deep-dive",{"_path":1364,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":1365,"description":1366,"date":381,"topic":5,"author":11,"tags":1367,"image":1371,"featured":389,"readingTime":1372,"body":1373,"_type":370,"_id":2144,"_source":372,"_file":2145,"_stem":2146,"_extension":375},"/topics/nuxt/nuxt-rendering-modes-guide","Nuxt 渲染模式选择指南","从 SEO、性能、成本与一致性出发，系统对比 Nuxt 的 CSR/SSR/SSG/ISR（与预渲染）等模式，给出可执行的选型矩阵与落地架构建议。",[15,384,1368,1369,1370],"SSG","ISR","SEO","/images/topics/nuxt/rendering-modes.jpg",22,{"type":24,"children":1374,"toc":2127},[1375,1380,1385,1390,1418,1430,1433,1439,1444,1467,1472,1475,1481,1487,1492,1510,1515,1534,1540,1544,1557,1561,1574,1580,1584,1597,1601,1614,1620,1625,1638,1642,1655,1659,1672,1678,1682,1695,1699,1712,1715,1721,1726,1893,1896,1902,1907,1925,1930,1943,1946,1952,1957,1962,1985,1990,2008,2011,2017,2035,2038,2044,2097,2100,2104,2109],{"type":27,"tag":49,"props":1376,"children":1378},{"id":1377},"nuxt-渲染模式选择指南",[1379],{"type":32,"value":1365},{"type":27,"tag":28,"props":1381,"children":1382},{},[1383],{"type":32,"value":1384},"“到底要不要 SSR？”是 Nuxt 项目里最常见、也最容易吵起来的问题。",{"type":27,"tag":28,"props":1386,"children":1387},{},[1388],{"type":32,"value":1389},"原因是：渲染模式不是一个单点选择，它同时牵动：",{"type":27,"tag":61,"props":1391,"children":1392},{},[1393,1398,1403,1408,1413],{"type":27,"tag":65,"props":1394,"children":1395},{},[1396],{"type":32,"value":1397},"SEO（可索引内容是否直出）",{"type":27,"tag":65,"props":1399,"children":1400},{},[1401],{"type":32,"value":1402},"性能（TTFB/LCP/INP）",{"type":27,"tag":65,"props":1404,"children":1405},{},[1406],{"type":32,"value":1407},"成本（回源、算力、带宽）",{"type":27,"tag":65,"props":1409,"children":1410},{},[1411],{"type":32,"value":1412},"一致性（内容更新策略、缓存失效）",{"type":27,"tag":65,"props":1414,"children":1415},{},[1416],{"type":32,"value":1417},"工程复杂度（部署、观测、回滚）",{"type":27,"tag":28,"props":1419,"children":1420},{},[1421,1423,1428],{"type":32,"value":1422},"这篇文章给你一套",{"type":27,"tag":43,"props":1424,"children":1425},{},[1426],{"type":32,"value":1427},"可执行的选型方法",{"type":32,"value":1429},"：先定义目标，再选模式，最后给落地结构与检查清单。",{"type":27,"tag":485,"props":1431,"children":1432},{},[],{"type":27,"tag":49,"props":1434,"children":1436},{"id":1435},"_1-四个维度决定你的模式",[1437],{"type":32,"value":1438},"1. 四个维度，决定你的模式",{"type":27,"tag":28,"props":1440,"children":1441},{},[1442],{"type":32,"value":1443},"在做任何选择前，先回答四个问题：",{"type":27,"tag":251,"props":1445,"children":1446},{},[1447,1452,1457,1462],{"type":27,"tag":65,"props":1448,"children":1449},{},[1450],{"type":32,"value":1451},"页面是否需要 SEO？（搜索引擎是否必须看到正文）",{"type":27,"tag":65,"props":1453,"children":1454},{},[1455],{"type":32,"value":1456},"数据是否强一致？（用户态/支付/权限）",{"type":27,"tag":65,"props":1458,"children":1459},{},[1460],{"type":32,"value":1461},"更新频率如何？（发布频繁 vs 偶尔）",{"type":27,"tag":65,"props":1463,"children":1464},{},[1465],{"type":32,"value":1466},"流量模型是什么？（突发、平稳、长尾）",{"type":27,"tag":28,"props":1468,"children":1469},{},[1470],{"type":32,"value":1471},"这些问题比“SSR 快还是慢”更重要。",{"type":27,"tag":485,"props":1473,"children":1474},{},[],{"type":27,"tag":49,"props":1476,"children":1478},{"id":1477},"_2-主要模式概览csr-ssr-ssg-isr-预渲染",[1479],{"type":32,"value":1480},"2. 主要模式概览：CSR / SSR / SSG / ISR / 预渲染",{"type":27,"tag":613,"props":1482,"children":1484},{"id":1483},"_21-csr纯客户端渲染",[1485],{"type":32,"value":1486},"2.1 CSR（纯客户端渲染）",{"type":27,"tag":28,"props":1488,"children":1489},{},[1490],{"type":32,"value":1491},"特点：",{"type":27,"tag":61,"props":1493,"children":1494},{},[1495,1500,1505],{"type":27,"tag":65,"props":1496,"children":1497},{},[1498],{"type":32,"value":1499},"HTML 只有壳",{"type":27,"tag":65,"props":1501,"children":1502},{},[1503],{"type":32,"value":1504},"SEO 风险大（除非你不索引）",{"type":27,"tag":65,"props":1506,"children":1507},{},[1508],{"type":32,"value":1509},"首屏性能取决于 JS 与接口",{"type":27,"tag":28,"props":1511,"children":1512},{},[1513],{"type":32,"value":1514},"适用：",{"type":27,"tag":61,"props":1516,"children":1517},{},[1518,1523],{"type":27,"tag":65,"props":1519,"children":1520},{},[1521],{"type":32,"value":1522},"用户中心、后台、强交互工具",{"type":27,"tag":65,"props":1524,"children":1525},{},[1526,1528],{"type":32,"value":1527},"不需要索引或明确 ",{"type":27,"tag":422,"props":1529,"children":1531},{"className":1530},[],[1532],{"type":32,"value":1533},"noindex",{"type":27,"tag":613,"props":1535,"children":1537},{"id":1536},"_22-ssr服务端渲染",[1538],{"type":32,"value":1539},"2.2 SSR（服务端渲染）",{"type":27,"tag":28,"props":1541,"children":1542},{},[1543],{"type":32,"value":1491},{"type":27,"tag":61,"props":1545,"children":1546},{},[1547,1552],{"type":27,"tag":65,"props":1548,"children":1549},{},[1550],{"type":32,"value":1551},"首屏 HTML 直出，SEO 友好",{"type":27,"tag":65,"props":1553,"children":1554},{},[1555],{"type":32,"value":1556},"每次请求可能都需要回源（需要缓存）",{"type":27,"tag":28,"props":1558,"children":1559},{},[1560],{"type":32,"value":1514},{"type":27,"tag":61,"props":1562,"children":1563},{},[1564,1569],{"type":27,"tag":65,"props":1565,"children":1566},{},[1567],{"type":32,"value":1568},"内容需要 SEO，但数据强动态",{"type":27,"tag":65,"props":1570,"children":1571},{},[1572],{"type":32,"value":1573},"你有完善的缓存策略",{"type":27,"tag":613,"props":1575,"children":1577},{"id":1576},"_23-ssg静态生成",[1578],{"type":32,"value":1579},"2.3 SSG（静态生成）",{"type":27,"tag":28,"props":1581,"children":1582},{},[1583],{"type":32,"value":1491},{"type":27,"tag":61,"props":1585,"children":1586},{},[1587,1592],{"type":27,"tag":65,"props":1588,"children":1589},{},[1590],{"type":32,"value":1591},"性能与稳定性最好",{"type":27,"tag":65,"props":1593,"children":1594},{},[1595],{"type":32,"value":1596},"更新成本在“构建时”",{"type":27,"tag":28,"props":1598,"children":1599},{},[1600],{"type":32,"value":1514},{"type":27,"tag":61,"props":1602,"children":1603},{},[1604,1609],{"type":27,"tag":65,"props":1605,"children":1606},{},[1607],{"type":32,"value":1608},"内容站、文档站、营销页",{"type":27,"tag":65,"props":1610,"children":1611},{},[1612],{"type":32,"value":1613},"更新频率不高或可接受构建延迟",{"type":27,"tag":613,"props":1615,"children":1617},{"id":1616},"_24-isr增量静态再生按需生成",[1618],{"type":32,"value":1619},"2.4 ISR（增量静态再生/按需生成）",{"type":27,"tag":28,"props":1621,"children":1622},{},[1623],{"type":32,"value":1624},"在 Nuxt 体系里，ISR 的表达可能来自：",{"type":27,"tag":61,"props":1626,"children":1627},{},[1628,1633],{"type":27,"tag":65,"props":1629,"children":1630},{},[1631],{"type":32,"value":1632},"生成策略 + 缓存策略",{"type":27,"tag":65,"props":1634,"children":1635},{},[1636],{"type":32,"value":1637},"或配合边缘缓存与按需失效",{"type":27,"tag":28,"props":1639,"children":1640},{},[1641],{"type":32,"value":1491},{"type":27,"tag":61,"props":1643,"children":1644},{},[1645,1650],{"type":27,"tag":65,"props":1646,"children":1647},{},[1648],{"type":32,"value":1649},"静态化收益 + 可控更新",{"type":27,"tag":65,"props":1651,"children":1652},{},[1653],{"type":32,"value":1654},"需要你设计“失效与再生成”",{"type":27,"tag":28,"props":1656,"children":1657},{},[1658],{"type":32,"value":1514},{"type":27,"tag":61,"props":1660,"children":1661},{},[1662,1667],{"type":27,"tag":65,"props":1663,"children":1664},{},[1665],{"type":32,"value":1666},"内容更新频繁，但仍要 SEO",{"type":27,"tag":65,"props":1668,"children":1669},{},[1670],{"type":32,"value":1671},"你希望在高峰也保持稳定",{"type":27,"tag":613,"props":1673,"children":1675},{"id":1674},"_25-预渲染prerender",[1676],{"type":32,"value":1677},"2.5 预渲染（prerender）",{"type":27,"tag":28,"props":1679,"children":1680},{},[1681],{"type":32,"value":1491},{"type":27,"tag":61,"props":1683,"children":1684},{},[1685,1690],{"type":27,"tag":65,"props":1686,"children":1687},{},[1688],{"type":32,"value":1689},"对部分路由预先生成 HTML",{"type":27,"tag":65,"props":1691,"children":1692},{},[1693],{"type":32,"value":1694},"适合混合站点",{"type":27,"tag":28,"props":1696,"children":1697},{},[1698],{"type":32,"value":1514},{"type":27,"tag":61,"props":1700,"children":1701},{},[1702,1707],{"type":27,"tag":65,"props":1703,"children":1704},{},[1705],{"type":32,"value":1706},"首页/核心落地页需要 SEO",{"type":27,"tag":65,"props":1708,"children":1709},{},[1710],{"type":32,"value":1711},"工具页/用户页不需要 SEO",{"type":27,"tag":485,"props":1713,"children":1714},{},[],{"type":27,"tag":49,"props":1716,"children":1718},{"id":1717},"_3-选型矩阵可直接用",[1719],{"type":32,"value":1720},"3. 选型矩阵（可直接用）",{"type":27,"tag":28,"props":1722,"children":1723},{},[1724],{"type":32,"value":1725},"你可以按路由维度做选型，而不是全站一刀切。",{"type":27,"tag":1727,"props":1728,"children":1729},"table",{},[1730,1758],{"type":27,"tag":1731,"props":1732,"children":1733},"thead",{},[1734],{"type":27,"tag":1735,"props":1736,"children":1737},"tr",{},[1738,1744,1748,1753],{"type":27,"tag":1739,"props":1740,"children":1741},"th",{},[1742],{"type":32,"value":1743},"页面类型",{"type":27,"tag":1739,"props":1745,"children":1746},{},[1747],{"type":32,"value":1370},{"type":27,"tag":1739,"props":1749,"children":1750},{},[1751],{"type":32,"value":1752},"更新频率",{"type":27,"tag":1739,"props":1754,"children":1755},{},[1756],{"type":32,"value":1757},"推荐",{"type":27,"tag":1759,"props":1760,"children":1761},"tbody",{},[1762,1786,1807,1828,1849,1871],{"type":27,"tag":1735,"props":1763,"children":1764},{},[1765,1771,1776,1781],{"type":27,"tag":1766,"props":1767,"children":1768},"td",{},[1769],{"type":32,"value":1770},"文章详情",{"type":27,"tag":1766,"props":1772,"children":1773},{},[1774],{"type":32,"value":1775},"高",{"type":27,"tag":1766,"props":1777,"children":1778},{},[1779],{"type":32,"value":1780},"中",{"type":27,"tag":1766,"props":1782,"children":1783},{},[1784],{"type":32,"value":1785},"SSG/ISR",{"type":27,"tag":1735,"props":1787,"children":1788},{},[1789,1794,1798,1802],{"type":27,"tag":1766,"props":1790,"children":1791},{},[1792],{"type":32,"value":1793},"文章列表",{"type":27,"tag":1766,"props":1795,"children":1796},{},[1797],{"type":32,"value":1775},{"type":27,"tag":1766,"props":1799,"children":1800},{},[1801],{"type":32,"value":1780},{"type":27,"tag":1766,"props":1803,"children":1804},{},[1805],{"type":32,"value":1806},"SSG/ISR（注意聚合页）",{"type":27,"tag":1735,"props":1808,"children":1809},{},[1810,1815,1819,1823],{"type":27,"tag":1766,"props":1811,"children":1812},{},[1813],{"type":32,"value":1814},"产品详情",{"type":27,"tag":1766,"props":1816,"children":1817},{},[1818],{"type":32,"value":1775},{"type":27,"tag":1766,"props":1820,"children":1821},{},[1822],{"type":32,"value":1775},{"type":27,"tag":1766,"props":1824,"children":1825},{},[1826],{"type":32,"value":1827},"ISR/SSR（配缓存）",{"type":27,"tag":1735,"props":1829,"children":1830},{},[1831,1836,1840,1844],{"type":27,"tag":1766,"props":1832,"children":1833},{},[1834],{"type":32,"value":1835},"搜索结果",{"type":27,"tag":1766,"props":1837,"children":1838},{},[1839],{"type":32,"value":1780},{"type":27,"tag":1766,"props":1841,"children":1842},{},[1843],{"type":32,"value":1775},{"type":27,"tag":1766,"props":1845,"children":1846},{},[1847],{"type":32,"value":1848},"SSR/CSR（配 noindex）",{"type":27,"tag":1735,"props":1850,"children":1851},{},[1852,1857,1862,1866],{"type":27,"tag":1766,"props":1853,"children":1854},{},[1855],{"type":32,"value":1856},"用户中心",{"type":27,"tag":1766,"props":1858,"children":1859},{},[1860],{"type":32,"value":1861},"低",{"type":27,"tag":1766,"props":1863,"children":1864},{},[1865],{"type":32,"value":1775},{"type":27,"tag":1766,"props":1867,"children":1868},{},[1869],{"type":32,"value":1870},"CSR",{"type":27,"tag":1735,"props":1872,"children":1873},{},[1874,1879,1884,1888],{"type":27,"tag":1766,"props":1875,"children":1876},{},[1877],{"type":32,"value":1878},"工具页",{"type":27,"tag":1766,"props":1880,"children":1881},{},[1882],{"type":32,"value":1883},"低/中",{"type":27,"tag":1766,"props":1885,"children":1886},{},[1887],{"type":32,"value":1780},{"type":27,"tag":1766,"props":1889,"children":1890},{},[1891],{"type":32,"value":1892},"CSR + 预渲染核心路由",{"type":27,"tag":485,"props":1894,"children":1895},{},[],{"type":27,"tag":49,"props":1897,"children":1899},{"id":1898},"_4-混合渲染真正的生产最优解",[1900],{"type":32,"value":1901},"4. 混合渲染：真正的生产最优解",{"type":27,"tag":28,"props":1903,"children":1904},{},[1905],{"type":32,"value":1906},"生产上最常见的模式是混合：",{"type":27,"tag":61,"props":1908,"children":1909},{},[1910,1915,1920],{"type":27,"tag":65,"props":1911,"children":1912},{},[1913],{"type":32,"value":1914},"公共内容：静态化（SSG/ISR）+ CDN",{"type":27,"tag":65,"props":1916,"children":1917},{},[1918],{"type":32,"value":1919},"用户态内容：CSR 或 SSR（private/no-store）",{"type":27,"tag":65,"props":1921,"children":1922},{},[1923],{"type":32,"value":1924},"关键落地页：预渲染",{"type":27,"tag":28,"props":1926,"children":1927},{},[1928],{"type":32,"value":1929},"好处：",{"type":27,"tag":61,"props":1931,"children":1932},{},[1933,1938],{"type":27,"tag":65,"props":1934,"children":1935},{},[1936],{"type":32,"value":1937},"SEO 与性能兼得",{"type":27,"tag":65,"props":1939,"children":1940},{},[1941],{"type":32,"value":1942},"成本可控",{"type":27,"tag":485,"props":1944,"children":1945},{},[],{"type":27,"tag":49,"props":1947,"children":1949},{"id":1948},"_5-缓存与失效模式落地的关键",[1950],{"type":32,"value":1951},"5. 缓存与失效：模式落地的关键",{"type":27,"tag":28,"props":1953,"children":1954},{},[1955],{"type":32,"value":1956},"无论你选 SSR 还是 ISR，本质都离不开缓存。",{"type":27,"tag":28,"props":1958,"children":1959},{},[1960],{"type":32,"value":1961},"建议把缓存分层：",{"type":27,"tag":61,"props":1963,"children":1964},{},[1965,1970,1975,1980],{"type":27,"tag":65,"props":1966,"children":1967},{},[1968],{"type":32,"value":1969},"浏览器",{"type":27,"tag":65,"props":1971,"children":1972},{},[1973],{"type":32,"value":1974},"CDN",{"type":27,"tag":65,"props":1976,"children":1977},{},[1978],{"type":32,"value":1979},"应用侧（server runtime）",{"type":27,"tag":65,"props":1981,"children":1982},{},[1983],{"type":32,"value":1984},"数据侧（Redis/DB）",{"type":27,"tag":28,"props":1986,"children":1987},{},[1988],{"type":32,"value":1989},"并给每条路由明确：",{"type":27,"tag":61,"props":1991,"children":1992},{},[1993,1998,2003],{"type":27,"tag":65,"props":1994,"children":1995},{},[1996],{"type":32,"value":1997},"是否 public/private",{"type":27,"tag":65,"props":1999,"children":2000},{},[2001],{"type":32,"value":2002},"TTL 多久",{"type":27,"tag":65,"props":2004,"children":2005},{},[2006],{"type":32,"value":2007},"写操作后如何失效",{"type":27,"tag":485,"props":2009,"children":2010},{},[],{"type":27,"tag":49,"props":2012,"children":2014},{"id":2013},"_6-常见误区",[2015],{"type":32,"value":2016},"6. 常见误区",{"type":27,"tag":61,"props":2018,"children":2019},{},[2020,2025,2030],{"type":27,"tag":65,"props":2021,"children":2022},{},[2023],{"type":32,"value":2024},"“SSR 一定更快”：不一定，TTFB 可能更慢；LCP 受资源与主线程影响更大",{"type":27,"tag":65,"props":2026,"children":2027},{},[2028],{"type":32,"value":2029},"“SSG 一定更好”：构建成本与发布延迟可能无法接受",{"type":27,"tag":65,"props":2031,"children":2032},{},[2033],{"type":32,"value":2034},"“全站一个模式最省事”：短期省事，长期很难优化与扩展",{"type":27,"tag":485,"props":2036,"children":2037},{},[],{"type":27,"tag":49,"props":2039,"children":2041},{"id":2040},"_7-上线检查清单",[2042],{"type":32,"value":2043},"7. 上线检查清单",{"type":27,"tag":61,"props":2045,"children":2048},{"className":2046},[2047],"contains-task-list",[2049,2061,2070,2079,2088],{"type":27,"tag":65,"props":2050,"children":2053},{"className":2051},[2052],"task-list-item",[2054,2059],{"type":27,"tag":2055,"props":2056,"children":2058},"input",{"disabled":389,"type":2057},"checkbox",[],{"type":32,"value":2060}," 按路由明确 SEO 需求（哪些可索引）",{"type":27,"tag":65,"props":2062,"children":2064},{"className":2063},[2052],[2065,2068],{"type":27,"tag":2055,"props":2066,"children":2067},{"disabled":389,"type":2057},[],{"type":32,"value":2069}," 用户态页面是否 private/no-store",{"type":27,"tag":65,"props":2071,"children":2073},{"className":2072},[2052],[2074,2077],{"type":27,"tag":2055,"props":2075,"children":2076},{"disabled":389,"type":2057},[],{"type":32,"value":2078}," 公共内容是否走 CDN 并有合理 TTL",{"type":27,"tag":65,"props":2080,"children":2082},{"className":2081},[2052],[2083,2086],{"type":27,"tag":2055,"props":2084,"children":2085},{"disabled":389,"type":2057},[],{"type":32,"value":2087}," 更新路径是否有失效机制（发布事件）",{"type":27,"tag":65,"props":2089,"children":2091},{"className":2090},[2052],[2092,2095],{"type":27,"tag":2055,"props":2093,"children":2094},{"disabled":389,"type":2057},[],{"type":32,"value":2096}," 是否有 RUM/日志来验证效果",{"type":27,"tag":485,"props":2098,"children":2099},{},[],{"type":27,"tag":49,"props":2101,"children":2102},{"id":314},[2103],{"type":32,"value":314},{"type":27,"tag":28,"props":2105,"children":2106},{},[2107],{"type":32,"value":2108},"Nuxt 渲染模式选型的正确做法是：",{"type":27,"tag":61,"props":2110,"children":2111},{},[2112,2117,2122],{"type":27,"tag":65,"props":2113,"children":2114},{},[2115],{"type":32,"value":2116},"以“页面类型”而不是“站点整体”做选择",{"type":27,"tag":65,"props":2118,"children":2119},{},[2120],{"type":32,"value":2121},"把缓存与失效当成一等公民",{"type":27,"tag":65,"props":2123,"children":2124},{},[2125],{"type":32,"value":2126},"用观测验证，而不是凭感觉",{"title":7,"searchDepth":359,"depth":359,"links":2128},[2129,2130,2131,2138,2139,2140,2141,2142,2143],{"id":1377,"depth":362,"text":1365},{"id":1435,"depth":362,"text":1438},{"id":1477,"depth":362,"text":1480,"children":2132},[2133,2134,2135,2136,2137],{"id":1483,"depth":359,"text":1486},{"id":1536,"depth":359,"text":1539},{"id":1576,"depth":359,"text":1579},{"id":1616,"depth":359,"text":1619},{"id":1674,"depth":359,"text":1677},{"id":1717,"depth":362,"text":1720},{"id":1898,"depth":362,"text":1901},{"id":1948,"depth":362,"text":1951},{"id":2013,"depth":362,"text":2016},{"id":2040,"depth":362,"text":2043},{"id":314,"depth":362,"text":314},"content:topics:nuxt:nuxt-rendering-modes-guide.md","topics/nuxt/nuxt-rendering-modes-guide.md","topics/nuxt/nuxt-rendering-modes-guide",{"_path":2148,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2149,"description":2150,"date":2151,"topic":5,"author":11,"tags":2152,"image":2157,"featured":389,"readingTime":2158,"body":2159,"_type":370,"_id":2685,"_source":372,"_file":2686,"_stem":2687,"_extension":375},"/topics/nuxt/nuxt4-major-updates-overview","Nuxt 4 重大更新全面解读：架构升级与开发体验革新","深入解析 Nuxt 4 的重大更新，包括新目录结构、Nitro 2.0 引擎、兼容性层变化、性能优化等核心改进，帮助开发者全面了解新版本特性并做好升级准备。","2026-01-18",[2153,2154,384,2155,2156],"Nuxt 4","Vue","全栈框架","版本升级","/images/topics/nuxt/nuxt4-features-overview.jpg",16,{"type":24,"children":2160,"toc":2646},[2161,2167,2173,2178,2183,2189,2195,2200,2209,2217,2225,2231,2236,2247,2253,2262,2268,2274,2279,2288,2294,2303,2309,2318,2324,2330,2339,2345,2354,2360,2369,2375,2381,2390,2396,2405,2411,2422,2431,2437,2443,2452,2458,2467,2473,2482,2488,2494,2503,2509,2518,2524,2530,2540,2546,2555,2561,2566,2571,2576,2594,2597,2602],{"type":27,"tag":49,"props":2162,"children":2164},{"id":2163},"nuxt-4-重大更新全面解读",[2165],{"type":32,"value":2166},"Nuxt 4 重大更新全面解读",{"type":27,"tag":49,"props":2168,"children":2170},{"id":2169},"引言nuxt-的又一次进化",[2171],{"type":32,"value":2172},"引言：Nuxt 的又一次进化",{"type":27,"tag":28,"props":2174,"children":2175},{},[2176],{"type":32,"value":2177},"Nuxt 4 的发布标志着这个 Vue 生态中最受欢迎的全栈框架又迈入了新阶段。从 Nuxt 2 到 Nuxt 3 是一次彻底重写，而 Nuxt 3 到 Nuxt 4 则是在成熟架构上的精进打磨——更清晰的目录结构、更强大的引擎、更好的开发体验。",{"type":27,"tag":28,"props":2179,"children":2180},{},[2181],{"type":32,"value":2182},"这篇文章将全面解读 Nuxt 4 的核心变化，帮助你理解这些改动背后的设计理念，以及它们将如何影响你的日常开发。",{"type":27,"tag":49,"props":2184,"children":2186},{"id":2185},"第一部分新目录结构",[2187],{"type":32,"value":2188},"第一部分：新目录结构",{"type":27,"tag":613,"props":2190,"children":2192},{"id":2191},"_11-从扁平到分层",[2193],{"type":32,"value":2194},"1.1 从扁平到分层",{"type":27,"tag":28,"props":2196,"children":2197},{},[2198],{"type":32,"value":2199},"Nuxt 4 引入了新的目录结构，将应用代码与配置分离：",{"type":27,"tag":2201,"props":2202,"children":2204},"pre",{"code":2203},"# Nuxt 3 目录结构\nproject/\n├── .nuxt/\n├── app.vue\n├── components/\n├── composables/\n├── layouts/\n├── middleware/\n├── pages/\n├── plugins/\n├── public/\n├── server/\n├── nuxt.config.ts\n└── package.json\n\n# Nuxt 4 新目录结构\nproject/\n├── .nuxt/\n├── app/                  # 应用代码集中在 app/ 目录\n│   ├── app.vue\n│   ├── components/\n│   ├── composables/\n│   ├── layouts/\n│   ├── middleware/\n│   ├── pages/\n│   └── plugins/\n├── public/\n├── server/\n├── nuxt.config.ts\n└── package.json\n",[2205],{"type":27,"tag":422,"props":2206,"children":2207},{"__ignoreMap":7},[2208],{"type":32,"value":2203},{"type":27,"tag":28,"props":2210,"children":2211},{},[2212],{"type":27,"tag":43,"props":2213,"children":2214},{},[2215],{"type":32,"value":2216},"为什么这样设计？",{"type":27,"tag":2201,"props":2218,"children":2220},{"code":2219},"┌────────────────────────────────────────────────────────────┐\n│              新目录结构的设计理念                            │\n├────────────────────────────────────────────────────────────┤\n│                                                            │\n│  1. 关注点分离                                             │\n│     ├── app/ - 客户端/同构代码                             │\n│     ├── server/ - 服务端代码                               │\n│     └── 根目录 - 配置和公共资源                             │\n│                                                            │\n│  2. 更清晰的项目边界                                       │\n│     ├── Monorepo 友好                                      │\n│     ├── 多应用项目更清晰                                   │\n│     └── 与其他框架惯例对齐                                 │\n│                                                            │\n│  3. 未来扩展性                                             │\n│     ├── 为多前端支持做准备                                 │\n│     └── 便于工具链识别和处理                               │\n│                                                            │\n└────────────────────────────────────────────────────────────┘\n",[2221],{"type":27,"tag":422,"props":2222,"children":2223},{"__ignoreMap":7},[2224],{"type":32,"value":2219},{"type":27,"tag":613,"props":2226,"children":2228},{"id":2227},"_12-向后兼容",[2229],{"type":32,"value":2230},"1.2 向后兼容",{"type":27,"tag":28,"props":2232,"children":2233},{},[2234],{"type":32,"value":2235},"Nuxt 4 提供了兼容性选项，允许继续使用旧目录结构：",{"type":27,"tag":2201,"props":2237,"children":2242},{"code":2238,"language":2239,"meta":7,"className":2240},"// nuxt.config.ts\nexport default defineNuxtConfig({\n  future: {\n    compatibilityVersion: 4  // 启用 Nuxt 4 特性\n  },\n  \n  // 如果需要继续使用旧目录结构\n  srcDir: './',  // 而不是 'app/'\n  \n  // 或者自定义目录\n  dir: {\n    app: 'src',\n    pages: 'src/pages',\n    layouts: 'src/layouts'\n  }\n});\n","typescript",[2241],"language-typescript",[2243],{"type":27,"tag":422,"props":2244,"children":2245},{"__ignoreMap":7},[2246],{"type":32,"value":2238},{"type":27,"tag":613,"props":2248,"children":2250},{"id":2249},"_13-appconfigts-变化",[2251],{"type":32,"value":2252},"1.3 app.config.ts 变化",{"type":27,"tag":2201,"props":2254,"children":2257},{"code":2255,"language":2239,"meta":7,"className":2256},"// Nuxt 3: app.config.ts 在项目根目录\n// Nuxt 4: app.config.ts 移入 app/ 目录\n\n// app/app.config.ts\nexport default defineAppConfig({\n  ui: {\n    primary: 'green',\n    gray: 'slate'\n  },\n  \n  // 类型安全的应用配置\n  meta: {\n    name: 'My App',\n    description: 'A Nuxt 4 Application'\n  }\n});\n\n// 使用方式不变\nconst appConfig = useAppConfig();\nconsole.log(appConfig.ui.primary);  // 'green'\n",[2241],[2258],{"type":27,"tag":422,"props":2259,"children":2260},{"__ignoreMap":7},[2261],{"type":32,"value":2255},{"type":27,"tag":49,"props":2263,"children":2265},{"id":2264},"第二部分nitro-20-引擎升级",[2266],{"type":32,"value":2267},"第二部分：Nitro 2.0 引擎升级",{"type":27,"tag":613,"props":2269,"children":2271},{"id":2270},"_21-性能提升",[2272],{"type":32,"value":2273},"2.1 性能提升",{"type":27,"tag":28,"props":2275,"children":2276},{},[2277],{"type":32,"value":2278},"Nitro 2.0 带来了显著的性能改进：",{"type":27,"tag":2201,"props":2280,"children":2283},{"code":2281,"language":2239,"meta":7,"className":2282},"// 冷启动时间优化\n// Nitro 1.x: ~150ms\n// Nitro 2.0: ~80ms (约 47% 提升)\n\n// 内存占用优化\n// 同样的应用，内存占用减少约 20%\n\n// 原因：\n// - 更高效的模块加载\n// - 优化的树摇（tree-shaking）\n// - 减少运行时开销\n",[2241],[2284],{"type":27,"tag":422,"props":2285,"children":2286},{"__ignoreMap":7},[2287],{"type":32,"value":2281},{"type":27,"tag":613,"props":2289,"children":2291},{"id":2290},"_22-新的路由系统",[2292],{"type":32,"value":2293},"2.2 新的路由系统",{"type":27,"tag":2201,"props":2295,"children":2298},{"code":2296,"language":2239,"meta":7,"className":2297},"// server/routes/api/[...slug].ts\n\n// Nitro 2.0 新的路由定义方式\nexport default defineEventHandler({\n  // 路由级别配置\n  config: {\n    // 缓存配置\n    cache: {\n      maxAge: 60,\n      staleMaxAge: 3600,\n      swr: true\n    },\n    \n    // CORS 配置\n    cors: {\n      origin: ['https://example.com'],\n      methods: ['GET', 'POST']\n    }\n  },\n  \n  // 处理函数\n  handler: async (event) => {\n    const slug = event.context.params?.slug;\n    return { data: await fetchData(slug) };\n  }\n});\n\n// 支持中间件链\nexport default defineEventHandler({\n  onRequest: [authMiddleware, rateLimitMiddleware],\n  onBeforeResponse: [logMiddleware],\n  \n  handler: (event) => {\n    return { message: 'Hello' };\n  }\n});\n",[2241],[2299],{"type":27,"tag":422,"props":2300,"children":2301},{"__ignoreMap":7},[2302],{"type":32,"value":2296},{"type":27,"tag":613,"props":2304,"children":2306},{"id":2305},"_23-增强的数据获取",[2307],{"type":32,"value":2308},"2.3 增强的数据获取",{"type":27,"tag":2201,"props":2310,"children":2313},{"code":2311,"language":2239,"meta":7,"className":2312},"// Nitro 2.0 改进的 $fetch\n\n// 自动请求去重\nconst [user, posts] = await Promise.all([\n  $fetch('/api/user/1'),\n  $fetch('/api/user/1')  // 相同请求自动去重\n]);\n\n// 请求拦截器\nexport default defineNuxtPlugin(() => {\n  const { $fetch } = useNuxtApp();\n  \n  // 全局请求配置\n  globalThis.$fetch = $fetch.create({\n    onRequest({ request, options }) {\n      options.headers = {\n        ...options.headers,\n        Authorization: `Bearer ${getToken()}`\n      };\n    },\n    \n    onResponseError({ response }) {\n      if (response.status === 401) {\n        navigateTo('/login');\n      }\n    }\n  });\n});\n",[2241],[2314],{"type":27,"tag":422,"props":2315,"children":2316},{"__ignoreMap":7},[2317],{"type":32,"value":2311},{"type":27,"tag":49,"props":2319,"children":2321},{"id":2320},"第三部分兼容性层变化",[2322],{"type":32,"value":2323},"第三部分：兼容性层变化",{"type":27,"tag":613,"props":2325,"children":2327},{"id":2326},"_31-移除的废弃-api",[2328],{"type":32,"value":2329},"3.1 移除的废弃 API",{"type":27,"tag":2201,"props":2331,"children":2334},{"code":2332,"language":2239,"meta":7,"className":2333},"// Nuxt 4 移除了 Nuxt 3 中标记为废弃的 API\n\n// ❌ 已移除\nimport { defineNuxtRouteMiddleware } from '#app'\n\n// ✅ 使用新的 API\nimport { defineNuxtRouteMiddleware } from 'nuxt/app'\n\n// ❌ 已移除\nconst nuxtApp = useNuxtApp()\nnuxtApp.$router  // 不再有 $ 前缀\n\n// ✅ 使用 composables\nconst router = useRouter()\n\n// ❌ 已移除\nuseAsyncData('key', () => fetch(), { lazy: true })\n\n// ✅ 使用 useLazyAsyncData\nuseLazyAsyncData('key', () => fetch())\n",[2241],[2335],{"type":27,"tag":422,"props":2336,"children":2337},{"__ignoreMap":7},[2338],{"type":32,"value":2332},{"type":27,"tag":613,"props":2340,"children":2342},{"id":2341},"_32-类型系统改进",[2343],{"type":32,"value":2344},"3.2 类型系统改进",{"type":27,"tag":2201,"props":2346,"children":2349},{"code":2347,"language":2239,"meta":7,"className":2348},"// Nuxt 4 增强的类型推导\n\n// 页面元数据类型\n// pages/dashboard.vue\n\u003Cscript setup lang=\"ts\">\ndefinePageMeta({\n  // 类型自动推导，IDE 自动补全\n  layout: 'admin',  // 只能填已定义的布局\n  middleware: ['auth'],  // 只能填已定义的中间件\n  \n  // 自定义元数据\n  title: '仪表盘',\n  requiresAuth: true\n});\n\u003C/script>\n\n// 路由参数类型\n// pages/users/[id].vue\n\u003Cscript setup lang=\"ts\">\nconst route = useRoute('users-id');\n//             ^? RouteLocationNormalized\u003C'users-id'>\n\nroute.params.id  // 类型: string\n\u003C/script>\n\n// 运行时配置类型\n// nuxt.config.ts\nexport default defineNuxtConfig({\n  runtimeConfig: {\n    // 私有配置（仅服务端）\n    apiSecret: '',\n    \n    // 公开配置\n    public: {\n      apiBase: ''\n    }\n  }\n});\n\n// 使用时自动推导类型\nconst config = useRuntimeConfig();\nconfig.apiSecret;  // 服务端可用\nconfig.public.apiBase;  // 客户端可用\n",[2241],[2350],{"type":27,"tag":422,"props":2351,"children":2352},{"__ignoreMap":7},[2353],{"type":32,"value":2347},{"type":27,"tag":613,"props":2355,"children":2357},{"id":2356},"_33-useasyncdata-改进",[2358],{"type":32,"value":2359},"3.3 useAsyncData 改进",{"type":27,"tag":2201,"props":2361,"children":2364},{"code":2362,"language":2239,"meta":7,"className":2363},"// Nuxt 4 中 useAsyncData 的改进\n\n// 改进 1：更好的错误处理\nconst { data, error, status } = await useAsyncData('users', () => $fetch('/api/users'));\n\n// status 新增更多状态\n// 'idle' | 'pending' | 'success' | 'error'\n\n// 改进 2：简化的刷新机制\nconst { refresh, clear } = await useAsyncData('users', () => $fetch('/api/users'));\n\n// 带参数刷新\nawait refresh({ dedupe: true });\n\n// 清除缓存\nclear();\n\n// 改进 3：深度响应式默认关闭\nconst { data } = await useAsyncData('config', () => $fetch('/api/config'), {\n  deep: false  // 默认 false，提升性能\n});\n\n// 需要深度响应式时显式开启\nconst { data } = await useAsyncData('form', () => $fetch('/api/form'), {\n  deep: true\n});\n",[2241],[2365],{"type":27,"tag":422,"props":2366,"children":2367},{"__ignoreMap":7},[2368],{"type":32,"value":2362},{"type":27,"tag":49,"props":2370,"children":2372},{"id":2371},"第四部分开发体验改进",[2373],{"type":32,"value":2374},"第四部分：开发体验改进",{"type":27,"tag":613,"props":2376,"children":2378},{"id":2377},"_41-nuxt-devtools-增强",[2379],{"type":32,"value":2380},"4.1 Nuxt DevTools 增强",{"type":27,"tag":2201,"props":2382,"children":2385},{"code":2383,"language":2239,"meta":7,"className":2384},"// Nuxt 4 内置增强版 DevTools\n\n// 新功能：\n// 1. 组件性能分析\n// - 渲染时间追踪\n// - 不必要渲染检测\n// - 内存使用监控\n\n// 2. 数据流可视化\n// - useAsyncData 调用时序图\n// - 数据缓存状态\n// - 请求去重可视化\n\n// 3. 路由调试\n// - 路由匹配过程\n// - 中间件执行顺序\n// - 导航守卫状态\n\n// 启用高级功能\nexport default defineNuxtConfig({\n  devtools: {\n    enabled: true,\n    \n    // 新选项\n    timeline: {\n      enabled: true  // 启用时间线\n    }\n  }\n});\n",[2241],[2386],{"type":27,"tag":422,"props":2387,"children":2388},{"__ignoreMap":7},[2389],{"type":32,"value":2383},{"type":27,"tag":613,"props":2391,"children":2393},{"id":2392},"_42-热更新优化",[2394],{"type":32,"value":2395},"4.2 热更新优化",{"type":27,"tag":2201,"props":2397,"children":2400},{"code":2398,"language":2239,"meta":7,"className":2399},"// Nuxt 4 大幅改进了热更新体验\n\n// 1. 更快的 HMR\n// - 组件变更：\u003C 100ms\n// - 页面变更：\u003C 200ms\n// - 配置变更：\u003C 1s\n\n// 2. 保持状态的更新\n// composables 更新不再丢失组件状态\nconst count = ref(0);  // 更新文件后，值保持\n\n// 3. 错误恢复\n// 修复语法错误后自动恢复，无需重启\n",[2241],[2401],{"type":27,"tag":422,"props":2402,"children":2403},{"__ignoreMap":7},[2404],{"type":32,"value":2398},{"type":27,"tag":613,"props":2406,"children":2408},{"id":2407},"_43-错误处理增强",[2409],{"type":32,"value":2410},"4.3 错误处理增强",{"type":27,"tag":2201,"props":2412,"children":2417},{"code":2413,"language":2414,"meta":7,"className":2415},"\u003C!-- app/error.vue - 增强的错误页面 -->\n\u003Ctemplate>\n  \u003Cdiv class=\"error-page\">\n    \u003Ch1>{{ error.statusCode }}\u003C/h1>\n    \u003Cp>{{ error.message }}\u003C/p>\n    \n    \u003C!-- Nuxt 4 新增：错误堆栈（开发环境） -->\n    \u003Cpre v-if=\"isDev && error.stack\">{{ error.stack }}\u003C/pre>\n    \n    \u003C!-- 新增：错误上下文 -->\n    \u003Cdetails v-if=\"error.data\">\n      \u003Csummary>详细信息\u003C/summary>\n      \u003Cpre>{{ error.data }}\u003C/pre>\n    \u003C/details>\n    \n    \u003Cbutton @click=\"handleError\">重试\u003C/button>\n  \u003C/div>\n\u003C/template>\n\n\u003Cscript setup lang=\"ts\">\nconst props = defineProps\u003C{\n  error: {\n    statusCode: number\n    message: string\n    stack?: string\n    data?: Record\u003Cstring, unknown>\n  }\n}>();\n\nconst isDev = process.dev;\n\nfunction handleError() {\n  clearError({ redirect: '/' });\n}\n\u003C/script>\n","vue",[2416],"language-vue",[2418],{"type":27,"tag":422,"props":2419,"children":2420},{"__ignoreMap":7},[2421],{"type":32,"value":2413},{"type":27,"tag":2201,"props":2423,"children":2426},{"code":2424,"language":2239,"meta":7,"className":2425},"// server/api/users.ts - 增强的服务端错误\n\nexport default defineEventHandler((event) => {\n  const id = getRouterParam(event, 'id');\n  \n  if (!id) {\n    throw createError({\n      statusCode: 400,\n      message: '缺少用户 ID',\n      \n      // Nuxt 4 新增：结构化错误数据\n      data: {\n        field: 'id',\n        constraint: 'required'\n      }\n    });\n  }\n  \n  // 业务错误\n  throw createError({\n    statusCode: 404,\n    message: '用户不存在',\n    data: {\n      userId: id,\n      suggestion: '请检查用户 ID 是否正确'\n    }\n  });\n});\n",[2241],[2427],{"type":27,"tag":422,"props":2428,"children":2429},{"__ignoreMap":7},[2430],{"type":32,"value":2424},{"type":27,"tag":49,"props":2432,"children":2434},{"id":2433},"第五部分性能优化特性",[2435],{"type":32,"value":2436},"第五部分：性能优化特性",{"type":27,"tag":613,"props":2438,"children":2440},{"id":2439},"_51-更智能的代码分割",[2441],{"type":32,"value":2442},"5.1 更智能的代码分割",{"type":27,"tag":2201,"props":2444,"children":2447},{"code":2445,"language":2239,"meta":7,"className":2446},"// Nuxt 4 的自动代码分割更加智能\n\n// 自动路由分割\n// pages/dashboard/\n//   index.vue      -> chunks/dashboard.js\n//   settings.vue   -> chunks/dashboard-settings.js\n//   analytics.vue  -> chunks/dashboard-analytics.js\n\n// 组件级分割\n// components/\n//   HeavyChart.vue -> chunks/heavy-chart.js (自动延迟加载)\n\n// 手动优化\nexport default defineNuxtConfig({\n  vite: {\n    build: {\n      rollupOptions: {\n        output: {\n          // 自定义分块策略\n          manualChunks: {\n            'vendor-vue': ['vue', 'vue-router', 'pinia'],\n            'vendor-ui': ['element-plus']\n          }\n        }\n      }\n    }\n  }\n});\n",[2241],[2448],{"type":27,"tag":422,"props":2449,"children":2450},{"__ignoreMap":7},[2451],{"type":32,"value":2445},{"type":27,"tag":613,"props":2453,"children":2455},{"id":2454},"_52-图片优化增强",[2456],{"type":32,"value":2457},"5.2 图片优化增强",{"type":27,"tag":2201,"props":2459,"children":2462},{"code":2460,"language":2414,"meta":7,"className":2461},"\u003C!-- Nuxt 4 的 nuxt-img 增强 -->\n\u003Ctemplate>\n  \u003CNuxtImg\n    src=\"/images/hero.jpg\"\n    \n    \u003C!-- 新增：自动格式选择 -->\n    format=\"webp,avif\"\n    \n    \u003C!-- 新增：艺术指导响应式 -->\n    :sources=\"[\n      { media: '(max-width: 640px)', src: '/images/hero-mobile.jpg' },\n      { media: '(max-width: 1024px)', src: '/images/hero-tablet.jpg' }\n    ]\"\n    \n    \u003C!-- 新增：模糊占位符 -->\n    placeholder=\"/images/hero-blur.jpg\"\n    \n    \u003C!-- 新增：性能提示 -->\n    :priority=\"true\"\n    fetchpriority=\"high\"\n  />\n\u003C/template>\n\n\u003Cscript setup>\n// 编程式使用\nconst img = useImage();\n\n// 生成优化后的 URL\nconst optimizedUrl = img('/images/photo.jpg', {\n  width: 800,\n  height: 600,\n  format: 'webp',\n  quality: 80\n});\n\u003C/script>\n",[2416],[2463],{"type":27,"tag":422,"props":2464,"children":2465},{"__ignoreMap":7},[2466],{"type":32,"value":2460},{"type":27,"tag":613,"props":2468,"children":2470},{"id":2469},"_53-服务端渲染优化",[2471],{"type":32,"value":2472},"5.3 服务端渲染优化",{"type":27,"tag":2201,"props":2474,"children":2477},{"code":2475,"language":2239,"meta":7,"className":2476},"// Nuxt 4 SSR 性能优化\n\n// 1. 流式 SSR\n// nuxt.config.ts\nexport default defineNuxtConfig({\n  nitro: {\n    // 启用流式 SSR\n    experimental: {\n      wasm: true\n    }\n  },\n  \n  // 组件流式渲染\n  experimental: {\n    componentIslands: true,  // 组件岛\n    payloadExtraction: true  // Payload 提取\n  }\n});\n\n// 2. 选择性 Hydration\n// pages/article/[id].vue\n\u003Ctemplate>\n  \u003Carticle>\n    \u003C!-- 静态内容，不需要 hydration -->\n    \u003CNuxtIsland name=\"ArticleContent\" :props=\"{ content }\" />\n    \n    \u003C!-- 需要交互的部分 -->\n    \u003CCommentSection :articleId=\"id\" />\n  \u003C/article>\n\u003C/template>\n\n// 3. 预加载优化\n\u003Cscript setup>\n// 智能预加载\nconst { data } = await useAsyncData('article', () => $fetch('/api/article/' + id), {\n  // 预加载相关数据\n  preload: [\n    () => $fetch('/api/comments/' + id),\n    () => $fetch('/api/related/' + id)\n  ]\n});\n\u003C/script>\n",[2241],[2478],{"type":27,"tag":422,"props":2479,"children":2480},{"__ignoreMap":7},[2481],{"type":32,"value":2475},{"type":27,"tag":49,"props":2483,"children":2485},{"id":2484},"第六部分模块生态更新",[2486],{"type":32,"value":2487},"第六部分：模块生态更新",{"type":27,"tag":613,"props":2489,"children":2491},{"id":2490},"_61-官方模块适配",[2492],{"type":32,"value":2493},"6.1 官方模块适配",{"type":27,"tag":2201,"props":2495,"children":2498},{"code":2496,"language":2239,"meta":7,"className":2497},"// 主要官方模块的 Nuxt 4 兼容版本\n\n// @nuxtjs/i18n v9\nexport default defineNuxtConfig({\n  modules: ['@nuxtjs/i18n'],\n  \n  i18n: {\n    // 新增：编译时优化\n    bundle: {\n      optimizeTranslations: true\n    },\n    \n    // 新增：类型生成\n    types: 'composition'\n  }\n});\n\n// @nuxt/content v3\nexport default defineNuxtConfig({\n  modules: ['@nuxt/content'],\n  \n  content: {\n    // 新增：更强的查询 API\n    experimental: {\n      clientDB: true,\n      stripQueryParameters: true\n    }\n  }\n});\n\n// @pinia/nuxt v0.6\nexport default defineNuxtConfig({\n  modules: ['@pinia/nuxt'],\n  \n  pinia: {\n    // 新增：自动导入优化\n    storesDirs: ['./stores/**']\n  }\n});\n",[2241],[2499],{"type":27,"tag":422,"props":2500,"children":2501},{"__ignoreMap":7},[2502],{"type":32,"value":2496},{"type":27,"tag":613,"props":2504,"children":2506},{"id":2505},"_62-创建-nuxt-4-兼容模块",[2507],{"type":32,"value":2508},"6.2 创建 Nuxt 4 兼容模块",{"type":27,"tag":2201,"props":2510,"children":2513},{"code":2511,"language":2239,"meta":7,"className":2512},"// 模块开发的新约定\n\n// my-module/src/module.ts\nimport { defineNuxtModule, createResolver } from '@nuxt/kit'\n\nexport default defineNuxtModule({\n  meta: {\n    name: 'my-module',\n    configKey: 'myModule',\n    \n    // Nuxt 4 要求\n    compatibility: {\n      nuxt: '^4.0.0'\n    }\n  },\n  \n  defaults: {\n    enabled: true\n  },\n  \n  setup(options, nuxt) {\n    const resolver = createResolver(import.meta.url);\n    \n    // 使用新的 hook API\n    nuxt.hook('app:resolve', (app) => {\n      // app 配置\n    });\n    \n    // 添加运行时插件\n    addPlugin(resolver.resolve('./runtime/plugin'));\n    \n    // 添加组件\n    addComponentsDir({\n      path: resolver.resolve('./runtime/components'),\n      prefix: 'MyModule'\n    });\n  }\n});\n",[2241],[2514],{"type":27,"tag":422,"props":2515,"children":2516},{"__ignoreMap":7},[2517],{"type":32,"value":2511},{"type":27,"tag":49,"props":2519,"children":2521},{"id":2520},"第七部分迁移准备",[2522],{"type":32,"value":2523},"第七部分：迁移准备",{"type":27,"tag":613,"props":2525,"children":2527},{"id":2526},"_71-兼容性检查清单",[2528],{"type":32,"value":2529},"7.1 兼容性检查清单",{"type":27,"tag":2201,"props":2531,"children":2535},{"code":2532,"language":370,"meta":7,"className":2533},"## Nuxt 4 迁移检查清单\n\n### 依赖版本\n- [ ] Node.js >= 20\n- [ ] Vue >= 3.4\n- [ ] TypeScript >= 5.3（推荐）\n\n### 代码检查\n- [ ] 移除已废弃的 API 调用\n- [ ] 更新 composables 导入路径\n- [ ] 检查 useAsyncData 用法\n- [ ] 审查中间件语法\n\n### 目录结构\n- [ ] 决定是否采用新目录结构\n- [ ] 移动文件到 app/ 目录（如果采用）\n- [ ] 更新 nuxt.config.ts 配置\n\n### 模块更新\n- [ ] 更新官方模块到兼容版本\n- [ ] 检查第三方模块兼容性\n- [ ] 更新自定义模块\n\n### 测试\n- [ ] 运行全部测试套件\n- [ ] 验证 SSR/SSG 输出\n- [ ] 检查 hydration 错误\n- [ ] 性能基准测试\n",[2534],"language-markdown",[2536],{"type":27,"tag":422,"props":2537,"children":2538},{"__ignoreMap":7},[2539],{"type":32,"value":2532},{"type":27,"tag":613,"props":2541,"children":2543},{"id":2542},"_72-渐进式升级路径",[2544],{"type":32,"value":2545},"7.2 渐进式升级路径",{"type":27,"tag":2201,"props":2547,"children":2550},{"code":2548,"language":2239,"meta":7,"className":2549},"// 使用 compatibilityVersion 实现渐进升级\n\n// 阶段 1：启用 Nuxt 4 特性（保持旧目录结构）\nexport default defineNuxtConfig({\n  future: {\n    compatibilityVersion: 4\n  },\n  srcDir: './'  // 保持旧目录结构\n});\n\n// 阶段 2：迁移到新目录结构\n// 1. 创建 app/ 目录\n// 2. 移动文件\n// 3. 更新导入路径\n\n// 阶段 3：完全升级\nexport default defineNuxtConfig({\n  // 移除 future 配置，默认使用 Nuxt 4 行为\n});\n",[2241],[2551],{"type":27,"tag":422,"props":2552,"children":2553},{"__ignoreMap":7},[2554],{"type":32,"value":2548},{"type":27,"tag":49,"props":2556,"children":2558},{"id":2557},"结语稳步前进的进化",[2559],{"type":32,"value":2560},"结语：稳步前进的进化",{"type":27,"tag":28,"props":2562,"children":2563},{},[2564],{"type":32,"value":2565},"Nuxt 4 不是一次颠覆性的重写，而是在 Nuxt 3 坚实基础上的持续改进。新的目录结构带来更好的组织性，Nitro 2.0 带来更好的性能，增强的类型系统带来更好的开发体验。",{"type":27,"tag":28,"props":2567,"children":2568},{},[2569],{"type":32,"value":2570},"对于 Nuxt 3 用户来说，升级路径相对平滑。核心概念没有变化，熟悉的 API 依然工作。Nuxt 团队显然吸取了 Nuxt 2 到 Nuxt 3 升级的经验，这次提供了更友好的迁移体验。",{"type":27,"tag":28,"props":2572,"children":2573},{},[2574],{"type":32,"value":2575},"如果你正在考虑是否升级，建议：",{"type":27,"tag":61,"props":2577,"children":2578},{},[2579,2584,2589],{"type":27,"tag":65,"props":2580,"children":2581},{},[2582],{"type":32,"value":2583},"新项目直接使用 Nuxt 4",{"type":27,"tag":65,"props":2585,"children":2586},{},[2587],{"type":32,"value":2588},"现有项目评估迁移成本后决定",{"type":27,"tag":65,"props":2590,"children":2591},{},[2592],{"type":32,"value":2593},"关注官方迁移指南的更新",{"type":27,"tag":485,"props":2595,"children":2596},{},[],{"type":27,"tag":49,"props":2598,"children":2600},{"id":2599},"参考资源",[2601],{"type":32,"value":2599},{"type":27,"tag":61,"props":2603,"children":2604},{},[2605,2616,2626,2636],{"type":27,"tag":65,"props":2606,"children":2607},{},[2608],{"type":27,"tag":334,"props":2609,"children":2613},{"href":2610,"rel":2611},"https://nuxt.com/blog/v4",[2612],"nofollow",[2614],{"type":32,"value":2615},"Nuxt 4 官方公告",{"type":27,"tag":65,"props":2617,"children":2618},{},[2619],{"type":27,"tag":334,"props":2620,"children":2623},{"href":2621,"rel":2622},"https://nuxt.com/docs/migration/upgrade",[2612],[2624],{"type":32,"value":2625},"Nuxt 4 迁移指南",{"type":27,"tag":65,"props":2627,"children":2628},{},[2629],{"type":27,"tag":334,"props":2630,"children":2633},{"href":2631,"rel":2632},"https://nitro.unjs.io/changelog",[2612],[2634],{"type":32,"value":2635},"Nitro 2.0 更新日志",{"type":27,"tag":65,"props":2637,"children":2638},{},[2639],{"type":27,"tag":334,"props":2640,"children":2643},{"href":2641,"rel":2642},"https://github.com/nuxt/nuxt/issues",[2612],[2644],{"type":32,"value":2645},"Nuxt 路线图",{"title":7,"searchDepth":359,"depth":359,"links":2647},[2648,2649,2650,2655,2660,2665,2670,2675,2679,2683,2684],{"id":2163,"depth":362,"text":2166},{"id":2169,"depth":362,"text":2172},{"id":2185,"depth":362,"text":2188,"children":2651},[2652,2653,2654],{"id":2191,"depth":359,"text":2194},{"id":2227,"depth":359,"text":2230},{"id":2249,"depth":359,"text":2252},{"id":2264,"depth":362,"text":2267,"children":2656},[2657,2658,2659],{"id":2270,"depth":359,"text":2273},{"id":2290,"depth":359,"text":2293},{"id":2305,"depth":359,"text":2308},{"id":2320,"depth":362,"text":2323,"children":2661},[2662,2663,2664],{"id":2326,"depth":359,"text":2329},{"id":2341,"depth":359,"text":2344},{"id":2356,"depth":359,"text":2359},{"id":2371,"depth":362,"text":2374,"children":2666},[2667,2668,2669],{"id":2377,"depth":359,"text":2380},{"id":2392,"depth":359,"text":2395},{"id":2407,"depth":359,"text":2410},{"id":2433,"depth":362,"text":2436,"children":2671},[2672,2673,2674],{"id":2439,"depth":359,"text":2442},{"id":2454,"depth":359,"text":2457},{"id":2469,"depth":359,"text":2472},{"id":2484,"depth":362,"text":2487,"children":2676},[2677,2678],{"id":2490,"depth":359,"text":2493},{"id":2505,"depth":359,"text":2508},{"id":2520,"depth":362,"text":2523,"children":2680},[2681,2682],{"id":2526,"depth":359,"text":2529},{"id":2542,"depth":359,"text":2545},{"id":2557,"depth":362,"text":2560},{"id":2599,"depth":362,"text":2599},"content:topics:nuxt:nuxt4-major-updates-overview.md","topics/nuxt/nuxt4-major-updates-overview.md","topics/nuxt/nuxt4-major-updates-overview",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":2689,"image":18,"imageQuery":19,"pexelsPhotoId":20,"pexelsUrl":21,"featured":6,"readingTime":22,"body":2690,"_type":370,"_id":371,"_source":372,"_file":373,"_stem":374,"_extension":375},[13,14,15,16,17],{"type":24,"children":2691,"toc":2952},[2692,2696,2700,2707,2711,2715,2726,2730,2734,2738,2757,2761,2765,2769,2773,2777,2796,2800,2804,2808,2827,2831,2835,2839,2854,2858,2862,2866,2889,2893,2916,2920,2924,2928],{"type":27,"tag":28,"props":2693,"children":2694},{},[2695],{"type":32,"value":33},{"type":27,"tag":28,"props":2697,"children":2698},{},[2699],{"type":32,"value":38},{"type":27,"tag":28,"props":2701,"children":2702},{},[2703],{"type":27,"tag":43,"props":2704,"children":2705},{},[2706],{"type":32,"value":47},{"type":27,"tag":49,"props":2708,"children":2709},{"id":51},[2710],{"type":32,"value":54},{"type":27,"tag":28,"props":2712,"children":2713},{},[2714],{"type":32,"value":59},{"type":27,"tag":61,"props":2716,"children":2717},{},[2718,2722],{"type":27,"tag":65,"props":2719,"children":2720},{},[2721],{"type":32,"value":69},{"type":27,"tag":65,"props":2723,"children":2724},{},[2725],{"type":32,"value":74},{"type":27,"tag":28,"props":2727,"children":2728},{},[2729],{"type":32,"value":79},{"type":27,"tag":49,"props":2731,"children":2732},{"id":82},[2733],{"type":32,"value":82},{"type":27,"tag":28,"props":2735,"children":2736},{},[2737],{"type":32,"value":89},{"type":27,"tag":61,"props":2739,"children":2740},{},[2741,2745,2749,2753],{"type":27,"tag":65,"props":2742,"children":2743},{},[2744],{"type":32,"value":97},{"type":27,"tag":65,"props":2746,"children":2747},{},[2748],{"type":32,"value":102},{"type":27,"tag":65,"props":2750,"children":2751},{},[2752],{"type":32,"value":107},{"type":27,"tag":65,"props":2754,"children":2755},{},[2756],{"type":32,"value":112},{"type":27,"tag":28,"props":2758,"children":2759},{},[2760],{"type":32,"value":117},{"type":27,"tag":49,"props":2762,"children":2763},{"id":120},[2764],{"type":32,"value":123},{"type":27,"tag":28,"props":2766,"children":2767},{},[2768],{"type":32,"value":128},{"type":27,"tag":28,"props":2770,"children":2771},{},[2772],{"type":32,"value":133},{"type":27,"tag":28,"props":2774,"children":2775},{},[2776],{"type":32,"value":138},{"type":27,"tag":61,"props":2778,"children":2779},{},[2780,2784,2788,2792],{"type":27,"tag":65,"props":2781,"children":2782},{},[2783],{"type":32,"value":146},{"type":27,"tag":65,"props":2785,"children":2786},{},[2787],{"type":32,"value":151},{"type":27,"tag":65,"props":2789,"children":2790},{},[2791],{"type":32,"value":156},{"type":27,"tag":65,"props":2793,"children":2794},{},[2795],{"type":32,"value":161},{"type":27,"tag":28,"props":2797,"children":2798},{},[2799],{"type":32,"value":166},{"type":27,"tag":49,"props":2801,"children":2802},{"id":169},[2803],{"type":32,"value":172},{"type":27,"tag":28,"props":2805,"children":2806},{},[2807],{"type":32,"value":177},{"type":27,"tag":61,"props":2809,"children":2810},{},[2811,2815,2819,2823],{"type":27,"tag":65,"props":2812,"children":2813},{},[2814],{"type":32,"value":185},{"type":27,"tag":65,"props":2816,"children":2817},{},[2818],{"type":32,"value":190},{"type":27,"tag":65,"props":2820,"children":2821},{},[2822],{"type":32,"value":195},{"type":27,"tag":65,"props":2824,"children":2825},{},[2826],{"type":32,"value":200},{"type":27,"tag":28,"props":2828,"children":2829},{},[2830],{"type":32,"value":205},{"type":27,"tag":49,"props":2832,"children":2833},{"id":208},[2834],{"type":32,"value":211},{"type":27,"tag":28,"props":2836,"children":2837},{},[2838],{"type":32,"value":216},{"type":27,"tag":61,"props":2840,"children":2841},{},[2842,2846,2850],{"type":27,"tag":65,"props":2843,"children":2844},{},[2845],{"type":32,"value":224},{"type":27,"tag":65,"props":2847,"children":2848},{},[2849],{"type":32,"value":229},{"type":27,"tag":65,"props":2851,"children":2852},{},[2853],{"type":32,"value":234},{"type":27,"tag":28,"props":2855,"children":2856},{},[2857],{"type":32,"value":239},{"type":27,"tag":49,"props":2859,"children":2860},{"id":242},[2861],{"type":32,"value":242},{"type":27,"tag":28,"props":2863,"children":2864},{},[2865],{"type":32,"value":249},{"type":27,"tag":251,"props":2867,"children":2868},{},[2869,2873,2877,2881,2885],{"type":27,"tag":65,"props":2870,"children":2871},{},[2872],{"type":32,"value":258},{"type":27,"tag":65,"props":2874,"children":2875},{},[2876],{"type":32,"value":263},{"type":27,"tag":65,"props":2878,"children":2879},{},[2880],{"type":32,"value":268},{"type":27,"tag":65,"props":2882,"children":2883},{},[2884],{"type":32,"value":273},{"type":27,"tag":65,"props":2886,"children":2887},{},[2888],{"type":32,"value":278},{"type":27,"tag":49,"props":2890,"children":2891},{"id":281},[2892],{"type":32,"value":281},{"type":27,"tag":61,"props":2894,"children":2895},{},[2896,2900,2904,2908,2912],{"type":27,"tag":65,"props":2897,"children":2898},{},[2899],{"type":32,"value":291},{"type":27,"tag":65,"props":2901,"children":2902},{},[2903],{"type":32,"value":296},{"type":27,"tag":65,"props":2905,"children":2906},{},[2907],{"type":32,"value":301},{"type":27,"tag":65,"props":2909,"children":2910},{},[2911],{"type":32,"value":306},{"type":27,"tag":65,"props":2913,"children":2914},{},[2915],{"type":32,"value":311},{"type":27,"tag":49,"props":2917,"children":2918},{"id":314},[2919],{"type":32,"value":314},{"type":27,"tag":28,"props":2921,"children":2922},{},[2923],{"type":32,"value":321},{"type":27,"tag":28,"props":2925,"children":2926},{},[2927],{"type":32,"value":326},{"type":27,"tag":61,"props":2929,"children":2930},{},[2931,2938,2945],{"type":27,"tag":65,"props":2932,"children":2933},{},[2934],{"type":27,"tag":334,"props":2935,"children":2936},{"href":336},[2937],{"type":32,"value":339},{"type":27,"tag":65,"props":2939,"children":2940},{},[2941],{"type":27,"tag":334,"props":2942,"children":2943},{"href":345},[2944],{"type":32,"value":348},{"type":27,"tag":65,"props":2946,"children":2947},{},[2948],{"type":27,"tag":334,"props":2949,"children":2950},{"href":354},[2951],{"type":32,"value":357},{"title":7,"searchDepth":359,"depth":359,"links":2953},[2954,2955,2956,2957,2958,2959,2960,2961],{"id":51,"depth":362,"text":54},{"id":82,"depth":362,"text":82},{"id":120,"depth":362,"text":123},{"id":169,"depth":362,"text":172},{"id":208,"depth":362,"text":211},{"id":242,"depth":362,"text":242},{"id":281,"depth":362,"text":281},{"id":314,"depth":362,"text":314},1777644598320]