логотип PurpleSchool
логотип PurpleSchool

Шаблоны в Go. Работа с Templ.

Шаблоны позволяют отделить логику приложения от представления. В Go стандартные пакетыtext/template и html/template обеспечивают базовую функциональность. Однако, по мере развития приложений, возникают потребности в более мощных и типобезопасных инструментах. Как раз Templ — такой шаблонизатор для Go с поддержкой компонентов, JSX-подобного синтаксиса и статической типизации. Чего нет у других шаблонизаторов или встроенного в Fiber fiber.TemplateEngine

Пример использования стандартных шаблонов

В данном примере мы определяем структуру PageDataдля передачи данных в шаблон и используем метод Executeдля рендеринга шаблона с данными.

package main
import (
    "html/template"
    "net/http"
)
type PageData struct {
    Title   string
    Content string
}
func handler(w http.ResponseWriter, r *http.Request) {
    tmpl := template.Must(template.ParseFiles("template.html"))
    data := PageData{
        Title:   "Главная страница",
        Content: "Добро пожаловать на наш сайт!",
    }
    tmpl.Execute(w, data)
}
func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

Минусы стандартных шаблонов

- Медленный рендеринг — шаблон парсится и интерпретируется во время выполнения

- Строковые ошибки — если передать не тот тип данных, приложение упадёт уже на этапе рендеринга

- Нет компонентов — шаблоны сложно переиспользовать и тестировать

Templ - отличия

- Статическая типизация и безопасность типов — Templ компилирует шаблоны в Go-код, это позволяет обнаруживать ошибки на этапе компиляции, обеспечивая безопасность типов и снижая вероятность ошибок во время выполнения

- Производительность — поскольку Templ генерирует Go-код из шаблонов, процесс рендеринга ускоряется, повышается производительность приложения

- Синтаксис — Templ предоставляет более выразительный синтаксис, поддерживает компоненты

- Интеграция с Go — благодаря генерации Go-кода, Templ обеспечивает тесную интеграцию с остальной частью приложения, позволяя использовать функции и типы Go непосредственно в шаблонах. Более того, в шаблонах можно писать на Go

Пример использования

1 — Определение шаблона

templ PageComponent(data PageData) {
  <div>{data.Title}</div>
  <div>{data.Content}</div>
}

2 — Генерация Go-кода

templ generate

3 — Использование

import (
  "fmt"
  "net/http"
  "github.com/a-h/templ"
)
func main() {
  component := PageComponent(PageData{
        Title:   "Главная страница",
        Content: "Добро пожаловать на наш сайт!",
  })
  
  http.Handle("/", templ.Handler(component))
  fmt.Println("Listening on :3000")
  http.ListenAndServe(":3000", nil)
}

Другие шаблонизаторы

  • Jet — шаблонизатор с поддержкой компиляции, но использует собственный DSL вместо Go. Это упрощает написание шаблонов, но делает их менее типобезопасными. В Templ, наоборот, можно использовать Go-типизацию и избежать проблем с runtime-ошибками.

  • Quicktemplate — один из самых быстрых шаблонизаторов, но его синтаксис не самый удобный для повседневной разработки. Он больше подходит для high-load систем, где важна предельная скорость рендеринга.

Итог

По сравнению с иными шаблонизаторами, в Templ мы получаем наилучшее соотношение удобства разработки, поддержки и итоговой производительности. Его можно рассматривать как в рамках fullstack, который мы обсуждаем в курсе, так и вне его — для упрощения работы с шаблонами в целом.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile

Комментарии

0

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile