答案取决于这些页面是“内容固定、结构也固定”还是“内容固定、但局部数据会变”。前者可以长期不动,只在链接失效或事实过期时改一次;后者则必须把会变的片段外置成独立文件或数据源,否则每次更新都要回到代码里手改,规模一上来必然出错。
常见做法是直接把文字写进 HTML,改的时候用编辑器打开、找到那一段、替换、上传。三五个页面时这套流程完全成立,甚至比装一套后台更快。但当同类页面增加到几十个,问题就出现了:同一句说明散落在多个文件里,改了一处忘了另一处;某次只改了首页,内页还是旧说法。
这个现象容易被误读成“手写页面不可维护”。更准确的判断是:出问题的不是手写本身,而是同一份可变信息被复制到了多个位置。页面数量只是让复制带来的偏差变得可见。
解释一:页面本身不适合静态维护,应该引入后台或生成工具。解释二:页面结构没问题,只是可变内容没有单一来源。
区分二者可以看一个证据:把所有页面上“会随时间变化”的句子列出来。如果这些句子各不相同、只属于各自页面,那么它们本来就不需要统一更新,静态维护成立,问题只是缺少一个记录“哪页写了什么”的清单。如果同一句说明、同一个价格逻辑、同一组链接出现在三个以上页面,那么无论用不用后台,都需要一个单一来源,后台只是其中一种实现方式。
另一个可观察的证据是改动成本随页面数的变化。假设有 20 个页面共用一段“投稿方式”说明,手改一遍约需逐页定位。如果每次规则微调都要重复这个过程,说明这段内容应该被抽出来;如果一年只改一次,抽出来的收益有限,反而增加了一层构建依赖。
假设博客里有 30 个“工具介绍”页面,每个页面底部都有一句“当前是否接受提交”的状态说明。若直接写死在 HTML 里,状态变化时就要改 30 个文件。
一种安排是建一个 status.json,只放每个工具的状态字段,页面加载时用一段脚本读取并填入预留的占位元素,例如 <span data-status="tool-a"></span>。这样更新只改一个文件。代价是:页面在脚本执行前该位置是空的,如果脚本失败或访客禁用脚本,这句说明就不显示。所以它适合“状态是补充信息”的场景,不适合把关键结论放在这里。
另一种安排是用构建步骤在发布时把状态写进静态 HTML。访客拿到的是完整页面,不依赖脚本,但每次改状态都要重新构建并发布。它适合状态变化不频繁、又要求页面自包含的情况。两条路线的分界不在技术难度,而在你能否接受“改完数据还要跑一次发布”。
做完这一步,后续判断会变得简单:新页面要不要纳入统一来源,看它是否包含已外置的片段;如果包含,就复用同一份数据,而不是再抄一遍。反过来,如果某页的片段确实独一无二,就不要为了“统一”强行并入,否则数据文件会变成另一堆散落文本。
外置方案在“片段短、位置固定、页面模板一致”时收益最大。一旦页面结构差异很大,占位元素的位置和上下文都不同,运行时填入可能造成排版错位,构建时写入则需要为每种模板单独处理。此时更稳的做法是缩小外置范围,只统一真正共用的那一句,其余保留在各页面内。
另外,把内容抽成数据文件并不等于获得了编辑能力。它只是把“改很多处”变成“改一处再发布”,编辑仍然要接触文件或构建流程。如果实际需求是让不碰代码的人直接改文字,那需要的是另一套方案,而不是把数据文件放到更深的目录里。