根本原因是views路径或文件后缀与html.New()初始化参数不匹配:需确保os.Stat("./views")可读、后缀含点(如".html")、Fiber不递归搜索子目录。

模板引擎初始化必须匹配 views 路径与文件后缀
最常见的 404 是 c.Render("index", nil) 报错,根本原因不是路由没配好,而是 html.New("./views", ".html") 初始化时路径或后缀不匹配真实文件。比如你实际文件是 ./views/index.html,但传了 ".htm" 或 "html"(漏掉点),Fiber 就会去找 indexhtm 或 indexhtml —— 不存在,直接 panic。
务必确认三点:
-
os.Stat("./views")能成功读取,目录存在且路径相对于go run main.go所在位置 - 文件扩展名和
html.New()第二个参数**完全一致**,包括开头的点(".html"✅,"html"❌) - Fiber 不递归搜索子目录:
c.Render("admin/dashboard", nil)要求文件路径是./views/admin/dashboard.html,不是./views/dashboard.html
模板变量渲染为空?检查 fiber.Map 键名大小写
Go 的 map[string]interface{} 是严格大小写敏感的,而 Go 模板要求字段名首字母大写才能导出。所以 fiber.Map{"title": "Home"} 传进去,模板里写 {{.Title}} 或 {{.title}} 都取不到值 —— 前者因键不存在,后者因字段未导出。
正确做法只有一种:
- 用首字母大写的键名:
fiber.Map{"Title": "Home", "UserCount": 123} - 模板中对应写
{{.Title}} {{.UserCount}} - 如果传 struct,字段也必须首字母大写;匿名 struct 字段如
fiber.Map{"user": struct{ Name string }{Name: "Alice"}}中的{{.user.Name}}会空,应改为fiber.Map{"User": struct{ Name string }{Name: "Alice"}}
静态资源(CSS/JS)404?模板引擎根本不处理它们
gofiber/template 只负责 c.Render(),它不会接管任何以 /static/、/css/ 开头的请求。浏览器直接请求 /static/style.css,而你没配静态服务,结果就是 404。
必须显式挂载:
-
app.Static("/static", "./public")(假设 CSS 放在./public/style.css) - 路径前缀(第一个参数)要和 HTML 中的
<link href="/static/style.css">一致 - 不要把静态资源放
./views下——那是模板专用目录,Fiber 不会从里面读 CSS
开发时模板修改不生效?别忘了 SetDebug(true)
默认情况下,html.New() 会缓存已解析的模板,改了 index.html 也不会自动重载。这不是热更新失效,是缓存没关。
开发阶段务必加:
engine := html.New("./views", ".html")-
engine.Reload(true)(v2)或engine.SetDebug(true)(v3) - 注意:这个设置必须在
fiber.New(fiber.Config{Views: engine})之前完成,否则无效
生产环境关掉它,否则每次渲染都重新 parse 模板,性能明显下降。真正容易被忽略的是:SetDebug 必须在 Views 注入 app 之前调用,顺序错了就等于没设。


















