从页面到系统:前后端架构的演进地图
用一张全景图串起前端、后端、数据、部署和可观测性,理解现代 Web 系统为什么会演进成今天的样子,以及真实项目该怎么选型落地。
很多人学前端或后端时,都是从某个工具开始的:React、Vue、Node、Spring、Django、PostgreSQL、Redis、Docker。工具当然重要,但如果只记工具,很容易陷入一种焦虑:每年都有新框架,每个团队都有新架构,好像永远追不上。
更稳的理解方式,是先看系统为什么演进。
前后端架构的每一次变化,基本都在回答同一组问题:
- 用户怎样更快看到页面。
- 交互逻辑应该放在浏览器、服务器,还是构建阶段。
- 业务规则应该集中在哪里。
- 数据怎样被读取、缓存、变更和追踪。
- 系统怎样部署、回滚、观测和扩容。
- 团队怎样在复杂度上升后还能协作。
这篇文章不是框架排行榜,而是一张地图。读完后,你应该能知道一个真实项目从选型到上线时,前端、后端和 DevOps 各自负责什么,边界在哪里,什么时候应该简单,什么时候才需要复杂。
先看一张系统地图
一个常见 Web 系统可以先拆成这几层:
用户 / 浏览器
|
v
前端应用
- 页面结构
- 路由
- 状态
- 表单和交互
- 性能体验
|
v
接口层
- REST / GraphQL / RPC
- 鉴权
- 参数校验
- 错误约定
|
v
后端服务
- 业务规则
- 事务
- 权限
- 异步任务
- 外部系统集成
|
v
数据与基础设施
- 数据库
- 缓存
- 对象存储
- 队列
- 日志 / 指标 / 链路追踪
这张图的重点不是层数,而是职责。
前端不是“写页面的地方”,它负责把产品状态变成可理解、可操作、可反馈的体验。后端不是“查数据库的地方”,它负责把业务规则变成可验证、可扩展、可运维的系统。DevOps 也不是“上线时才想起的脚本”,它负责让开发、测试、部署、回滚和观测成为重复动作。
架构是怎样演进的
第一阶段:服务器直接渲染页面
早期 Web 应用通常由后端模板直接生成 HTML。用户请求一个 URL,服务器查数据、套模板、返回页面。
它的好处很清楚:
- 首屏简单可靠。
- SEO 友好。
- 前后端边界少。
- 小团队能快速交付。
它的问题也明显:页面交互一多,模板、脚本、接口和业务逻辑会挤在一起。后端发布频率会限制前端迭代,复杂 UI 很难维护。
第二阶段:前后端分离和 SPA
前端框架兴起后,浏览器里开始承载更多状态和路由。后端提供 API,前端通过 API 拉数据、渲染页面、处理交互。
这解决了很多协作问题:
- 前端可以独立构建复杂交互。
- 后端可以专注 API 和业务规则。
- 移动端、小程序、第三方客户端能复用接口。
- 团队边界更清楚。
但 SPA 也带来新问题:首屏变慢、包体变大、SEO 和可访问性更容易被忽略,数据获取逻辑可能散落在组件里。
第三阶段:SSR、SSG、ISR 和边缘渲染
为了兼顾体验和工程效率,现代框架开始把渲染位置变成一个可选择的策略:
- 静态生成适合内容页、文档、博客。
- 服务端渲染适合强 SEO、强首屏、个性化页面。
- 客户端渲染适合高度交互、登录后应用。
- 边缘渲染适合低延迟、地域敏感、轻量个性化。
现在的重点不再是“前端还是后端渲染”,而是“每个页面、每段数据、每个交互应该放在哪里最合适”。
第四阶段:混合架构成为常态
今天更常见的是混合架构。
一个产品里可能同时存在:
- 内容页:构建时生成。
- 营销页:静态生成,加少量交互。
- 控制台:客户端应用,登录后访问。
- 详情页:服务端渲染,带缓存。
- 后台任务:队列异步处理。
- 管理后台:权限、审计、表单流转。
这也是为什么 React Server Components、Next.js App Router、Astro Islands、边缘函数、BFF、API Gateway、OpenTelemetry 这些概念会同时出现。它们不是为了制造复杂,而是在不同边界上重新分配责任。
现代架构的核心判断
先分清产品类型
选型之前,先判断项目更像哪一类:
内容型网站
-> Astro / Next.js / SSG / CMS / 搜索 / RSS
业务型后台
-> React / Vue / 表单体系 / 权限 / 数据表格 / 状态管理
交易型应用
-> SSR / 鉴权 / 支付 / 风控 / 审计 / 可观测性
协作型 SaaS
-> 多租户 / 实时协作 / 权限模型 / 通知 / 计费
内部工具
-> 快速 CRUD / 权限 / 日志 / 部署简单 / 成本可控
一个博客不需要上来就微服务,一个 SaaS 控制台也不应该只靠几页静态 HTML 硬撑。架构的第一原则是匹配问题规模。
前端关注体验闭环
前端选型要回答:
- 路由和页面怎么组织。
- 数据在哪里获取,怎么缓存和失效。
- 表单、错误、加载、空状态怎么统一。
- 首屏和交互性能怎么控制。
- 组件边界怎样服务长期维护。
对于现代前端,框架只是第一层。真正拉开差距的是状态模型、设计系统、数据请求、可访问性、错误处理和性能预算。
后端关注业务闭环
后端选型要回答:
- 业务规则放在哪里。
- 数据模型和事务边界怎样设计。
- API 是否稳定、可演进、可观测。
- 权限、审计、幂等、限流怎样处理。
- 部署后怎样定位问题。
很多后端问题不是语言选择造成的,而是边界不清:控制器里写业务、数据库 schema 追着页面变、异步任务没有重试策略、日志只有字符串没有上下文。
DevOps 关注可重复动作
项目上线不是最后一步,而是架构的一部分。
至少要回答:
- 本地环境怎样启动。
- CI 怎样跑测试和构建。
- 配置怎样按环境隔离。
- 部署怎样回滚。
- 错误怎样报警。
- 日志、指标、链路追踪怎样关联。
如果一个项目只能靠某个人手动上线,它的架构还没有闭环。
真实项目如何选型
我会用这套顺序判断:
1. 先定义约束
先写清楚:
- 用户是谁。
- 最重要的路径是什么。
- 首屏、SEO、登录态、实时性哪个重要。
- 团队熟悉什么技术。
- 部署在哪里。
- 预算和维护周期有多长。
技术选型不是展示品位,而是减少未来的不确定性。
2. 再选渲染模式
内容多、更新频率低:优先 SSG。
强 SEO、强个性化、数据实时:考虑 SSR。
后台系统、登录后重交互:SPA 或混合渲染都可以。
部分页面静态、部分页面动态:选择支持混合模式的框架。
3. 再设计 API 边界
接口不要只跟着页面写。更好的方式是按业务动作组织:
GET /projects
GET /projects/:id
POST /projects
PATCH /projects/:id
POST /projects/:id/archive
列表、详情、创建、修改、状态流转,是比“给某个按钮写一个接口”更稳的边界。
4. 再定数据和异步模型
数据库是事实来源,缓存是性能手段,队列是削峰和异步处理手段。不要反过来。
常见判断:
- 有强一致事务:先用关系型数据库。
- 读多写少:加缓存,但要设计失效策略。
- 任务耗时:放队列,记录任务状态。
- 外部系统不稳定:加重试、幂等、超时和补偿。
5. 最后补齐上线链路
一个能进入日常开发的项目,至少应该有:
README写清启动方式。.env.example写清配置项。Dockerfile或明确的运行环境。- CI 跑测试和构建。
- 预览环境或 staging。
- 错误日志和基础监控。
这些不是“高级工程化”,而是避免团队靠记忆工作。
一个推荐的默认架构
如果没有特殊约束,我会从这个默认形态开始:
Frontend
- TypeScript
- Astro / Next.js / React
- 内容页静态生成
- 登录后页面客户端增强
- 组件和数据请求分层
Backend
- TypeScript / Java / Python / Go 任选团队熟悉的
- 清晰 service 层
- PostgreSQL 作为主数据库
- Redis 只解决明确的缓存或队列问题
- OpenAPI 或类型约定保护接口
Delivery
- Docker 固化运行环境
- GitHub Actions 跑测试和构建
- 云平台部署静态站点或容器服务
- 日志、指标、错误报警从第一版开始接入
这个默认架构不炫技,但很耐用。它允许你先上线,再随着业务增长逐步引入更复杂的能力。
常见误区
误区一:把微服务当成先进
微服务解决的是组织和系统规模问题,不是小项目起步问题。没有自动化部署、可观测性、接口治理和团队边界,微服务只会把本来能在一个进程里解决的问题拆成网络问题。
误区二:把前后端分离当成绝对正确
前后端分离是协作方式,不是宗教。内容站、文档站、个人站完全可以让服务端或构建阶段承担更多渲染。复杂后台则适合让前端掌握更多交互状态。
误区三:把缓存当成救命药
缓存会带来失效、一致性和排查成本。先确认数据库查询、索引、接口设计和页面请求是否合理,再加缓存。
误区四:上线后才考虑观测
没有日志、指标和链路追踪,线上问题就只能靠猜。可观测性不是大公司专属,小项目也至少要有错误日志、请求日志和构建部署记录。
这组专题后面怎么读
这篇是地图。后面可以按这条路线展开:
- 前端:现代前端工程、渲染模式、状态管理、性能。
- 后端:API、服务分层、数据库、缓存、可靠性。
- DevOps:Docker、CI/CD、部署、监控。
- 工具:Git、编辑器、调试、团队约定。
真正的目标不是把每个名词都背下来,而是在做项目时能回答:
- 这个复杂度是否值得。
- 这个边界以后会不会拖累团队。
- 这个方案上线后是否能排查问题。
- 这个项目从今天到半年后还能不能维护。