templ:用 Go 语言写 HTML 的现代实践
templ 是一个面向 Go 语言的原生模板引擎。它允许开发者直接用 Go 语法编写 HTML 用户界面,并在编译阶段将模板转换为纯 Go 代码。这意味着你可以在模板中自由使用 Go 的类型系统、控制结构和标准库,同时获得接近手写 Go 的性能。
对于构建 Web 应用、静态站点或微服务前端,templ 提供了一个类型安全、高性能且无需 JavaScript 的替代方案。
核心特性
- 服务端渲染(SSR):模板在服务端执行,可部署为 Serverless Function、Docker 容器或标准 Go 程序。
- 静态渲染:支持生成纯静态 HTML,预渲染页面,直接托管到 CDN 或对象存储。
- 编译为 Go 代码:
.templ文件在构建时生成.go代码,运行时零额外开销,类型安全在编译期即得到保证。 - 完整的 Go 语言能力:模板内可调用任意 Go 函数,使用
if、switch、for等控制语句,访问标准库和第三方包。 - 无 JavaScript 依赖:没有前后端分离带来的复杂度,更小的攻击面、更快的首屏加载,对 SEO 友好。
- 优秀的开发体验:官方工具链提供 IDE 自动补全、语法高亮、类型检查,以及一键代码生成。
基本语法示例
templ 的语法非常接近 Go,只有少量新增的模板标记:
// 简单组件
package main
templ Greeting(name string) {
<div>Hello, {name}!</div>
}
组件可以组合、复用,并支持条件渲染、循环和 switch:
templ UserList(users []User) {
if len(users) == 0 {
<p>No users found.</p>
} else {
<ul>
for _, user := range users {
<li>{user.Name}</li>
}
</ul>
}
}
模板中的逻辑与普通 Go 代码一致,学习成本极低。
工作原理
编写 .templ 文件后,运行模板生成器:
templ generate
它会生成对应的 .go 文件。之后你只需要像编译普通 Go 程序一样 go build 或 go run,即可启动应用。整个过程中没有任何运行时解析或模板引擎介入。
使用场景
- Web 应用开发:适合需要快速迭代、类型安全、对性能敏感的服务端渲染场景。
- 静态网站生成:通过静态渲染,可以快速构建博客、文档站等,部署成本极低。
- 微服务架构:每个服务可独立输出 HTML 片段,与后端 API 灵活结合。
与其他方案对比
| 方案 | 类型安全 | 性能 | JavaScript 依赖 | 学习成本 |
|---|---|---|---|---|
html/template | 部分(运行时检查) | 一般 | 无 | 需学习特定模板语法 |
| React / Vue | 强(前端作用域) | 受限于浏览器 | 必须 | 需掌握前端工程化体系 |
| templ | 编译期强类型 | 接近原生 Go | 无 | 只需会 Go |
templ 最大的优势在于:它让 Go 开发者无需切换心智模型,就能写出类型安全、高性能的 HTML 界面。
快速开始
安装 templ 命令行工具:
go install github.com/a-h/templ/cmd/templ@latest
创建模板文件 hello.templ:
package main
templ Hello(name string) {
<h1>Hello, {name}!</h1>
}
生成 Go 代码:
templ generate
在 Go 程序中使用:
func main() {
http.Handle("/", templ.Handler(Hello("World")))
http.ListenAndServe(":8080", nil)
}
总结
templ 代表了 Go 语言 Web 开发的一种新方向:将模板编译为代码,让 HTML 的构建过程拥有与 Go 语言本身一样的安全性和性能。对于追求简洁架构、极致性能,且希望彻底摆脱 JavaScript 束缚的开发者来说,templ 是一个值得深入探索的选择。
参考资源
- 官方文档:templ.guide
- GitHub 仓库:a-h/templ
- Go 包文档:pkg.go.dev/github.com/a-h/templ