Роман Лобигер
Шаблоны позволяют отделить логику приложения от представления. В 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