生成规则:把"生成什么"变成数据
静态化不给每种页面写死代码,而是用一张规则表描述:
| 目标类型 | 含义 | 默认 URL |
|---|---|---|
| 1 | 首页 | /index.html |
| 2 | 栏目页 | /{dir}/index.html |
| 3 | 文档页 | /{dir}/detail/{biz_no}.html |
| 4 | 单页 | 按 page_key |
每条规则可以限定到具体栏目(channel_biz_no),也可以留空表示全局。取规则的顺序是"栏目专属 > 全局 > 内置默认"——所以即使一条规则都没配,系统也能按内置约定生成,不至于"配错一处就全站不能发"。
落盘根与子目录
规则里的 output_path 不是绝对路径,只是默认输出目录下的子目录。默认输出目录来自「网站配置 → 静态化设置」(本项目是 public/html)。
这样设计的好处是:切换输出位置(比如从 /html 换到站点根)只需要改一处配置,规则不用动。代价是模板与链接里都要带这个前缀——所以我们把"URL 前缀"也收口到同一个配置读取点,避免两处算法不一致(这个坑我们在模板文章里讲过)。
模板取用顺序
生成一个页面时,模板按三级取:
- 目标自带的模板(文章可以单独指定模板);
- 所属栏目指定的模板(列表模板 / 内容模板);
- 按目标类型取默认模板。
三级都没有,则该目标记 template_empty 并跳过——跳过而不是报错:一个栏目还没配模板时,不应该让整批生成失败。
批量生成要分片
一个稍大的站点,栏目加文章可能上千个页面。一次性生成会超时,前端也看不到进度。
做法是按 50 个目标一片,前端循环调用并推进进度条。分片的关键是计数与分片同源:countChannelPages() 与 publishChannelPages() 必须用同一个查询条件,否则进度条会走到 120% 或者卡在 99%。
失败要能定位
生成结果分三类:写出、跳过、失败,每类都带目标标识与原因:
- 跳过:模板为空、URL 规则算不出合法路径;
- 失败:写文件失败(权限、磁盘)、模板语法异常。
我们坚持"单条失败不中断整批":一个页面模板写错,不应该让另外九百个页面停止生成。汇总里给出失败列表,运营或开发按目标逐个修。
什么时机生成
三种触发方式:
- 手动:后台点"生成",最常用,客户改完内容自己刷;
- 定时:配置 cron 定期全量生成,兜底那些忘记手动的场景;
- 发布时:新增/修改文章后自动生成该栏目与文章页(体验最好,但要注意别让发布接口被生成拖慢,通常改成异步任务)。
一条自检建议
生成完成后做一次链接反查:抽取若干生成页里的内部链接,反推它在磁盘上对应的文件,验证是否存在。
这一步能抓住所有"路径算错"的问题——包括我们遇到过的子栏目文章链接少一层目录。生成静态站最容易出的不是样式问题,而是"页面生成了但没人能点到"。