直接用iris.HTML()注册模板引擎需显式调用app.RegisterView(tmpl),并配置Delims("${", "}")避免与Vue冲突,开启Reload(true)支持热更新,且ViewData必须在View前调用。

直接用 iris.HTML() 就能跑起来,但不配 Delims 和 Reload,开发时基本等于自找麻烦。
怎么注册 HTML 模板引擎
模板引擎不是自动加载的,必须显式注册。最常用的是标准库 html/template,对应 iris.HTML():
-
iris.HTML("./views", ".html")表示从./views目录加载所有.html后缀文件 - 路径必须存在,否则
app.Run()会 panic,错误信息类似open ./views: no such file or directory - 注册后必须调用
app.RegisterView(tmpl),漏掉这句,ctx.View()会静默失败(无报错、无输出)
为什么一定要改 Delims 和开 Reload
默认用 {{}},和 Vue/React 模板语法冲突,前端 JS 渲染时会被服务端提前解析或报错;Reload(true) 不开的话,改完模板要手动重启服务:
-
tmpl.Delims("${", "}")把分隔符换成${},避开前端框架干扰 -
tmpl.Reload(true)只在开发环境开,生产环境关掉——它靠 fsnotify 监听文件变化,有轻微性能开销 - 如果用了
Delims却没改模板里的写法,比如还写{{.message}},那变量不会渲染,页面显示空白或原始字符串
ViewData 和 View 的调用顺序很关键
ctx.ViewData() 是绑定数据,ctx.View() 是触发渲染,顺序反了就传不了值:
-
ctx.ViewData("title", "首页")必须在ctx.View("index.html")之前执行 - 如果用了布局(
ctx.ViewLayout("layout.html")),它也必须在ctx.View()之前,否则布局不生效 - 支持两次绑定:先
ctx.ViewData("user", u),模板里用{{.user.Name}};或直接ctx.View("page.html", u),模板里用{{.Name}}
多个模板引擎可以共存,但别混用同一组模板文件
Iris 允许同时注册 iris.HTML() 和 iris.Jet(),比如前后端分离项目中,后端管理页用 HTML,邮件模板用 Jet:
- 不同引擎加载不同目录,例如
iris.HTML("./views/admin", ".html")和iris.Jet("./views/email", ".jet") - 不能让两个引擎都指向
./views并用相同后缀,否则Reload会互相干扰,甚至 panic - 引擎之间不共享
AddFunc,每个引擎要单独调tmpl.AddFunc("now", time.Now)
最容易被忽略的是:模板路径是相对于可执行文件所在目录的,不是 main.go 所在目录。如果你用 go run main.go,那 ./views 就是当前终端所在路径;如果用 go build && ./app,就要确保 views 文件夹和二进制在同一级。这点在 CI/CD 或 Docker 部署时特别容易出错。


















