SSG,全称 Static Site Generation(静态站点生成): 在构建时 build time 把内容与模板 template拼成一页一页的 HTML 文件,访客到来时交出去的是早就写好的文件,而不是当场算出来的结果;产物是一堆纯静态文件, 可以整包放到 CDN 上。 像提前把整本书印好:读者来的时候只是取走一本,不是当场现写。 代价也像印刷 —— 要改内容,得重新排一次版、再印一批,不能拿笔在已经发出去的书上改。
内容型站点(博客、文档、产品介绍页)有个共同点:内容很久才变一次,访客却天天来。 现拼的做法,是把同一份内容为每一个人重算一遍。
四条指向同一个做法:能提前做完的活,就在发布之前做完,访客到的时候只剩取件。
内容 source Markdown 文件,或 headless CMS 里的条目 -> 模板 template 决定一页长什么样 -> 生成器 generator 在构建时跑的那一步 -> 产物 artifact 一页一个 .html,加样式、脚本、图片 -> 静态托管 只把现成的文件发出去 -> 访客
场景一:把一批 Markdown 变成整站文件。
hugo new site my-docs # 建一个站,内容目录里放的就是 Markdown
hugo # 构建:内容 + 模板 → 生成整站
# 产物落在 public/:public/index.html、public/guide/install/index.html …
# 换用 VitePress / Astro 时,命令是 vitepress build / astro build,道理一样
改完一篇 Markdown,再跑一遍构建、把新产物传上去,访客看到的就是新页面;
站点有多少页,产物里就有多少个对应的 .html 文件。
场景二:把产物交给托管平台。
# 把仓库连到 Cloudflare Pages / Netlify / GitHub Pages:
# 平台在远端跑一遍同样的构建,再把产物发到就近的节点
# 也可以本地 hugo 完,再把 public/ 整个传上去
两种做法的产物完全一样,差别只在构建跑在哪台机器上:本地跑是「先建好再发」, 平台跑是「推上去之后它替你建」——多半就挂在 CI/CD 上:推代码触发它构建,产物直接发到节点。
场景三:站里只有少数几页经常更新。
产品介绍页一年改两次,价格页每周改一次。让生成器只重建价格那几页(ISR / 增量再生成), 其余页面沿用上一次的产物;既不用每次全量重印,页面也不必退回「每次请求现拼」。
先问一句:页面是在什么时候拼出来的?发布之前是 SSG,每个请求时是 SSR,浏览器里是 CSR。 再问一句:这句话说的是生成,还是交付?
| 名词 | 它是什么 | 和 SSG 什么关系 |
|---|---|---|
| 静态托管 | 只负责把现成的文件发给访客,自己不生成页面 | 配套的一层:SSG 管生成,它管交付(0016 那一课讲的就是它) |
| 预渲染(prerender) | 更宽的说法:任何「提前把页面生成成 HTML」的做法 | SSG 是它的一种;它的范围更大,可以只提前生成一部分页面,其余仍现拼 |
| SSR(服务端渲染) | 每个请求到来时,在服务器上把页面拼好再返回 | 换的是时机:SSG 发布前拼一次,它每来一个请求就拼一次,所以总能反映最新数据 |
| CSR(客户端渲染) | 先发一个空壳,内容由浏览器里的脚本拼出来 | 拼的动作挪进了浏览器;HTML 文件里没有正文,首屏与分享预览都要吃亏 |
| ISR(增量静态再生成) | 先把生成好的页面发出去,再在后台定期重建其中一部分 | 给 SSG 打的补丁:治的是「改一点就要全站重建」 |
| headless CMS | 只有内容后台和接口、不带前台的建站系统 | 一个内容来源:构建时把它的条目取下来,再交给生成器出页面 |
| CDN | 在许多地方放缓存,让访客就近取到文件 | 只是把交付送得更近;它不生成页面,也不知道页面是怎么来的 |
一句话分工:SSG 决定「什么时候生成」,静态托管决定「从哪里发出去」,SSR 与 CSR 是另外两种生成时机。
三题自测,每题只有一个正确选项;选完立刻看到解释。
1. SSG 这个名字,说的是页面在哪一步被拼出来?
对。SSG 的关键就在于把生成提到了发布之前:访客到来时只剩取件,服务器不做计算。
2. 把生成好的文件交给访客,是下面哪一步?
对。静态托管只管交付;文件是谁生成的、什么时候生成的,它不关心。
3. 一篇文章改了错别字,一个 SSG 站要做什么,访客才能看到?
对。内容变了,产物就得重做一份;这正是「提前生成」要付的那笔账,也是增量再生成想替你减轻的部分。