SSR、SPA、SSG 前端渲染三兄弟的餐厅创业大战 🍜 🥪 🥦

你是否经历过这种绝望?
- 打开网站转圈10秒,想买的鞋已被抢光 ❌
- 公司官网百度搜不到,客户以为你倒闭了 ❌
- 后台系统点个按钮卡3秒,员工摔键盘骂娘 ❌
这一切的罪魁祸首,是网站“上菜模式”选错了!
在互联网早期,网站像“街边盒饭摊”:
老板(服务器)现场炒菜(SSR)→ 食客(用户)干等 → 人一多直接歇业。
后来诞生了“智能料理桌”(SPA)和“中央厨房预制菜”(SSG),却陷入 “首屏卡成狗、SEO搜不到、动态改不动” 等新困局。
今天,我们用一场「餐厅创业大战」的故事,拆解 SSR、SPA、SSG 三大前端渲染模式的生死博弈 —— 看完你就明白:为什么淘宝首页秒开?为何知乎内容能被百度抓取?
开网站就像开餐厅——用户要“上菜快”,老板想“省成本”,搜索引擎还得“看得懂菜单”。三位厨师(SSR、SPA、SSG)为此争得不可开交... 到底谁适合你的餐厅?
老派厨师 SSR —— 现点现炒的固执匠人
很久很久以前(互联网早期),网站就像一本本“纸质菜单”。
- 主角登场:SSR(Server-Side Rendering - 服务端渲染)
- 形象: 一位勤劳、可靠但有点古板的“老大哥”。
- 工作方式:
- 客人(用户浏览器)走进餐厅(输入网址),喊:“老板,来份宫保鸡丁(请求页面)!”
- 老板兼大厨 SSR(服务器)立刻冲进厨房(数据库/应用逻辑),现场抓鸡、切丁、爆炒(查询数据 + 拼接 HTML)。
- 炒好后,SSR 端出一盘热气腾腾、色香味俱全的成品菜(完整的 HTML 页面)给客人。
- 客人吃完(看完页面),想点个麻婆豆腐(点击链接),SSR 又得冲回厨房重做一遍整个流程,端上另一盘全新的菜(刷新整个页面)。
- 为什么是它?
- 那时客人(浏览器)的“消化能力”(JS 引擎)很弱,自己不会做菜(渲染复杂页面)。
- 需要让客人立刻看到内容(首屏快)。
- 需要让“美食评论家”(搜索引擎)能轻松看懂每道菜(SEO 友好)。
- 烦恼:
- 老板累趴了: 每来一个客人点菜(请求),老板都要亲自下厨(服务器渲染),人一多(高并发),餐厅就瘫痪。
- 点菜慢: 换一道菜就要等老板重做一遍,即使只是换个配菜(页面只有小部分更新)。
- 互动少: 菜是固定的,客人想加点辣、换个摆盘(复杂交互)?得让老板回锅重炒(整页刷新),体验不流畅。
例如,传统的 Django 开发模式(MVT)本质就是 SSR(服务端渲染),经典的交互逻辑如下图所示。
科技极客 SPA —— 让客人自己动手的魔术师
随着时间推移,客人们(浏览器)的“厨艺”(JS 能力)突飞猛进。大家厌倦了每次点菜都要等老板重做整桌菜的繁琐。
- 新星崛起:SPA(Single-Page Application - 单页面应用)
- 形象: 一个追求极致体验、技术新潮的“酷小子”。
- 工作方式 (革命性改变):
- 客人第一次来,老板 SSR(或者一个简单的服务器)只给客人端上一个空盘子 + 一套万能智能厨具(一个极简的 HTML 骨架 + 一个巨大的 JavaScript 应用包)。
- 客人想点宫保鸡丁?不用叫老板! 客人自己用桌上的智能厨具(浏览器 JS)就能做。厨具如果需要花生米(数据),会悄悄让服务员(AJAX/Fetch)去厨房(后端 API)拿花生米本身(JSON 数据),而不是让老板炒整盘菜。
- 客人想换麻婆豆腐?不用换盘子! 智能厨具直接在当前盘子(当前页面) 里把宫保鸡丁的残渣清理掉,现场做出麻婆豆腐(动态更新 DOM)。整个过程丝滑流畅,盘子(浏览器标签页)都不用换!
- 为什么受欢迎?
- 点菜(交互)体验炸裂: 后续操作快如闪电,感觉像在用 App,用户体验飙升。
- 老板(服务器)轻松了: 老板只需提供“食材”(API 数据),不用亲自炒每道菜了(渲染压力小)。
- 前后台分工明确: 厨房(后端)专注食材供应,智能厨具(前端 JS)负责烹饪呈现,开发更清晰。
- 功能强大: 在客人桌上(客户端)可以实现极其复杂的“烹饪技巧”(交互效果)。
- 新烦恼:
- 第一次等得久: 空盘子和那套巨大的智能厨具搬上来(下载 JS Bundle)要时间,客人饿着肚子干等(首屏慢)。
- 美食评论家(SEO)懵圈: 评论家来探店时,只看到一个空盘子和一堆生厨具(空 HTML + JS 代码),根本不知道这家店卖啥!虽然后来想了些办法(预渲染、服务端嗅探),但天生短板。
- 挑客人: 如果客人用的是老古董餐具(旧浏览器)或者不让用智能厨具(禁用 JS),那就只能饿肚子(页面白屏或功能残缺)。
- 厨具太重: JS 包越来越大,“搬上桌”的时间也可能变长。
效率狂魔 SSG —— 中央厨房+冷链之王
就在 SPA 风头正劲时,大家发现一个问题:不是所有餐厅都需要现场点炒菜!很多店(比如博客、新闻、公司官网)的菜单(内容)其实几个月都不变一次。让客人每次点不变的菜都要等智能厨具初始化,或者让老板每次都为不变的菜现场重炒,太浪费了!
同时,大家对速度、安全、成本的要求越来越高。
- 智者现身:SSG(Static Site Generation - 静态站点生成)
- 形象: 一位深谋远虑、追求效率与稳定的“隐士高人”。它其实是 SSR 和 SPA 出现前最原始的方式(纯静态 HTML),但被赋予了现代工具的强大能力。
- 工作方式:
- 餐厅打烊后(构建时),高人 SSG 指挥一群“机器人厨师”(构建工具如 Next.js、Gatsby、Hugo)。
- 机器人厨师根据固定菜谱(内容源:Markdown、CMS、数据库快照),提前把未来所有可能被点的菜(所有页面) 都一次性做好(生成纯静态的 HTML/CSS/JS 文件)。
- 把这些做好的“预制菜”(静态文件)分门别类地放在餐厅门口的超级保温柜 (CDN) 里。
- 客人来了点菜(请求页面),服务员(CDN 边缘节点)瞬间从最近的保温柜拿出对应的预制菜(静态文件)端上桌。光速上菜!
- 为什么被重新青睐?
- 上菜(加载)快到离谱: 预制菜,拿出来就上!全球 CDN 分发,天涯海角都快。
- 老板(服务器)彻底解放: 保温柜(CDN/静态托管)维护成本极低,轻松应对亿万客人(高并发、高可用)。
- 固若金汤(安全): 餐厅里只有保温柜(静态文件),没有厨房(无服务器、无数据库),黑客无从下手。
- 美食评论家(SEO)最爱: 评论家随时来,看到的就是摆盘精美的成品菜(完整 HTML),索引毫无障碍。
- 成本低廉: 租用保温柜(静态托管/CDN)比养大厨(维护服务器)便宜太多。
- 局限:
- 不能现点现做(动态性差): 客人说“宫保鸡丁不要花生,多放辣”?抱歉,预制菜改不了!菜谱(内容)有变?必须重新启动机器人厨师把所有菜重做一遍(重新构建部署),哪怕只改了一个错别字。
- 不适合“私人订制”餐厅: 像“我的购物车”、“我的个人主页”(用户个性化内容)这种,SSG 无能为力。
- “无限菜单”的噩梦: 如果有成千上万页(如电商商品页),构建时间可能很长。