模板继承里那个static路径,把我坑到凌晨三点

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

上周给公司内网管理系统做前端重构,用了Layui的模板继承。本地开发一切正常,打包上线后页面全白了,F12一看全是404,静态资源一个没加载进来。

问题出在模板继承的区块覆盖上。父模板里我写了{block name="css"}{__CSS__}{/block},子模板覆盖时直接{block name="css"}<link rel="stylesheet" href="/static/admin/css/index.css">{/block}。本地用php artisan serve跑,根目录就是public,/static能正常解析。上线后是子目录部署,nginx配了alias,结果所有绝对路径全崩。

更隐蔽的是ThinkPHP的{__CSS__}{__JS__}这两个预定义标签。文档说会自动替换为当前模块的静态资源路径,但实际行为跟你的入口文件位置、是否开启多模块、域名绑定都有关系。我开了域名绑定到admin模块后,{__CSS__}解析出来是/admin/static/,而我实际目录结构是/public/static/admin/,完全对不上。

最后解决办法很土:不用预定义标签,改在Base控制器里用view->assign('static_path', request()->root(true) . '/static/' . request()->module());,模板里统一用变量。子模板继承时不再覆盖整个css块,而是改成追加模式{block name="css"}{__block__}<link ...>{/block},这样父模板的公共样式不会被一刀切掉。

还有个坑是CDN刷新。我图省事把/static整个目录挂了CDN,结果模板继承的碎片化资源(每个子页面单独引的小组件css)命中率极低,回源次数爆炸。后来把公共库抽成vendor.bundle,页面级样式内联到模板里,CDN只缓存vendor和uploads,回源降了七成。

你们子目录部署时静态路径都怎么处理的?我试过改config里的tpl_replace_string,但多模块场景下总有些边缘页面漏掉,感觉还是控制器里动态算最稳,就是代码丑了点。

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