营销增长
Next.js App Router 项目实现、审计与排查…
在 Next.js App Router 中实现或修复 SEO、运行 SEO 审计、诊断 Google 索引与富结果问题时,按证据优先和官方文档执行。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
Next.js App Router 项特定
解决思路
- 先核对证据与内容:修改框架代码前,读取已安装的 Next.js 版本与相关 node_modules/next/dist/docs/ 指南;本地文档不可用时查当前官方文档。
- 可用时用 Vercel MCP 文档搜索查平台行为,但把检索到的示例与已安装框架版本核对。
- 不要把搜索片段里的旧版 cache API 复制进较新应用。
- 先解决读者任务;短小有用页面无需填充。H1、副标题、各节标题职责不同;不要为 SEO 在每处重复同一短语。UI 文案保持简洁、具体、有用。
- 不要为了显得优化而添加通用介绍、关键词块、装饰徽章、FAQ 或 TL;DR;只在回答真实问题时加内容;保留必要解释和披露。
- 仅当团队、地点或分类页面各自提供独特、可维护价值时才创建;只换名称/logo 和重复列表不够。
- 用当前数据描述季节、可用性、更新时间;不要把上线前文案留在活跃服务上,也不要为新鲜度改时间戳。
- 区分证据:Search Console 效果导出显示查询和流量,不显示索引状态、Google 的 canonical 选择或 CWV;用对应报告或 URL Inspection;无法检查的标记为未验证。
- 先报告发现和验证,再预测影响;不要保证排名、索引、富结果或 AI 引用。
- 快速 SEO 审计:检查 robots.txt,运行 curl https://your-site.com/robots.txt。
- 快速 SEO 审计:检查 sitemap,运行 curl https://your-site.com/sitemap.xml。
- 快速 SEO 审计:查看页面源代码,搜索 <title> 和 <meta name="description">。
- 快速 SEO 审计:查看页面源代码,搜索 application/ld+json。
- 快速 SEO 审计:用 PageSpeed Insights (pagespeed.web.dev) 和 Search Console CWV 报告看字段数据;Lighthouse 仅实验室诊断,不能测 INP。
- app/layout.tsx 根元数据:Viewport 必须单独导出;metadata 对象里的 themeColor、colorScheme、viewport 自 v14 起已弃用(仍会带警告输出,但不保证保留)。
- app/layout.tsx 的 viewport 导出设置 width: 'device-width', initialScale: 1, maximumScale: 5, userScalable: true, themeColor 为 light/dark 两个 media 的数组(#ffffff、#0a0a0a)。
- app/layout.tsx 的 metadata 导出设置 metadataBase: new URL('https://your-site.com')。
- title 用 default: 'Site Title - Main Keyword' 和 template: '%s | Site Name'。
- description 指南约 150-160 字符,不是硬限制;Google 会按设备和查询截断。
- 不设 keywords 字段;Google 完全忽略 keywords meta 标签。
- openGraph 设置 type: 'website', locale: 'en_US', url, siteName, title, description, images 含 url width height alt。
- twitter 设置 card: 'summary_large_image', title, description, images。
- 每页设置 alternates.canonical;根 '/' 会被子级继承。
- robots 设置 index: true, follow: true。
- app/sitemap.ts 动态 sitemap:export default async function sitemap(): Promise<MetadataRoute.Sitemap>;baseUrl;从 CMS/DB getPosts;返回根 URL 并带 images 图片 sitemap 条目、/about、posts map 的 /blog/${post.slug} 和 lastModified: post.updatedAt。
- sitemap 的 lastModified 必须反映内容真实最后变更(CMS updatedAt、文件 mtime、git commit date);Google 只在 lastmod 持续准确时使用;每次构建 new Date() 会让所有页面标记刚变更,导致 Google 忽略。
- sitemap 跳过 changeFrequency 和 priority;Google 都忽略。
- app/robots.ts:export default function robots(): MetadataRoute.Robots;baseUrl;rules userAgent '*'、allow '/'、disallow ['/api/', '/admin/'];sitemap 指向 sitemap.xml。
- robots 不要 disallow /_next/;爬虫需要渲染关键 CSS/JS。
- robots 除非覆盖通配符,不要加特定 bot 规则;若加了,必须在每个命名组重复所有 disallow,因为命名组不继承 * 规则(RFC 9309 §2.2.1;Google 从不合并特定组与 *)。
- robots 有意省略 host;它是 Google 忽略的非标准指令;用 canonical URL / 301 声明首选主机。
- app/manifest.ts:与 sitemap/robots 同属 MetadataRoute,放在 app/ 根;不是 SEO 要求,只是 PWA 完整性,不影响排名;除非站点是/将成 PWA,否则跳过。
- OG/Twitter 图片三种方式:优先文件约定,避免在 metadata 对象手工同步 URL。
- OG/Twitter 图片方式1:外部 URL 写进 metadata 的 openGraph.images / twitter.images,适合外托管图片。
- OG/Twitter 图片方式2:静态文件约定(推荐默认):把 opengraph-image.(png|jpg|gif) 和/或 twitter-image.* 放入路由段(根用 app/opengraph-image.png,/blog 用 app/blog/opengraph-image.png);Next.js 自动输出 og:image/twitter:image + :type/:width/:height;更深更具体图片覆盖上层;用同级 opengraph-image.alt.txt 加 alt;文件超过 8 MB(OG)/5 MB(Twitter)构建失败。
- OG/Twitter 图片方式3:用 ImageResponse 动态生成逐页/逐文章图片:路由段放 opengraph-image.tsx,导出 alt、size、contentType 和默认 Image({ params })(v16 中 params 是 Promise),返回 new ImageResponse(<jsx/>, { ...size });经 Satori 渲染,仅支持 flexbox,不支持 display: grid;除非读取请求时数据,否则构建时静态优化;字体、generateImageMetadata、favicon/icon.tsx/apple-icon 约定见 references/metadata-api.md。
- Cache Components 与 SEO:启用 cacheComponents: true 时,对可共享且新鲜度允许缓存的数据/组件用 "use cache";静态内容不必仅为 SEO 加缓存指令。
- Cache Components 示例:hero-section.tsx 中 "use cache"; cacheLife("hours"); cacheTag("hero"); 在 Server Action 中用 updateTag("hero") 失效。
- 依据产品新鲜度需求和已安装 Next.js 文档选择 cacheLife;不要按页面类别推断缓存时长;营销和法务页面也需要及时发布和失效。
- "use cache" 必须是函数体第一条语句;文件级缓存则放文件顶部。
- 纯 "use cache" 作用域内不能有 cookies()/headers()/运行时 searchParams;把公开内容与个性化数据分开;不要意外把所有用户缓存私有信息;使用实验性 private caching 前查已安装文档。
- 在 Server Action 内用 updateTag("hero") 失效(read-your-writes;在 Server Action 外会抛错);在 Route Handler/webhook 用 revalidateTag("hero", "max")(传 profile;单参数形式是旧行为);优先用这些而不是 export const revalidate。
- 按真实新鲜度要求选缓存寿命,不要因 SEO 偏好长缓存;验证 next build、实际提供内容和发布时失效;Cache Components 下 legacy route options 如 revalidate 被禁用;未启用时遵循已安装版本文档支持的缓存模型。
- 数据库读取本身不会让 sitemap 部署后自动更新;配置并验证其刷新/失效路径;Metadata 可静态或运行时依赖,检查路由而不是假设。
- 渲染策略 "use cache":用于有明确刷新策略的共享数据;内容可进入预渲染外壳。
- 渲染策略 SSG 静态:用于构建时已知内容;内容在 HTML 中可用;规划更新。
- 渲染策略 SSR:用于请求时所需内容;内容在响应中可用;测量延迟。
- 渲染策略 CSR:用于交互或认证功能;关键公开内容避免依赖仅浏览器抓取。
- 这些是渲染取舍,不是排名层级;Client Component 仍可被服务端预渲染;"use client" 不表示内容不在 HTML 中。
- Core Web Vitals 目标 LCP < 2.5s,影响加载速度。
- Core Web Vitals 目标 INP < 200ms,影响交互性。
- Core Web Vitals 目标 CLS < 0.1,影响视觉稳定性。
- CWV 用第 75 百分位字段测量并按设备分段;分别评估每个指标,不代表同一批 75% 访问同时通过三项;Lighthouse 是实验室诊断,不是 INP 字段分数。
- CWV 好不保证排名;相关内容、可抓取性和准确 metadata 仍必要;避免编造数值排名权重。
- 移动端内容、metadata 和结构化数据要与桌面等价;验证作者和资质,不要生成。
- 写 generateMetadata、OG/icon 文件、ImageResponse、manifest,或涉及流式 metadata / htmlLimitedBots 时读 references/metadata-api.md。
- generateSitemaps、图片/视频 sitemap、多组 robots 规则、静态 robots.txt/sitemap.xml 时读 references/sitemap-robots.md。
- 添加任何 schema 类型前读 references/json-ld.md,内含支持/弃用富结果列表和 @graph 模式。
- 决定 GPTBot/OAI-SearchBot/ClaudeBot 等 robots 规则,或被问 llms.txt / AI Overviews 时读 references/ai-search.md。
- 端到端审计站点时读 references/checklist.md。
- 页面未出现在 Google、卡在 Discovered/Crawled – currently not indexed,或索引正常但从不 hydrate 时读 references/troubleshooting.md。
- 不要在 App Router 混用 next-seo 与 Metadata API;只用 Metadata API。
- 当重复/参数化 URL 有风险时设置自引用 alternates.canonical;它是提示不是要求,Google 可能自选 canonical。
- SEO 页面不要用 CSR;可索引内容用 SSG/SSR。
- 不要在 robots.txt 屏蔽 /_next/;爬虫需要渲染关键 CSS/JS;绝不要 disallow /_next/。
- 不要漏 metadataBase;metadata 中相对 URL 需要它。
- 不要把 viewport 放在 metadata 中;必须单独导出。
- 不要在同一路由段混用 metadata 对象和 generateMetadata;二选一。
- 不要在 metadata 和文件约定中重复 icons;优先 favicon.ico/icon.*/opengraph-image.* 文件约定,它们自动输出标签并覆盖 metadata 对象。
- 不要一刀切屏蔽 AI 爬虫;GPTBot disallow: / 屏蔽训练但仍可留 AI 搜索;不要误屏蔽引用 bot(OAI-SearchBot、PerplexityBot);见 references/ai-search.md。
- 不要为 Google 添加 keywords meta 标签;Google 完全忽略(无索引或排名效果);是噪音不是信号。
- 不要假设 robots.txt 命名组继承 * 规则;按 RFC 9309 §2.2.1,* 组仅在无匹配组时适用,Google 从不把特定组与 * 合并;例如 { userAgent: 'OAI-SearchBot', allow: '/' } 会丢掉通配符的 /api/、/admin/ disallow,必须在每个命名组重复。
- 不要只信浏览器视图判断 bot metadata;检查 Googlebot 和相关 HTML-limited bot 的状态、headers 和完整生产响应;流式可能把 metadata 放到初始 head 之外;伪造 User-Agent 只测响应行为,不测 Google 实际抓取访问或索引;可用时用 URL Inspection 和已验证 bot 日志。
- 不要假设索引良好的路由也能正常工作;PPR 路由(构建输出 ◐)可提供完美 SEO HTML,但直接加载时 <Suspense> 边界可能不 hydrate;在浏览器直接加载并交互;见 references/troubleshooting.md#ppr-route-serves-perfect-seo-html-but-client-components-never-hydrate。
- 快速修复:给页面加 noindex,metadata robots index: false, follow: true;保持页面可抓取以便 noindex 被看到;robots disallow 不是移除索引或访问控制机制;预览保护和 noindex 是分开的;见 references/sitemap-robots.md。
- 快速修复:每页动态 metadata,type Props = { params: Promise<{ id: string }> }; generateMetadata({ params }) 中 await params;取 product;返回 title: product.name, description: product.description。
- 快速修复:动态路由 canonical,generateMetadata 中 await params;返回 alternates.canonical: `/products/${slug}`。
适用边界 · 注意事项
- 不适用于与 SEO 无关的通用 Next.js 功能开发。
- 不适用于非 Next.js App Router 项目;Pages Router 或其它框架需换用对应方案。
- 若只是补 PWA manifest 且没有任何 SEO/爬虫/索引需求,不要把它当 SEO 任务。