同样是一次访问,静态页面是【把做好的东西递给你】,动态页面是【现场给你做一份】——这个区别决定了速度、成本和能被攻击的面。
2-3 和 2-4 讲的是【页面长什么样】,用的例子都是写好的文件。但今天绝大多数页面不是写好的——它是每次请求时现算出来的。这一条讲的就是这个分界线,它也是本章后面几条(HTTP 请求、响应、CGI、脚本语言)的地基。
一、两种页面的活儿不一样
静态页面:文件在磁盘上躺着,请求来了就原样送出去。
动态页面:请求来了要先交给一个程序,程序可能去查数据库、可能按你的身份变内容,然后拼出一份 HTML 再发出去。
多出来的这几步,每一次请求都要走一遍。这就是所有差别的源头。
二、动手 Demo:同一个请求,两条路
steps = [("1", "收到请求", "收到请求"),
("2", "直接从磁盘读文件", "把请求交给一个程序"),
("3", "返回文件", "程序连数据库(不止一次)"),
("4", "", "把数据填进模板"),
("5", "", "拼成完整 HTML")]
for a, b, c in steps:
print("%-4s %-20s %s" % (a, b, c))
实跑输出:
--------------------------------------------------------------------
D5 静态页面与动态页面
--------------------------------------------------------------------
同样是一次访问,两种页面的活儿差很远:
----------------------------------------------------------------------------------------
步骤 静态页面 动态页面
----------------------------------------------------------------------------------------
1 收到请求 收到请求
2 直接从磁盘读文件 把请求交给一个程序
3 返回文件 程序连数据库(不止一次)
4 把数据填进页面模板
5 拼成完整 HTML
6 返回结果
7 (下一次请求,这一套再来一遍)
----------------------------------------------------------------------------------------
步骤差的这几步,直接体现在时间上:
----------------------------------------------------------------------------------------
指标 静态页面 动态页面
----------------------------------------------------------------------------------------
首字节时间 边缘节点约 100 毫秒 服务器渲染约 800 毫秒
最差情况 差别不大 移动端可达 3~5 秒
每次访问的数据库查询 0 次 3 次上下
100 万次访问的查询总量 0 次 约 300 万次
----------------------------------------------------------------------------------------
动态页面的代价,一半花在【每次都要重新算一遍】上。
网站质量上也能看出这条分界线(Core Web Vitals 通过率):
----------------------------------------------------------------------------------------
网站类型 通过率
----------------------------------------------------------------------------------------
手写 + 现代框架 61%
全站平均 42%
用 AI 一键生成的站 29%
WordPress 这类动态 CMS 43%
----------------------------------------------------------------------------------------
所以这几年出现了一个明显的转向:把【每次都算】改成【提前算好】。
新建官网里,用静态生成(SSG)的已经占到 52%,首次超过动态 CMS 的 48%。
但也不是非此即彼——交易、登录、评论这些必须现场处理,
于是主流做法变成:静态交付能静态的部分,动态只在需要时发生。
⚠️ 2026 现状:教材讲的这个二分法今天更准确的叫法是【渲染策略】。
静态生成、服务端渲染、客户端渲染、增量再生——
它们不是三种网站,而是同一个网站上不同页面的不同选择。
读这个输出:看第三行之后的那两行空白。静态页面在第 3 步就结束了,动态页面还要往下走四步。这几步不是抽象的流程,是真金白银的 CPU 时间和数据库连接——访问量一上来,它们就是账单。
三、代价落在哪三个地方
第一,速度。静态页面可以从离用户最近的节点直接发出;动态页面必须回到服务器上算一遍。这一步的延迟用户能感觉到。
第二,成本。静态页面几乎不需要算力,动态页面每次访问都要占一份。一千万次访问就是算一千万次,这两者的服务器账单不是一个量级。
第三,能被攻击的面。静态页面没有程序在跑,也就没有程序漏洞可钻;动态页面要连数据库、要处理用户输入,每多一个环节就多一类风险。
但也别急着下结论:登录、下单、评论、搜索——这些不做动态就没法存在。所以真正的问题不是选哪个,而是哪些地方必须动态、哪些地方可以静态。
这几年出现的答案是把两者混起来:能提前算好的提前算好,必须现场处理的才现场处理。教材叫它【静态与动态】,今天的行话叫【渲染策略】。
四、⚠️ 2026 现状
教材写于 2024 年,这个二分法已经完全成立,只是拆得更细了:静态生成(提前全部算好)、服务端渲染(每次在服务器算)、客户端渲染(把数据发给浏览器让它自己拼)、增量再生(先用旧的,后台慢慢更新)。
它们不是四种网站,而是同一个网站上不同页面的不同选择——首页可以提前算好,购物车必须现场算。
30 秒实验
- 打开一个新闻网站的首页,再打开一篇具体文章,各刷新两次。
- 观察第二次刷新时页面变化的地方和不变的地方——不变的很可能被提前算好了,变的往往是现场取的。
- 再打开你常用的一个登录后的界面(比如订单列表),想想这个页面有没有可能提前算好。
常见误区
- 错误:动态页面比静态页面高级。——纠正:它们解决的是不同的问题。动态换来的是个性化和实时性,代价是速度、成本与风险。一个不需要个性化的页面做成动态的,是花钱买麻烦。
- 错误:静态页面就是不会更新的页面。——这个说法很常见:静态指的是生成时机,不是内容新不新。一个每天重新生成好几次的静态首页,内容可以比谁都新;反过来,一个动态页面如果数据没更新,照样是旧内容。
- 错误:全站都做静态最省事最省钱。——纠正:一旦要求用户登录、要求表单提交,静态就撑不住了。这些必须现场处理,所以现实里的做法是按页面分工,而不是给整站下一个标签。
- 错误:页面快点慢点无所谓。——纠正:速度是会被记住的。用户不会分析你的架构,只会记得【这个网站点起来卡不卡】。这也解释了为什么【提前算好】这几年又变成了主流做法。
自测三问(点开对答案)
1. 静态页面和动态页面的根本区别是什么? —— **页面是什么时候做出来的**。静态是提前做好摆着,动态是每次请求现场做。**这个时间差带来了后面所有差别**:速度、算力成本、以及有没有一个运行中的程序能被攻击。 2. 为什么动态页面在访问量上来以后特别贵? —— 因为**它的成本是按访问次数线性累加的**。一千万次访问,就是算一千万次、连一千万次数据库。相比之下静态页面的成本几乎只跟流量走,跟【算几次】无关——**这才是【提前算好】最现实的价值**。 3. 今天更准确的叫法是什么? —— **渲染策略**。因为一个网站里不同页面可以各不相同:有的提前算好,有的现场算,有的把数据发给浏览器让它自己拼。**教材那个二分法是对的,只是今天的实际做法要把【哪些页面】也一起说清楚。**- ☐ 下一节(2-6 Web网站的HTTP请求:无状态、HTTP 请求、HTTP 方法)
相关笔记
- Web网页的次要部分 —— 上一节:页面的样子怎么定
- 浏览器的功能 —— 浏览器拿到文件之后做了什么
- Web系统的设置场所 —— 摆在哪儿,和这一节的成本账连着
- 静态Web网站、动态Web网站、CGI —— 编程课里的同一组概念
- 🕸️ Web技术原理 · 索引