Files
fiber/docs/guide/templates.md
Juan Calderon-PerezGitHubcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
e4737ee937 📒 docs: Full audit of documentation (#3717)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-08-29 12:34:19 +02:00

5.8 KiB

id, title, description, sidebar_position
id title description sidebar_position
templates 📝 Templates Fiber supports server-side template engines. 3

import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';

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:

:::info 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, interface{}, ...string) error
}

:::note 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

:::info By default, ctx.Render() searches for the template in the ViewsLayout path. Pass alternate paths in the layouts argument to override this behavior. :::

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>

:::caution 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 interface{}) IEngineCore
// 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]interface{}) IEngineCore
// Add `ToUpper` to engine
engine := html.New("./views", ".html")
engine.AddFuncMap(map[string]interface{}{
    "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>

Full Example

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>