SSR 与 SPA:营销型网站为什么要在服务端渲染
一场早就有结论的老争论,却还是常常被决定错 —— 通常是因为前端那一套更熟,而后果要等一个季度才到。

单页应用交给浏览器的是一份近乎空白的文档,外加一段会就地把页面画出来的脚本。服务端渲染交出去的是已经成型的 HTML,脚本随后再把画好的东西激活。对于一个人们一坐几个小时的应用,前者说得通。对于一个人们从搜索里点进来的页面,说不通。
爬虫看到的
有人会说,搜索爬虫是能执行脚本的。能 —— 但不一定执行,也不会马上执行:需要先渲染的页面会进队列,而那个队列比「文档已经成型」的那条长。页面越多、变化越频繁,差别越明显。
更麻烦的一点是,决定搜索结果那一段文字的东西全在 `<head>` 里。标题、描述、canonical、语言版本、社交标记。在单页应用里,这些是脚本写进去的 —— 也就是说,写进去的时候,爬虫已经认定这个页面是空的了。助手和社交网络的爬虫通常根本不跑脚本,指向这种网站的链接展开出来就是一个空白方块。
人看到的
第一屏是成型的送到,这件事关乎的不是好不好看,而是有人等了多久。白屏一秒之后变成网站,代价比看上去大:每多十分之一秒,关掉标签页的人就多一点,而在手机上,「送到时已成型」和「是被画出来的」之间的差距,是以秒计的,不是毫秒。
模板在这件事上做了什么
我们的模板是用 App Router 的 Next.js:页面送到时已经成型,交互再叠上去。meta、canonical 和语言版本在服务端组装,来源和标题是同一处 —— 不是手工复制一遍,所以也就不可能互相矛盾。社交卡片不是临时画的,而是磁盘上的图片,每条路线每种语言一张。
这不是每个新网站都要重新做一遍的决定。它在模板里做过一次,从它出来的每一个网站,都悄悄继承了这个决定。

