简介
在本文中,我将详细介绍如何使用我开源的 Next.js Portfolio 项目来快速搭建一个功能完整的个人博客系统。这个项目不仅包含了现代化的博客功能,还具备了作品集展示、响应式设计、暗黑模式等特性。
🎯 项目特性
- 基于 Next.js 15: 使用最新的 Next.js App Router 架构
- Tailwind CSS 4.0: 利用最新版本的 Tailwind CSS 进行样式设计
- MDX 支持: 使用 MDX 编写博客内容,支持 JSX 和 Markdown 混合
- Velite 静态生成: 使用 Velite 作为静态内容生成器
- 响应式设计: 移动端友好的响应式布局
- 暗黑模式: 支持自动和手动切换的暗黑主题
- SEO 优化: 包含 Open Graph 和 Meta 标签优化
🚀 快速开始
1. 克隆项目
首先,克隆项目到本地:
git clone https://github.com/codexlin/next-portfolio.git
cd next-portfolio
2. 安装依赖
项目使用 pnpm 作为包管理器:
pnpm install
3. 启动开发服务器
pnpm dev
访问 http://localhost:5001
查看你的博客系统。
📝 添加博客文章
1. 创建 MDX 文件
在 src/app/blog/
目录下创建一个新的 .mdx
文件,例如 my-first-post.mdx
:
---
title: "我的第一篇博客"
description: "这是我的第一篇博客文章"
author: Your Name
date: '2025-08-28T12:00:00.000Z'
updated: '2025-08-28T12:00:00.000Z'
---
# 欢迎阅读我的博客
这是我的第一篇博客文章内容。
## 二级标题
一些示例内容...
### 三级标题
更多内容...
2. 前置元数据说明
每个博客文章都需要包含以下前置元数据:
title
: 文章标题description
: 文章描述author
: 作者名称date
: 创建日期updated
: 更新日期(可选)
3. 内容编写
使用标准的 Markdown 语法编写文章内容。项目还支持一些自定义组件:
##
标题会自动应用样式- 普通段落会自动添加间距和字体大小
- 列表会自动添加缩进
- 可以使用
<Image />
组件来插入优化过的图片
🎨 自定义主题和样式
1. 修改全局样式
在 src/app/globals.css
中可以修改全局样式变量:
:root {
--background: 0 0% 100%;
--foreground: 240 10% 3.9%;
/* 更多样式变量... */
}
.dark {
--background: 240 10% 3.9%;
--foreground: 0 0% 98%;
/* 更多样式变量... */
}
2. 添加自定义组件
在 src/components/mdx.tsx
中可以添加自定义的 MDX 组件:
const components = {
// 现有组件...
// 添加你的自定义组件
CustomComponent: ({ ...props }) => (
<div className="custom-class" {...props} />
),
}
🌙 暗黑模式配置
项目使用 next-themes
库来管理主题。默认支持三种模式:
light
: 明亮模式dark
: 暗黑模式system
: 跟随系统设置
可以通过修改 src/components/theme-provider.tsx
来配置默认主题:
export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
return (
<NextThemesProvider
attribute="class"
defaultTheme="dark" // 修改默认主题
disableTransitionOnChange
enableSystem
{...props}
>
{children}
</NextThemesProvider>
)
}
🚀 部署
Vercel 部署(推荐)
- 将项目推送到 GitHub
- 登录 Vercel 并导入项目
- Vercel 会自动检测 Next.js 项目并配置部署设置
- 点击部署即可
其他平台
也可以部署到其他支持 Next.js 的平台,如 Netlify、Railway 等。
🛠️ 高级配置
1. 修改 Velite 配置
在 velite.config.ts
中可以修改博客的配置:
const blogs = defineCollection({
name: "Blog",
pattern: "**/*.mdx",
schema: s
.object({
// 修改或添加字段
title: s.string(),
description: s.string().optional(),
// ...
})
// 修改 transform 函数来自定义生成的字段
})
2. 自定义页面
在 src/app/
目录下可以添加新的页面。例如创建 src/app/about/page.tsx
来添加关于页面。
📈 SEO 优化
项目已经为 SEO 做了基础优化:
- 自动生成 Open Graph 图片
- 每个页面都有适当的 meta 标签
- 结构化数据支持
可以在 src/app/layout.tsx
中修改全局的 SEO 设置:
export const metadata: Metadata = {
metadataBase: new URL("https://yourdomain.com"),
title: "Your Name",
description: "Your description",
// ...
}
🧪 测试和优化
1. 代码格式化
项目使用 Biome 进行代码格式化:
pnpm format
2. 代码检查
pnpm lint
💻 代码示例
让我们看一些实际的代码示例,展示我们博客系统的功能:
React 组件示例
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>计数器: {count}</p>
<button onClick={() => setCount(count + 1)}>
增加
</button>
</div>
);
}
export default Counter;
TypeScript 接口示例
interface User {
id: number;
name: string;
email: string;
isActive: boolean;
}
function UserProfile({ user }: { user: User }) {
return (
<div>
<h2>{user.name}</h2>
<p>Email: {user.email}</p>
<p>Status: {user.isActive ? 'Active' : 'Inactive'}</p>
</div>
);
}
CSS 样式示例
.card {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
padding: 20px;
transition: transform 0.3s ease;
}
.card:hover {
transform: translateY(-5px);
}
Python 代码示例
def fibonacci(n):
"""生成斐波那契数列的前n个数字"""
if n <= 0:
return []
elif n == 1:
return [0]
elif n == 2:
return [0, 1]
sequence = [0, 1]
for i in range(2, n):
sequence.append(sequence[i-1] + sequence[i-2])
return sequence
# 使用示例
print(fibonacci(10)) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
SQL 查询示例
SELECT
u.id,
u.name,
u.email,
COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
WHERE u.created_at >= '2024-01-01'
GROUP BY u.id, u.name, u.email
ORDER BY post_count DESC
LIMIT 10;
📚 总结
通过这个项目,你可以快速搭建一个功能完整的博客系统,而无需从零开始配置。项目集成了现代 Web 开发的最佳实践,包括:
- 最新的 Next.js 特性
- Tailwind CSS 4.0 的强大功能
- MDX 的灵活内容创作
- 响应式设计和暗黑模式
- SEO 优化和性能优化
希望这篇教程能帮助你快速上手并创建属于自己的博客系统!如果你有任何问题或建议,欢迎在 GitHub 上提交 issue 或 PR。