跳到主要内容

主题路由(Next.js App Router)

ReactPress 官方主题基于 Next.js App Router(非 Pages Router)。主题通过动态段 [slug] 映射 CMS 内容。

官方 starter 路由表

路径文件内容类型
/app/page.tsx首页 / 文章列表
/post/[slug]app/post/[slug]/page.tsx文章详情
/page/[slug]app/page/[slug]/page.tsx静态页面
/category/[slug]app/category/[slug]/page.tsx分类归档
/tag/[slug]app/tag/[slug]/page.tsx标签归档
/searchapp/search/page.tsx站内搜索

slug 来自 Admin 中为文章 / 页面设置的别名,API 返回对应字段。

文章详情示例

// app/post/[slug]/page.tsx
import { notFound } from 'next/navigation';
import { getArticleBySlug } from '@/lib/api';

export default async function PostPage({
params,
}: {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
const article = await getArticleBySlug(slug);
if (!article) notFound();
return <ArticleLayout article={article} />;
}

SEO:generateMetadata

export async function generateMetadata({
params,
}: {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
const article = await getArticleBySlug(slug);
if (!article) return {};
return {
title: article.metaTitle ?? article.title,
description: article.metaDescription ?? article.summary,
openGraph: {
title: article.metaTitle ?? article.title,
images: article.cover ? [{ url: article.cover }] : [],
},
};
}

配合 SEO 插件站点设置

可选:Catch-all 路由

知识库等多层级路径可使用 [...segments]

// app/knowledge/[...slug]/page.tsx
export default async function KnowledgePage({
params,
}: {
params: Promise<{ slug: string[] }>;
}) {
const { slug } = await params;
const path = slug.join('/');
// fetch by path…
}

数据获取

主题内统一通过 Toolkit 请求 API,勿直连数据库。见 主题开发

延伸阅读