Nuxt SSR排障:不匹配、404、缓存与部署
本篇是本地课程目录的故障推演。示例未执行,文中的操作和预期需要读者日后实测;没有真实控制台、HTTP或部署记录。排查时保留请求地址、状态码、原始HTML与最小输入,但不要记录cookie、凭据和完整个人头字段。
Nuxt出现hydration不匹配应该先检查什么
Nuxt出现hydration不匹配应该先检查什么?先比较服务器HTML与浏览器首次渲染的输入,再检查非法HTML嵌套、Date或随机值以及localStorage条件。hydration不匹配是两侧首次树不一致,不能仅以最终页面看起来正确认定无问题。浏览器可能修正非法标签,Vue也可能恢复DOM,这些都会掩盖原始原因。
本例以固定fixture、payload布尔值和稳定键保证可推演的首屏,不依赖本地时区。若加入window.innerWidth,把读取推迟到onMounted并给出一致的初始回退;若加入时间,明确服务器与浏览器共用的显示输入。不要用data-allow-mismatch掩盖可修复错误,或在没有解释代价时关闭全站SSR。依据:Nuxt hydration建议。
Nuxt详情404为什么要同时检查页面和API状态
Nuxt详情404为什么要同时检查页面和API状态?API状态表示资源读取结果,页面状态表示SSR响应是否正确表达不存在;只在页面显示文字却返回200,会把失败页面当成功内容。本例API无效slug或查无课程返回404,详情把404传给Nuxt错误页,其他读取失败归为503,错误页不打印原始异常。
客户端导航错误还需检查clearError返回后的应用状态;硬刷新则检查真实HTTP状态,二者不能互相替代。若代理把/api/不存在改写为index.html,读取可能收到200 HTML而非JSON,先检查Content-Type与响应源。未知页面与已匹配但课程不存在都可显示404文案,但根因分别在页面路由与业务查询。依据:Nuxt错误处理。
Nuxt没有全局用户变量为什么仍可能串请求
Nuxt没有全局用户变量为什么仍可能串请求?共享缓存可以把一个请求的HTML与payload直接回给另一个请求,即使服务器useState隔离正确。欢迎语依赖Accept-Language,CDN只按路径缓存首页就会串语言;未来若含用户内容,后果可能是数据泄露。本例HTML和API均no-store,没有SWR、prerender或共享welcome缓存。
排查先看Node直连,再看反向代理和CDN实际响应头与缓存命中;源码写了no-store不能证明边缘没有覆盖。公共fixture适合共享不可变输入,不代表包含欢迎语的整页也可公共缓存。若未来缓存纯公共课程,应定义数据更新与失效规则;若做语言变体缓存,必须完整定义变体键和所有响应差异,不能仅补一个缓存时间。依据:Nuxt渲染模式。
Nuxt为什么不能只上传public目录部署这个项目
Nuxt为什么不能只上传public目录部署这个项目?public目录只有静态资源,当前项目的SSR HTML与本地API都需要Node服务器执行;node-server构建产物入口为.output/server/index.mjs,部署要保留完整.output。静态主机不会因为上传一个Vue页面就自动运行welcome handler,开发环境能访问也不证明生产具备相同运行时。
本例固定node-server preset,未做静态生成、边缘或serverless适配。生产还要验证代理路由、状态码、超时、资源路径和no-store;不能把所有404重写为SPA壳。原生Node可用的库也未必适合边缘环境。README给出读者未来安装和构建步骤,本轮未执行;运行时应由宿主注入环境变量,不能假设生产入口自动加载开发.env。依据:Nuxt部署。
练习:代理前后差异
Node直连时A/en与B/zh欢迎语不同,经过CDN后都变成英文,且404详情返回200。给出两个独立假设、应收集的证据与修复后的验收,不要把两件事归咎于useState。
参考答案(推演,未执行)
语言串用优先检查CDN是否覆盖no-store并按路径缓存完整响应;404变200优先检查代理错误页/SPA fallback改写。对比直连与边缘的状态、HTML、缓存响应头和路由配置;修复后交替及并发验证语言,再硬刷新不存在详情与API,分别确认404。没有实际请求记录前只能保留假设,不能声称已定位或修复。
继续阅读
- 响应式与组件
- 开发实践
- 开发实践