前言
在这篇文章中,我将分享如何使用 Next.js 14 构建一个现代化的博客系统。这个系统具有以下特点:
- 🚀 性能优异:基于 Next.js 的静态生成和服务端渲染
- 📝 Markdown 支持:使用 Markdown 编写文章,专注内容创作
- 🎨 现代设计:采用 Tailwind CSS,响应式设计
- 🔍 SEO 友好:自动生成元数据,搜索引擎优化
技术栈选择
Next.js 14 (App Router)
Next.js 是 React 的生产级框架,提供了:
// 静态生成示例
export async function generateStaticParams() {
const posts = getAllPostSlugs()
return posts.map((post) => ({
slug: post.slug,
}))
}
TypeScript
TypeScript 为项目提供了类型安全:
interface PostMetadata {
slug: string
title: string
date: string
tags: string[]
summary: string
}
Tailwind CSS
Tailwind CSS 让样式开发更加高效:
@layer components {
.article-card {
@apply bg-white border border-gray-200 rounded-lg p-6
hover:shadow-lg transition-all duration-300;
}
}
核心功能实现
1. Markdown 文件处理
使用 gray-matter 解析 frontmatter:
import matter from 'gray-matter'
export function getSortedPostsData(): PostMetadata[] {
const fileNames = fs.readdirSync(postsDirectory)
const allPostsData = fileNames.map((fileName) => {
const slug = fileName.replace(/\.md$/, '')
const fullPath = path.join(postsDirectory, fileName)
const fileContents = fs.readFileSync(fullPath, 'utf8')
const matterResult = matter(fileContents)
return {
slug,
...matterResult.data,
} as PostMetadata
})
return allPostsData.sort((a, b) => a.date < b.date ? 1 : -1)
}
2. 动态路由生成
Next.js App Router 的动态路由:
// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
const posts = getAllPostSlugs()
return posts.map((post) => ({ slug: post.slug }))
}
export default async function PostPage({ params }: { params: { slug: string } }) {
const postData = await getPostData(params.slug)
return (
<article className="prose-enhanced">
<div dangerouslySetInnerHTML={{ __html: postData.contentHtml }} />
</article>
)
}
3. SEO 优化
自动生成页面元数据:
export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
const postData = await getPostData(params.slug)
return {
title: postData.title,
description: postData.summary,
openGraph: {
title: postData.title,
description: postData.summary,
type: 'article',
},
}
}
部署和优化
Vercel 部署
- 将代码推送到 GitHub
- 在 Vercel 中导入项目
- 自动部署完成
性能优化
- 静态生成:构建时生成所有页面
- 图片优化:使用 Next.js Image 组件
- 代码分割:自动按路由分割代码
- 缓存策略:合理设置缓存头
总结
通过这个博客系统,我们实现了:
- ✅ 基于文件系统的内容管理
- ✅ 现代化的用户界面
- ✅ 优秀的性能表现
- ✅ SEO 友好的结构
这个系统不仅适合个人博客,也可以扩展为企业级的内容管理系统。
代码即文档,文档即代码。好的技术博客不仅要有优质的内容,更要有优雅的实现。