Revel 模板通过配置统一注入 resourceVersion 实现带版本号的绝对路径静态资源引用,确保浏览器缓存生效且不 404;需全局拦截注入、路径前缀一致、旧文件保留。

Revel 模板里不能“合并”CSS/JS 文件本身,但可以通过模板逻辑+配置组合出带版本号的静态资源 URL,实现语义上的“合并引用”——既保持物理文件分离(利于开发调试),又让浏览器按需加载带缓存控制的唯一 URL。
静态资源路径必须用绝对路径 + 版本参数
浏览器对相对路径的解析极易出错,比如 href="css/app.css" 在 /user/profile 页面会请求 /user/css/app.css,直接 404。正确写法是:
-
href="/public/css/app.css?v={{.resourceVersion}}"(推荐) - 或
href="/public/css/app.css?v={{revel.Config.StringDefault "resourceVersion" "1"}}(不依赖拦截器时兜底)
关键点:路径前缀 /public/ 必须和 Go 侧 r.Static("public", "public") 或 http.Handle("/public/", ...) 的注册 pattern 完全一致;v= 后的值应来自配置而非硬编码,否则每次改版都要手动替换所有模板。
resourceVersion 必须通过拦截器注入模板上下文
直接在 Controller 里 c.RenderArgs["resourceVersion"] = "abc123" 只对当前 Action 生效,漏掉一个就可能加载旧资源。正确做法是全局拦截:
- 在
app/controllers/resourceversion.go中定义SetVersion函数,从app.conf读取resourceVersion配置项 - 在
app/init.go的init()函数中,调用revel.InterceptMethod(controllers.SetVersion, revel.BEFORE),且必须放在revel.Harness.Init()之前 - 若
app.conf未设置该键,则用StringDefault提供默认值(如"1"),避免空值导致 URL 变成?v=
不这么做,模板里 {{.resourceVersion}} 就是空,最终生成 /public/css/app.css?v= —— 浏览器仍会缓存,失效失败。
多个静态资源要统一用同一 version 值
别在不同模板里各自读配置或拼时间戳,否则 CSS 和 JS 的 v 值不一致,会导致部分资源被缓存、部分刷新,样式与行为错位。所有引用都应共享同一个 .resourceVersion:
<script src="/public/js/app.js?v=%7B%7B.resourceVersion%7D%7D"></script>- 连 favicon 也别漏:
构建时只要更新一次 app.conf 里的 resourceVersion(例如设为 Git commit SHA),整个站点所有静态资源 URL 都自动刷新,浏览器强制拉新。
最容易被忽略的是:版本号变更后,必须确保旧资源文件仍保留在 public/ 目录下——Revel 不重命名文件,只靠 URL 参数触发缓存失效,删了旧文件而用户还没刷新,就会 404。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











