1995 年的网页是这样的:服务器上有一个 HTML 文件,浏览器请求它,服务器把它原样发过去。没有构建步骤,没有 hydration,没有客户端状态管理。打开的速度取决于你的调制解调器,而不是前端 bundle 的大小。
三十年后,我们绕了一个大圈回来了——带着更好的工具,回到同一个理念。静态站点生成器(SSG)是这几年 Web 开发里少有的、让我真心觉得"方向对了"的趋势。
我们是怎么把简单的事做复杂的
单页应用(SPA)解决的是一个真实问题:高度交互的应用需要状态、路由和局部更新。Gmail、Figma、VS Code Web——这些地方 SPA 是对的。
但不知从什么时候起,"现代 Web 开发"成了 SPA 的同义词。一个只有十篇文章的博客,也要打包几百 KB 的 JavaScript,在客户端 fetch 数据、渲染、再 rehydrate。结果是:Lighthouse 分数难看,搜索引擎爬虫皱眉,弱网用户面对白屏。
内容型网站被应用型架构绑架了。 这是过去十年 Web 开发最大的错配。
静态生成的三个承诺
第一,快得理所当然。 静态 HTML 是 CDN 的最佳负载:没有服务器计算,没有数据库查询,首字节时间约等于网络延迟。这个博客的首页在任何机器上都是秒开——不是优化的结果,是架构的结果。
第二,稳定到近乎无聊。 没有运行时,就没有运行时的故障。不会因为数据库连接池耗尽而 500,不会因为某个第三方 API 抖动而白屏。构建成功的那一刻,网站在接下来一年里能出什么问题,基本只剩"CDN 挂了"这一种——而那不在我的能力圈之内。
第三,可长期保存。 这是我个人最看重的一点。静态文件不依赖特定的服务器环境、Node 版本或数据库 schema。十年后,把这堆 HTML 扔到任何一个静态托管上,它照样工作。互联网档案馆抓取的也是完整的页面。写作的目的是被长期阅读,那么承载文字的形式就应该能活得比任何一家创业公司都久。
不是没有代价
静态不是银弹。纯静态意味着:每次改内容都要重新构建;评论、搜索这类动态功能要么外包给第三方,要么用边缘函数补齐。我写这个博客时接受了这些代价,换来的是心智上的轻盈——我维护的是一堆文件,不是一套系统。
值得注意的是行业也在收敛:ISR(增量静态再生)、按需 revalidate、RSC 静态导出……"动态能力,静态交付"正在成为新的默认。这是好事——它说明大家终于承认,大多数网页的本质,从来就是文档。
Web 最初的愿景是发布和阅读文档。静态站点不是怀旧,是把这个愿景用今天的工具重新兑现一次。