基于 Next.js 15 + React 19 + NestJS 10 + MongoDB 的个人站点 monorepo,包含前端应用、后端 API、组件库、共享 hooks 与类型配置。内容通过 NestJS 后端聚合 GitHub Issues(博客)与 GitHub Repos(项目)。
- GitHub Issues 作为 CMS:通过 NestJS 后端聚合 Issues 与 Repos,前端调用统一 API。
- App Router + ISR:页面数据采用
fetch+revalidate,兼顾性能与新鲜度。 - OpenAPI/Swagger:后端挂载
/v2/docs,接口契约清晰可追溯。 - 统一组件与主题:
@wuh.site/components提供 UI 组件和主题变量体系。 - 错误与加载体验:提供 Result 组件与骨架屏,提升 404/500 与页面切换体验。
.
├── packages
│ ├── wuh.site.next # 前端 (Next.js 15 App Router)
│ ├── wuh.site.nest # 后端 (NestJS 10 + Mongoose 8)
│ ├── components # 组件库(@wuh.site/components)
│ ├── hooks # 共享 hooks
│ ├── config # 类型/配置包(@wuh.site/config)
│ ├── shared-contracts # 前后端共享 DTO 类型
│ └── docs # 文档预留
├── openspec # OpenSpec 规格与变更记录
└── README.md
- Next.js 15(App Router)
- React 19
- NestJS 10
- MongoDB (Mongoose 8)
- TypeScript 5
- styled-components 6
- pnpm workspace(lockfile v9)
- Husky + Commitlint
- Node.js
>= 20 - pnpm
>= 9
pnpm install
pnpm dev:next默认访问:http://localhost:3000
# 前端 (port 3000)
pnpm dev:next # 启动 Next.js 开发服务器
pnpm build:next # 构建 Next.js
pnpm start:next # 生产启动 Next.js
# 后端 (port 3200)
pnpm dev:nest # 启动 NestJS 开发服务器 (watch 模式)
pnpm build:nest # 构建 NestJS
pnpm start:nest # 生产启动 NestJS
pnpm sync:init # GitHub Issues 全量同步到 MongoDB
# 全局
pnpm exec tsc --noEmit # TypeScript 类型检查根目录
dev:web、build:web、dev:astro等脚本属于历史遗留,不推荐使用。
/:首页(展示 GitHub 仓库与精选博客)/blog:博客列表(Issues 分页、按创建时间倒序)/post/[number]:博客详情(Issues 单篇 + GitHub Markdown 渲染)/about:关于页/design/system-color:色彩系统展示页not-found/error:全局 404/500 处理
- 前端通过 Next.js rewrite 代理到 NestJS 后端(
/api/*→localhost:3200/v2/*) - 后端聚合 GitHub API(Repos、Issues),5 分钟内存缓存 + stale fallback
- 所有请求使用
fetch+revalidate,避免频繁请求
API 文档:启动后端后访问
http://localhost:3200/v2/docs查看 Swagger UI。
import Button from '@wuh.site/components/button'
export default function Demo() {
return <Button variant='filled'>Hello</Button>
}常用组件:
Result:404/500 引导页组件Skeleton:骨架屏加载组件Button/Card/Tag/Empty等基础 UI
更多组件可查看 packages/components/*/readme.md。
详细的开发流程、OpenSpec 工作流、目录结构说明和提交规范见 CONTRIBUTING.md。
ISC