π Templates
Templates render dynamic content without requiring a separate frontend framework.
Template Enginesβ
Fiber accepts a custom template engine during app initialization.
app := fiber.New(fiber.Config{
// Provide a template engine
Views: engine,
// Default path for views, overridden when calling Render()
ViewsLayout: "layouts/main",
// Enables/Disables access to `ctx.Locals()` entries in rendered views
// (defaults to false)
PassLocalsToViews: false,
})
Supported Enginesβ
Fiber maintains a templates package that wraps several engines:
Custom engines implement the Views interface to work with Fiber.
type Views interface {
// Fiber executes Load() on app initialization to load/parse the templates
Load() error
// Outputs a template to the provided buffer using the provided template,
// template name, and bound data
Render(io.Writer, string, any, ...string) error
}
The Render method powers ctx.Render(), which accepts a template name and data to bind.
Rendering Templatesβ
After configuring an engine, handlers call ctx.Render() with a template name and data to send the rendered output.
func (c Ctx) Render(name string, bind Map, layouts ...string) error
By default, ctx.Render() searches for the template in the ViewsLayout path. Pass alternate paths in the layouts argument to override this behavior.
- Example
- layouts/index.html
app.Get("/", func(c fiber.Ctx) error {
return c.Render("index", fiber.Map{
"Title": "Hello, World!",
})
})
<!DOCTYPE html>
<html>
<body>
<h1>{{.Title}}</h1>
</body>
</html>
When PassLocalsToViews is enabled, all values set using ctx.Locals(key, value) are passed to the template. Use unique keys to avoid collisions.
Advanced Templatingβ
Custom Functionsβ
Fiber supports adding custom functions to templates.
AddFuncβ
Adds a global function to all templates.
func (e *Engine) AddFunc(name string, fn any) IEngineCore
- AddFunc Example
- views/index.html
// Add `ToUpper` to engine
engine := html.New("./views", ".html")
engine.AddFunc("ToUpper", func(s string) string {
return strings.ToUpper(s)
}
// Initialize Fiber App
app := fiber.New(fiber.Config{
Views: engine,
})
app.Get("/", func (c fiber.Ctx) error {
return c.Render("index", fiber.Map{
"Content": "hello, World!"
})
})
<!DOCTYPE html>
<html>
<body>
<p>This will be in {{ToUpper "all caps"}}:</p>
<p>{{ToUpper .Content}}</p>
</body>
</html>
AddFuncMapβ
Adds a Map of functions (keyed by name) to all templates.
func (e *Engine) AddFuncMap(m map[string]any) IEngineCore
- AddFuncMap Example
- views/index.html
// Add `ToUpper` to engine
engine := html.New("./views", ".html")
engine.AddFuncMap(map[string]any{
"ToUpper": func(s string) string {
return strings.ToUpper(s)
},
})
// Initialize Fiber App
app := fiber.New(fiber.Config{
Views: engine,
})
app.Get("/", func (c fiber.Ctx) error {
return c.Render("index", fiber.Map{
"Content": "hello, world!"
})
})
<!DOCTYPE html>
<html>
<body>
<p>This will be in {{ToUpper "all caps"}}:</p>
<p>{{ToUpper .Content}}</p>
</body>
</html>
- For more advanced template documentation, please visit the gofiber/template GitHub Repository.
Full Exampleβ
- Example
- views/index.html
package main
import (
"log"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/template/html/v2"
)
func main() {
// Initialize standard Go html template engine
engine := html.New("./views", ".html")
// If you want to use another engine,
// just replace with following:
// Create a new engine with django
// engine := django.New("./views", ".django")
app := fiber.New(fiber.Config{
Views: engine,
})
app.Get("/", func(c fiber.Ctx) error {
// Render index template
return c.Render("index", fiber.Map{
"Title": "Go Fiber Template Example",
"Description": "An example template",
"Greeting": "Hello, World!",
});
})
log.Fatal(app.Listen(":3000"))
}
<!DOCTYPE html>
<html>
<head>
<title>{{.Title}}</title>
<meta name="description" content="{{.Description}}">
</head>
<body>
<h1>{{.Title}}</h1>
<p>{{.Greeting}}</p>
</body>
</html>