ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

网站建设指南:用 Next.js + Tailwind CSS 配 TaoToken 搭建 SEO 友好站点

网站建设指南:用 Next.js + Tailwind CSS 配 TaoToken 搭建 SEO 友好站点 1. 从零建站最容易踩的坑SEO 元信息全靠手写如果你正在搜「网站建设」「Next.js SEO」「Tailwind CSS 建站」大概率已经遇到过这个场景用create-next-app起了一个项目页面能跑样式也好看但一打开搜索引擎收录后台发现标题全是默认的 Create Next App描述为空社交平台分享出去只有一条光秃秃的链接。问题不在框架而在于元信息metadata没有系统化配置。Next.js 14 的 App Router 提供了generateMetadata和静态metadata导出配合 Tailwind CSS 做布局本身就能搭出 SEO 友好的站点。但真正落地时还有第二层需求站点里往往要接入 AI 能力比如自动生成文章摘要、SEO 描述、结构化数据或者做一个站内问答。这时候如果每个功能都单独申请一家模型厂商的 Key配置会散落在.env、settings.json、前端代码里维护成本很高。这篇内容聚焦一条可复制的路径用 Next.js Tailwind CSS 搭骨架用 TaoToken 作为统一的 Key/API 通道把模型调用收敛到一个入口然后给出 config 骨架、settings.json片段以及本地启动、页面渲染、SEO 元信息校验的具体验证动作。适合正在做个人博客、企业官网、文档站并且希望站点具备 AI 增强能力的前端开发者。下面所有步骤都可以直接跟做不需要你先有服务器。2. TaoToken 前置统一 Key 与 API 通道怎么理解TaoToken 在这里扮演的角色可以类比成「模型调用的统一网关」。你不需要在项目里维护 OpenAI、Anthropic 等多个厂商的地址和密钥而是通过一个 API 入口和一把 Key 完成调用。对建站场景来说好处很直接SEO 描述生成、文章摘要、站内问答这些功能可以共用同一套配置换模型时只改一个字段。官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基础地址是 https://taotoken.net/api 这个地址不加 UTM 参数直接用于代码里的baseURL。你需要提前准备两样东西第一是 API Key。进入控制台创建地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 创建完成后到 API Keys 页面复制地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。Key 只显示一次复制后放进项目的环境变量不要提交到 Git。第二是确认你要用的模型名。可以在模型对话页面先试跑一次地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 输入一句「帮我写一段 120 字以内的 SEO 描述主题是 Next.js 建站」确认返回正常再把它写进项目配置。注意Key 属于敏感凭证前端代码里不要出现明文。Next.js 项目里统一放在.env.local服务端路由通过process.env读取。如果你后续要做长期编码或 Agent 类功能可以了解 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入细节查文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。本篇只用到最基础的对话接口。3. 可复制配置Next.js Tailwind settings.json 骨架先建项目。Node 版本建议 18.17 以上命令如下npx create-next-applatest my-seo-site --typescript --tailwind --eslint --app --src-dir cd my-seo-site npm install openai这里用openai这个 SDK 是因为它兼容 OpenAI 风格的接口把baseURL指向 TaoToken 的 API 地址即可不需要额外装厂商专用包。接着在项目根目录创建.env.localTAOTOKEN_API_KEY你的Key TAOTOKEN_BASE_URLhttps://taotoken.net/api然后建一个统一的配置文件src/config/site.ts把站点级 SEO 信息和模型配置分开管理// src/config/site.ts export const siteConfig { name: 我的 SEO 站点, url: https://example.com, description: 用 Next.js 与 Tailwind CSS 搭建的 SEO 友好站点, locale: zh-CN, keywords: [网站建设, Next.js, Tailwind CSS, SEO], }; export const aiConfig { baseURL: process.env.TAOTOKEN_BASE_URL!, apiKey: process.env.TAOTOKEN_API_KEY!, model: gpt-4o-mini, maxTokens: 300, };再建一个settings.json放在项目根目录用于描述站点级开关和默认参数。这个文件适合放非敏感、可提交的配置{ site: { titleTemplate: %s | 我的 SEO 站点, defaultDescription: Next.js Tailwind CSS 建站实战, openGraph: { type: website, locale: zh_CN } }, ai: { provider: taotoken, endpoint: https://taotoken.net/api, defaultModel: gpt-4o-mini, timeoutMs: 20000 }, seo: { generateSitemap: true, robots: { allow: /, disallow: [/api/] } } }在next.config.mjs里读取这个 JSON方便后续扩展// next.config.mjs import { readFileSync } from node:fs; const settings JSON.parse(readFileSync(./settings.json, utf-8)); /** type {import(next).NextConfig} */ const nextConfig { env: { SITE_TITLE_TEMPLATE: settings.site.titleTemplate, }, }; export default nextConfig;到这里骨架就搭好了。Tailwind 的配置create-next-app已经生成你只需要在src/app/globals.css里保留tailwind base; tailwind components; tailwind utilities;三行即可不需要额外改动。4. 页面渲染与 SEO 元信息generateMetadata 实战SEO 友好的核心在于每个页面都有独立的 title、description、canonical 和 Open Graph。App Router 里用generateMetadata动态生成。先写一个服务端工具函数调用 TaoToken 生成描述// src/lib/seo.ts import OpenAI from openai; import { aiConfig } from /config/site; const client new OpenAI({ apiKey: aiConfig.apiKey, baseURL: aiConfig.baseURL, }); export async function generateSeoDescription(topic: string) { const res await client.chat.completions.create({ model: aiConfig.model, max_tokens: aiConfig.maxTokens, messages: [ { role: system, content: 你是 SEO 文案助手输出 120 字以内中文描述不要换行。, }, { role: user, content: 主题${topic} }, ], }); return res.choices[0]?.message?.content?.trim() ?? ; }然后在页面里使用。以博客详情页src/app/blog/[slug]/page.tsx为例// src/app/blog/[slug]/page.tsx import type { Metadata } from next; import { siteConfig } from /config/site; import { generateSeoDescription } from /lib/seo; type Props { params: { slug: string } }; export async function generateMetadata({ params }: Props): PromiseMetadata { const title 建站笔记${params.slug}; const description await generateSeoDescription(title); return { title, description, keywords: siteConfig.keywords, alternates: { canonical: ${siteConfig.url}/blog/${params.slug} }, openGraph: { title, description, url: ${siteConfig.url}/blog/${params.slug}, type: article, locale: zh_CN, }, }; } export default function BlogPost({ params }: Props) { return ( article classNamemx-auto max-w-3xl px-4 py-12 h1 classNametext-3xl font-bold tracking-tight{params.slug}/h1 p classNamemt-4 text-gray-600正文内容占位。/p /article ); }根布局src/app/layout.tsx里设置默认元信息和metadataBase避免 canonical 出现相对路径警告// src/app/layout.tsx import type { Metadata } from next; import { siteConfig } from /config/site; import ./globals.css; export const metadata: Metadata { metadataBase: new URL(siteConfig.url), title: { default: siteConfig.name, template: %s | 我的 SEO 站点, }, description: siteConfig.description, }; export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( html langzh-CN body classNameantialiased{children}/body /html ); }再补上src/app/sitemap.ts和src/app/robots.tsNext.js 会自动生成/sitemap.xml和/robots.txt// src/app/sitemap.ts import type { MetadataRoute } from next; import { siteConfig } from /config/site; export default function sitemap(): MetadataRoute.Sitemap { return [ { url: siteConfig.url, lastModified: new Date(), priority: 1 }, { url: ${siteConfig.url}/blog/hello, lastModified: new Date() }, ]; }// src/app/robots.ts import type { MetadataRoute } from next; import { siteConfig } from /config/site; export default function robots(): MetadataRoute.Robots { return { rules: { userAgent: *, allow: /, disallow: /api/ }, sitemap: ${siteConfig.url}/sitemap.xml, }; }5. 验证请求与成功结果本地启动到元信息校验配置写完后按顺序做四步验证每一步都有明确的成功标志。第一步启动本地服务npm run dev终端出现ready - started server on 0.0.0.0:3000即成功。打开http://localhost:3000页面正常渲染Tailwind 样式生效标题加粗、间距正常。第二步验证模型调用。单独写一个测试脚本scripts/test-ai.mjsimport OpenAI from openai; import dotenv/config; const client new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: process.env.TAOTOKEN_BASE_URL, }); const res await client.chat.completions.create({ model: gpt-4o-mini, messages: [{ role: user, content: 用一句话说明 Next.js 的 SEO 优势 }], }); console.log(res.choices[0].message.content);运行node scripts/test-ai.mjs终端打印出一句中文说明说明 Key、baseURL、模型名三者都对。第三步验证页面元信息。访问http://localhost:3000/blog/hello右键查看网页源代码确认title是「建站笔记hello | 我的 SEO 站点」meta namedescription有内容link relcanonical指向完整 URL。如果 description 为空说明generateSeoDescription抛错被吞掉了回到终端看服务端日志。第四步验证 sitemap 和 robots。浏览器打开http://localhost:3000/sitemap.xml应看到 XML 格式的 URL 列表打开http://localhost:3000/robots.txt应看到Allow: /和Sitemap:行。这两项通过搜索引擎抓取的基础就齐了。验证项访问地址成功标志本地渲染localhost:3000页面样式正常模型调用脚本输出打印中文句子元信息/blog/hello 源码title/description/canonical 齐全抓取文件/sitemap.xml、/robots.txtXML 与规则文本正常6. 本篇常见错排查报错一401 Unauthorized或invalid api key。多数是.env.local没被读取。Next.js 只自动加载.env.local脚本里要额外装dotenv并import dotenv/config。另外确认 Key 前后没有空格复制时容易带上换行。报错二metadataBase警告canonical 变成相对路径。在根布局的metadata里补上metadataBase: new URL(siteConfig.url)siteConfig.url必须是带https://的完整域名不能写localhost。报错三generateMetadata里调用模型导致页面变慢或超时。元信息生成是阻塞的模型响应慢会拖慢首屏。建议给OpenAI客户端加timeout并在generateSeoDescription里用try/catch兜底失败时返回siteConfig.description保证页面永远有描述。报错四settings.json读取失败next.config.mjs启动报错。确认 JSON 没有尾随逗号路径是相对项目根目录。如果部署到 Vercelsettings.json要一起提交不能放进.gitignore。报错五sitemap 里 URL 重复或缺失。sitemap.ts返回的是静态数组动态路由需要自己遍历数据源生成。如果站点文章多建议从 CMS 或数据库读取 slug 列表再 map。报错六Tailwind 样式不生效。检查tailwind.config.ts的content字段是否包含./src/**/*.{ts,tsx}App Router 的src目录结构容易漏配。排障过程中如果怀疑是 Key 或接入方式的问题直接去 API Keys 页面重新生成一把对比测试地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入参数以文档为准 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。7. 下一步把统一通道用在更多建站环节骨架跑通后TaoToken 这把 Key 还能继续复用在几个建站高频场景文章发布时自动生成摘要和标签、站内搜索的语义改写、客服问答机器人、多语言站点的翻译初稿。它们的共同点是都走同一个baseURL和同一把 Key你只需要在settings.json的ai字段里调整defaultModel不用改业务代码。如果你打算把 AI 能力做成站点的长期模块比如自动内容流水线或 Agent 式的内容助手可以看下 Coding Plan 的额度与用法 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 想先在网页里试不同模型对 SEO 文案的效果用模型对话页面最快 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。一个实用技巧把generateSeoDescription的结果缓存到数据库或unstable_cache同一篇文章不要每次请求都调模型既省额度又让页面更快。上线前记得把siteConfig.url换成真实域名再去 Google Search Console 提交sitemap.xml收录速度会明显快于等爬虫自己发现。
返回列表