templ 是面向 Go 的模板方案,.templ 模板本质是渲染函数而非程序。核心原则:计算逻辑放在 Go 中,templ 只负责渲染;转义在 .templ 源码内自动生效,其他位置不会;.templ 源码与生成的 *_templ.go 是不可分割的一组产物。
语法:{ } 输出值,{{ }} 执行 Go 语句;{ } 接受 string、数值、bool 及其派生类型,其他类型需先用 fmt.Sprintf 转换;返回 (T, error) 的表达式会把错误带出 Render。所有标签都需闭合,包括空元素。templ 块内的注释是 HTML 注释并会输出,// 和 /* */ 仅在块外有效。
组件:只含代码的组件自身不转义,需用 templ.EscapeString 包裹插值;templ.NewOnceHandle() 应声明在包级,否则每次调用会新建句柄。片段只抑制输出,不抑制执行。
属性:条件属性会替换同名属性;?= 根据 Go bool 渲染布尔属性;用 { attrs... } 展开 templ.Attributes,bool 值渲染裸名或省略,templ.KeyValue[string, bool] 仅在 true 时渲染 name="value"。不要修改包级 templ.Attributes,它是所有并发渲染共享的 map。
转义与消毒:{ } 会做 HTML 转义,@templ.Raw() 不会,仅可用于程序自身生成的标记。只有 href、src、action 会消毒动态 URL,其他属性需用 templ.URL() 包裹。常量 URL 不会消毒。templ.SafeURL、templ.SafeCSS、templ.SafeCSSProperty、templ.JSExpression 会关闭对应消毒器。消毒失败时替换为固定标记而非报错。
样式与 JavaScript:class 接受值列表,templ.KV 在 bool 为真时贡献类名;css 块生成带哈希后缀的类名,不应把生成名写进样式表、测试选择器或客户端 JS。数据应以属性或 JSON 脚本传递,而非插值代码。
上下文与视图模型:每个模板应有 Go 构造函数构建的视图模型,模板只读字段和遍历切片;ctx 用于跨领域值,通过返回 (T, bool) 的 getter 读取,其他参数直接传入,因为上下文缺失在渲染时报错,参数缺失在编译时报错。
工具链:每次编辑 .templ 后先运行 templ generate 再构建、测试或检查;生成的 *_templ.go 应提交,因为 Go 构建只读它;templ fmt 用于格式化 .templ 文件。测试应解析渲染后的 HTML,用 data-testid 选择,整页用 htmldiff.Diff 对比内嵌基准。
适用场景:用 Go 构建 Web 界面、需要类型安全和自动转义、希望把展示与逻辑分离的项目。限制:templ 面向 Go 生态;相关命令、参考文件路径及参数说明以资料为准,其他平台、收费或未提及细节暂未提供。