模板继承里那个 `extend` 标签,让我在生产环境丢过半小时的脸

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 95 浏览 0 回复

上周给公司官网换主题,本地测得妥妥当当,打包上传之后前端同事群里@我说:"你这CSS怎么全404了?页面跟裸奔似的。"

我第一反应是CDN刷新问题,清缓存、换域名、加版本号,三连操作完还是白花花一片。F12一看,静态资源路径全指向了 /static/new-theme/css/...,但服务器上我明明配的是 /assets/2024-redesign/

问题出在模板继承的嵌套层级上。我主布局文件 layout.html 里用了 {block name="css"}{__block__}{/block},子模板 page/about.html 继承它,再往下还有个 widget/section.html{include} 进来。本地开发用的内置服务器,__STATIC__ 这种常量解析正常,但生产环境我为了"优雅"把资源目录做了软链接,ThinkPHP 的 Url::build() 在第三层嵌套里突然不认账了。

更绝的是,我图省事在子模板里直接写了 <link rel="stylesheet" href="/static/..."> 硬编码,结果部署脚本把 public/static 整个替换掉时,这个路径指向的是旧版本残留目录。模板继承的 {block} 覆盖机制让问题藏得很深——父模板的 {__block__} 被挤掉,我盯着子模板看了二十分钟没发现异常。

最后怎么解决的?我把所有静态资源路径统一收进一个 config/view.php 里的 tpl_replace_string,模板里只写 __ASSETS__,部署时由CI脚本替换为带哈希的版本路径。同时给 {block} 加了命名规范:父级用 {__block__} 保留、子级必须显式覆盖、孙级禁止再嵌套资源声明。

现在每次发版前我会跑一条命令:grep -r "href=\"/" runtime/temp/,把编译后的缓存模板扫一遍,硬编码路径出现即报警。这半小时的脸没白丢,至少我记住了——模板继承是省代码的好东西,但静态资源的路径解析链每多一层,就多一个让你凌晨两点惊醒的可能性。

你们有没有遇到过继承层级一深、资源路径就抽风的情况?我好奇其他框架是怎么规避这事的。

评论0
回复 · 0
还没有回复
微信客服 微信客服