From 5efcaaae9f7cfaf64aab87837b4a3abc403575bf Mon Sep 17 00:00:00 2001 From: Kaxi <1042864399@qq.com> Date: Thu, 23 Jul 2026 21:35:37 +0800 Subject: [PATCH] feat: add article about architecture evolution from static to front-back separation - cover image from hello-world --- content/posts/sublog-evolution/img/cover.jpg | Bin 0 -> 16922 bytes content/posts/sublog-evolution/img/cover.svg | 46 ++++++ content/posts/sublog-evolution/index.md | 159 +++++++++++++++++++ 3 files changed, 205 insertions(+) create mode 100644 content/posts/sublog-evolution/img/cover.jpg create mode 100644 content/posts/sublog-evolution/img/cover.svg create mode 100644 content/posts/sublog-evolution/index.md diff --git a/content/posts/sublog-evolution/img/cover.jpg b/content/posts/sublog-evolution/img/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b40d7431b9d088caa7be931450436adfb728a2d GIT binary patch literal 16922 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 literal 0 HcmV?d00001 diff --git a/content/posts/sublog-evolution/img/cover.svg b/content/posts/sublog-evolution/img/cover.svg new file mode 100644 index 0000000..67a52be --- /dev/null +++ b/content/posts/sublog-evolution/img/cover.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + 尼克的小窝 + + + 架构变迁 + + + + + 从纯静态到前后端分离 + + + + + Nuxt → React + Go + + + + 静态 + Monolith + + + 分离 + Front-end + Back-end + + + + diff --git a/content/posts/sublog-evolution/index.md b/content/posts/sublog-evolution/index.md new file mode 100644 index 0000000..a687a0f --- /dev/null +++ b/content/posts/sublog-evolution/index.md @@ -0,0 +1,159 @@ +--- +title: 尼克的小窝 架构变迁:从纯静态到前后端分离 +published: 2026-07-23T12:00:00 +updated: 2026-07-23 +description: 记录尼克的小窝从 Nuxt 3 纯静态博客演进到 React + Go 前后端分离架构的全过程,包括架构设计的思考、技术选型的变化,以及新增的账号注册功能。 +image: /posts/sublog-evolution/img/cover.jpg +tags: ['架构', 'React', 'Next.js', 'Go'] +draft: false +series: 尼克的小窝 开发记录 +seriesOrder: 1 +difficulty: 入门 +--- + +## 📝 写在前面 + +SuBlog 最初只是一个简单的技术博客——Nuxt 3 静态生成,Markdown 写文章,部署到静态托管完事。但随着功能需求的增长,纯静态的架构开始显露出局限性。 + +这篇文章记录从 **纯静态** 到 **前后端分离** 的演进过程,带你了解每一步背后的思考。 + +## 📦 第一代:纯静态(Nuxt 3 + @nuxt/content) + +### 🏗️ 架构图 + +```text +┌─────────────────────────────────────┐ +│ 静态托管 (Nginx/Vercel) │ +│ │ +│ ┌───────────────────────────────┐ │ +│ │ Nuxt 3 SSG 产物 │ │ +│ │ │ │ +│ │ pages/ + content/ + public/ │ │ +│ └───────────────────────────────┘ │ +│ │ +│ Giscus (GitHub Discussions 评论) │ +└─────────────────────────────────────┘ +``` + +### 🔧 做了什么 + +- **Nuxt 3** + **TypeScript** + **Tailwind CSS v4** 搭建前端 +- **@nuxt/content** 管理 Markdown 文章,编译时生成静态页面 +- **Giscus** 嵌入评论,依赖 GitHub Discussions +- 部署通过 `nuxt generate` 输出 `.output/public`,丢到 Nginx 或 Vercel + +### ✅ 优点 + +- 部署极简,一个 `nuxt generate` 搞定 +- 加载飞快,全是 HTML,没有服务端开销 +- 无需后端,零运维成本 + +### ❌ 局限 + +随着时间的推移,纯静态的问题越来越明显: + +| 问题 | 具体表现 | +|------|----------| +| 🐢 **内容更新慢** | 改一篇文章要重新构建、重新部署,不能实时发布 | +| 👤 **没有用户体系** | 无法区分读者和管理员,所有内容对所有人一致可见 | +| 🔒 **评论受限** | Giscus 需要 GitHub 账号才能评论,门槛高 | +| 🚫 **无法做动态功能** | 点赞、收藏、阅读统计、个性化推荐……统统做不了 | +| 🔗 **前端锁死** | 被 Nuxt/Vue 生态绑定,想换技术栈得重写 | + +## ⚡ 第二代:前后端分离(React + Go) + +### 🏗️ 架构图 + +```text +┌───────────────────────┐ ┌────────────────────┐ +│ 静态托管 (Vercel) │ │ Go 服务端 │ +│ │ │ │ +│ ┌─────────────────┐ │ │ ┌──────────────┐ │ +│ │ sublog-react │ │ API │ │ HTTP API │ │ +│ │ (Next.js SSG) │──┼───────┼─>│ │ │ +│ │ │ │ │ │ 文章 / 用户 │ │ +│ │ 首页 / 文章 / │ │ │ └──────────────┘ │ +│ │ 用户中心 │ │ │ │ +│ └─────────────────┘ │ │ ┌──────────────┐ │ +│ │ │ │ 数据库 │ │ +└───────────────────────┘ │ └──────────────┘ │ + └────────────────────┘ +``` + +### 🖥️ 前端:sublog-react + +选用 **Next.js**(App Router) + **React 19**,理由是: + +- 🎨 **React 生态**——组件库成熟,开发效率高 +- 📐 **App Router**——支持布局嵌套,页面组织清晰 +- 📦 **静态导出**——仍可部署到静态托管 +- ⚙️ **运行时配置**——API 地址可动态注入,切换环境无需重新构建 + +前端不再直接读取 Markdown 文件,而是通过 HTTP API 获取文章数据。静态导出 + 客户端数据获取的组合,既保留了首屏加载速度,又实现了内容的动态更新。 + +### ⚙️ 后端:sublog-s + +后端使用 **Go** + **Gin**,按业务逻辑分层组织代码。 + +核心技术选型: + +| 技术 | 用途 | +|------|------| +| 🚀 **Gin** | HTTP 框架 | +| 🗄️ **GORM** | ORM,数据库操作 | +| 🔐 **JWT** | 用户认证 | + +## 📊 前后对比 + +| 维度 | 第一代(纯静态) | 第二代(前后端分离) | +|------|-----------------|---------------------| +| 🎨 **前端框架** | Nuxt 3 (Vue) | Next.js (React 19) | +| 🖥️ **后端** | 无 | Go + Gin | +| 📄 **内容来源** | Markdown 文件 | API 数据库 | +| 🚀 **发布方式** | 全量重新构建 | API 实时发布 | +| 👤 **用户系统** | ❌ 无 | ✅ 注册/登录 | +| 💬 **评论** | Giscus(需 GitHub) | 自有评论系统(规划中) | +| 📦 **部署** | 1 个静态目录 | 前端静态 + 后端二进制 | +| ⚡ **更新体验** | 改文章 → 构建 → 部署 | 改文章 → 立即生效 | + +## 🎉 新功能:注册账号 + +伴随着架构升级,**用户账号系统**也上线了。 + +### 📋 目前支持 + +现在你可以在尼克的小窝 **注册一个账号**: + +``` +1. ✏️ 填写用户名、邮箱、密码 +2. 📧 查收激活邮件 +3. 🔗 点击链接激活账号 +4. 🚪 登录后查看和管理个人信息 +``` + +## 🗓️ 后续计划 + +正在开发或规划中的功能: + +- [x] 用户注册/登录(已上线 🎉) +- [x] 个人资料编辑(已上线 🎉) +- [ ] 💬 站内评论系统 +- [ ] 🔖 文章收藏 +- [ ] 📚 阅读历史 +- [ ] 👍 文章点赞 +- [ ] 🔔 关注通知 +- [ ] 🎨 个人首页定制 + +## 💡 结语 + +从 Nuxt 3 纯静态到 React + Go 前后端分离,SuBlog 的架构变迁本质上是一个**功能驱动**的过程。静态博客有它的位置——写写文章、展示内容完全够用。但当你想做的不仅仅是"展示"时,后端的能力就不可或缺了。 + +这次重构最大的感触是:**架构选型不是越复杂越好,而是刚好够用最好**。纯静态阶段用 Nuxt 3 一点问题没有,直到功能需求超出了静态的边界,才自然推动到前后端分离。 + +如果你也在纠结"要不要上后端",不妨先问问自己:**你要做的是"展示内容"还是"提供服务"?** + +前者,静态就够了;后者,来吧,后端欢迎你。😄 + +--- + +**🎉 目前注册功能已经可以用了,后续更多好玩的功能正在路上。部分功能可能需要登录才能体验,快注册一个账号吧!**