Revel 框架强制使用 .html 作为模板文件后缀且大小写敏感,因其源码硬编码路径拼接逻辑(如 app/views/ControllerName/MethodName.html),不支持配置或通配符匹配,也未暴露底层 html/template 的自由度。

Revel 框架不支持、也不提供设置模板文件默认后缀名的机制。它硬编码只识别 .html 后缀,且区分大小写——这不是配置项,是源码级约定,改不了。
为什么 Revel 只认 .html?
Revel 的模板加载逻辑(如 ViewLoader 和 TemplateLoader)在解析控制器方法名到视图路径时,直接拼接字符串:app/views/ControllerName/MethodName.html。它不查文件系统通配符,不读配置,也不调用 html/template.ParseFiles 的通用接口,而是走自己封装的、路径固定的查找流程。
- 例如
func (c App) Dashboard() revel.Result→ 必须对应app/views/App/Dashboard.html - 写成
Dashboard.tmpl或dashboard.html都会 404,且无提示 - 即使你手动用
template.ParseFiles(".../Dashboard.tmpl")加载,Revel 的渲染链路也根本不会走到那里
和 Go 标准库 html/template 的区别在哪?
Go 标准库确实不限制后缀——template.ParseFiles("x.gohtml")、ParseGlob("*.tmpl") 全都合法。但 Revel 是上层框架,它**屏蔽了底层 template API 的自由度**,换成了自己的约定式路径映射。
- 你可以在 Revel 项目里随便放
.gohtml文件,也能用template.Must(template.ParseFiles(...))手动渲染,但它和 Revel 的c.Render()、{{template}}等机制完全无关 - Revel 的
{{template "partials/_nav.html" .}}中的路径,必须以.html结尾,否则报template: "partials/_nav.html" is undefined - IDE 高亮或
//go:embed可能偏好某后缀,但 Revel 自身不参与这些环节
想用其他后缀?实际能做的只有两件事
别试图绕过 Revel 的路径规则,它不给你留钩子。真有强需求,只能接受以下现实:
立即学习“go语言免费学习笔记(深入)”;
- 所有由 Revel 自动加载的视图(即通过
c.Render()调用的),严格使用.html后缀,大小写与控制器方法名一致 - 若坚持用
.gohtml或.tmpl,就得放弃c.Render(),改用手动加载html/template实例,并自行处理上下文传递、布局继承、i18n 翻译等——等于抛弃 Revel 的模板体系 - 团队协作时,务必在
CONTRIBUTING.md里写死这条:「Revel 视图文件名 = 方法名 +.html,大小写敏感,不可配置」
最常被忽略的一点:错误往往不出现在模板语法里,而出现在路径拼写上——比如把 App/Dashboard.html 误建为 app/dashboard.html,Revel 不报错,只静默返回空内容。检查时先盯紧大小写和扩展名,比调试 {{.}} 传参更优先。


















