一个基于 Next.js 15 构建的现代化博客平台,支持 GitHub 仓库同步、交互式 Python 代码执行、MDX 内容渲染等功能。
- 📚 GitHub 同步: 自动从 GitHub 仓库 (Rain1601/rain.blog.repo) 同步博客内容
- 📝 MDX 支持: 使用 MDX 格式编写博客,支持 React 组件嵌入
- 🏷️ YAML Front Matter: 支持文章元数据解析(标题、日期、标签、分类等)
- 🔍 全文搜索: 实时搜索文章标题和内容
- 📅 时间线视图: 按年份和月份筛选文章
- 🎨 统一字体系统: 英文使用 Times New Roman,中文使用宋体
- 📑 固定目录导航: 右侧固定目录,支持 1-3 级标题跳转和高亮
- 🎯 动态导航栏: 主页滚动时自动切换导航链接和搜索框
- 🌐 多语言支持: 中英文界面切换
- 📱 响应式设计: 完美适配桌面和移动设备
- 🚀 交互式 Python: 基于 Pyodide 在浏览器中运行 Python 代码
- ⚡ 性能优化: 静态生成、代码分割、懒加载
- 🔧 TypeScript: 完整的类型定义和开发体验
- 🎯 错误边界: 优雅的错误处理和降级
- 框架: Next.js 15 (App Router)
- 样式: CSS Modules + 自定义主题系统
- 语言: TypeScript
- Python 运行时: Pyodide (WebAssembly)
- 代码编辑器: Monaco Editor
- 内容格式: Markdown / MDX
- 数据源: GitHub API
- 部署: Vercel / Netlify
- NumPy - 科学计算
- Pandas - 数据分析
- Matplotlib - 数据可视化
- SciPy - 科学计算工具
- SymPy - 符号数学
- Micropip - 动态安装其他包
- Node.js 18.x 或更高版本
- npm 或 yarn
# 克隆项目
git clone https://github.com/Rain1601/rain.blog.git
cd rain.blog
# 安装依赖
npm install
# 启动开发服务器 (端口 3001)
npm run dev
# 构建项目
npm run build
# 启动生产服务器
npm start访问 http://localhost:3001 查看应用。
rain.blog/
├── src/
│ ├── app/ # Next.js App Router 页面
│ │ ├── blog/[id]/ # GitHub 博客详情页
│ │ ├── posts/[slug]/ # MDX 文章页面
│ │ ├── about/ # 关于页面
│ │ ├── layout.tsx # 根布局
│ │ ├── page.tsx # 主页(博客列表)
│ │ ├── page.module.css # 主页样式
│ │ └── globals.css # 全局样式
│ ├── components/ # React 组件
│ │ ├── Layout.tsx # 导航布局组件
│ │ ├── TableOfContents.tsx # 文章目录组件
│ │ ├── MarkdownRenderer.tsx # Markdown 渲染器
│ │ ├── InteractiveCodeBlock.tsx # 交互式代码块
│ │ ├── CodeEditor.tsx # Monaco 编辑器
│ │ └── ErrorBoundary.tsx # 错误边界
│ ├── utils/ # 工具函数
│ │ ├── github.ts # GitHub API 集成
│ │ ├── api.ts # API 路由处理
│ │ ├── pyodide.ts # Pyodide 管理
│ │ └── mdx.ts # MDX 处理
│ └── content/blog/ # 本地博客内容
│ ├── posts/ # MDX 文章
│ └── config.ts # 博客配置
├── public/ # 静态资源
├── mdx-components.tsx # MDX 组件映射
├── next.config.ts # Next.js 配置
└── CLAUDE.md # AI 助手指南
文章将自动从 Rain1601/rain.blog.repo 仓库同步,支持以下结构:
posts/年份/月份/文件名.md- 支持 YAML Front Matter 元数据
在 src/content/blog/posts/ 创建 .mdx 文件:
---
title: "文章标题"
date: "2024-01-20"
tags: ["Python", "教程"]
categories: ["技术"]
author: "Rain"
summary: "文章摘要"
---
# 文章内容
这里是正文...在 MDX 文件中使用 InteractiveCodeBlock 组件:
import { InteractiveCodeBlock } from '@/components/InteractiveCodeBlock';
<InteractiveCodeBlock
code={`print("Hello, Python!")
x = 10
y = 20
print(f"x + y = {x + y}")`}
title="Python基础示例"
description="这是一个基本的Python代码示例"
height={300}
/>code: 默认代码内容height: 编辑器高度(默认300px)title: 代码块标题description: 代码块描述readOnly: 是否只读(默认false)enableClear: 是否启用清空环境按钮(默认true)enableReset: 是否启用重置代码按钮(默认true)
# 创建新文章
npm run new-post
# 转换 MD 为 MDX
npm run md-to-mdx <file>
# 批量转换
npm run batch-md-to-mdx
# 代码检查
npm run lint
# 类型检查
npm run type-check- 连接GitHub仓库到Vercel
- 配置项目设置:
- Framework: Next.js
- Build Command:
npm run build - Output Directory:
.next
- 部署
详细部署说明请查看 DEPLOYMENT.md
项目不需要额外的环境变量配置。
在 src/utils/github.ts 中配置仓库信息:
const GITHUB_OWNER = 'Rain1601';
const GITHUB_REPO = 'rain.blog.repo';在 src/utils/pyodide.ts 中的 loadPyodide 函数中添加包:
await pyodide.loadPackage(['numpy', 'pandas', 'matplotlib', 'new-package']);项目使用 CSS 变量系统,在 src/app/globals.css 中修改:
:root {
--text-primary: #1a1a1a;
--accent-primary: #d97149;
--bg-primary: #faf8f4;
/* 更多变量... */
}在 mdx-components.tsx 中添加组件映射:
export function useMDXComponents(components: MDXComponents): MDXComponents {
return {
// 现有组件...
CustomComponent: ({ children }) => (
<div className="custom-component">{children}</div>
),
...components,
};
}-
GitHub API 限制
- API 速率限制:60 次/小时(未认证)
- 解决方案:添加 GitHub Token 或使用缓存
-
Pyodide 加载失败
- 检查网络连接
- 确保浏览器支持 WebAssembly
- 清除浏览器缓存
-
目录导航不工作
- 确保标题有正确的 ID
- 检查 Intersection Observer 兼容性
-
字体显示异常
- 确保系统安装了宋体字体
- 检查 CSS 字体声明顺序
-
Pyodide优化
- 使用懒加载
- 缓存Pyodide实例
- 按需加载Python包
-
构建优化
- 启用Next.js静态生成
- 使用代码分割
- 优化图片和静态资源
主页滚动时,导航链接自动切换为搜索框,优化屏幕空间利用。
文章右侧固定目录,自动生成、滚动高亮、点击跳转。
每 5 分钟自动同步 GitHub 仓库内容,保持博客实时更新。
MIT License
- Fork 项目
- 创建功能分支 (
git checkout -b feature/amazing) - 提交更改 (
git commit -m 'feat: 添加新功能') - 推送分支 (
git push origin feature/amazing) - 创建 Pull Request
- GitHub: @Rain1601
- 博客仓库: rain.blog.repo
- Issues: 提交问题
Built with ❤️ by Rain | Powered by Next.js & Pyodide