记录一下那天晚上的排查过程。Nuxt 3.11 站点在页面里用 useHead 设标题,本地 build 后 curl 能看到正确 title,线上蜘蛛抓到的全是 Nuxt App,description 为空。试过改 nuxt.config 里的全局 head,只有首页生效。
刚开始盯着「nitro 的预渲染缓存了首版 HTML,之后没有失效」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。useHead 写进了 onMounted,SSR 阶段根本不执行。少数情况下是页面被 ClientOnly 包住,服务端输出的 HTML 里只有占位。
还有一种情况,部署到静态托管但 ssr 关了,实际输出的是 CSR 空壳。
上来先看线上返回的标题
curl -s https://www.example.com/ | grep -o "<title>[^<]*</title>"
接着找一下写在生命周期里的调用
grep -rn "onMounted" pages/ | head
本地构建并按 SSR 方式启动
npx nuxi build && node .output/server/index.mjs
等前面都确认过,再对比本地输出的 head
curl -s http://localhost:3000/ | grep -o "<title>[^<]*</title>"
怎么算真的好了,看的是同一批现象。线上和本地构建的 title 完全一致,查看源代码能看到正文,Search Console 网址检查抓到的 HTML 不再是空 body。
useHead 要放在 setup 顶层,依赖 window 的逻辑放 onMounted,否则服务端渲染会直接跳过这一段。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
