
Go 原生不支持 Jade/Pug 模板,但可通过纯 Go 实现的 github.com/Joker/jade 库无缝集成,无需 Node.js 或外部编译流程,支持嵌套缩进语法、继承、Mixin 等核心特性。
go 原生不支持 jade/pug 模板,但可通过纯 go 实现的 `github.com/joker/jade` 库无缝集成,无需 node.js 或外部编译流程,支持嵌套缩进语法、继承、mixin 等核心特性。
Go 标准库的 html/template 功能稳健、安全且与 HTTP 生态深度集成,但其显式标签书写方式在快速原型或结构化布局场景下略显冗长。而 Jade(后更名为 Pug)凭借缩进驱动语法、简洁的属性写法(如 div#header.class1.class2)、强大的模板继承(extends/block)和 Mixin 机制,显著提升前端模板开发效率。幸运的是,社区已提供成熟、零依赖的 Go 原生实现——Joker/jade,它完全兼容 Pug 语法规范,且编译为 Go 的 html/template.Template 对象,可直接与 net/http 或 Gin/Echo 等框架协同工作。
快速上手:三步集成
-
安装依赖
go get github.com/Joker/jade
-
编写
.jade模板文件(例如views/layout.jade)doctype html html head title= Title meta(charset="UTF-8") body block content p Default content对应子模板
views/index.jade:extends layout.jade block content h1 Welcome to Pug in Go! ul each item in Items li= item -
在 Go 服务中加载并执行
package main import ( "fmt" "log" "net/http" "github.com/Joker/jade" ) func handler(w http.ResponseWriter, r *http.Request) { // 从文件系统加载 Jade 模板(支持嵌套目录) t, err := jade.ParseFiles("views/layout.jade", "views/index.jade") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 渲染数据(注意:Jade 模板变量名需小写,Go 结构体字段需导出) data := struct { Title string Items []string }{ Title: "My App", Items: []string{"Go", "Pug", "Jade"}, } w.Header().Set("Content-Type", "text/html; charset=utf-8") if err := t.Execute(w, data); err != nil { log.Printf("Template execution error: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) } } func main() { http.HandleFunc("/", handler) log.Println("Server running on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
注意事项与最佳实践
- ✅ 语法兼容性:
Joker/jade支持绝大多数 Pug 语法(if/else、each、mixin、include、extends),但暂不支持运行时 JavaScript 表达式(如#{jsExpression}),所有逻辑应在 Go 层处理后传入。 - ⚠️ 性能建议:避免每次请求都调用
ParseFiles;应在启动时一次性解析并复用*template.Template实例(如使用sync.Once或应用初始化阶段加载)。 - ? 安全性:该库自动转义 HTML 输出(类似
html/template),但若需原始 HTML,可使用!{unsafeHTML}语法 —— 请确保内容可信,避免 XSS 风险。 - ? 框架集成:在 Gin 中,可自定义
HTMLRender;在 Echo 中,可注册jade.Renderer;均无需修改底层 HTTP 流程。 - ? 构建优化:生产环境推荐将
.jade文件嵌入二进制(如go:embed+jade.ParseFS),消除运行时文件 I/O 依赖。
综上,github.com/Joker/jade 是目前 Go 生态中最稳定、最轻量的 Pug 兼容方案。它既保留了 Pug 的开发体验优势,又坚守 Go 的编译时安全与部署简洁性,是追求高效模板开发团队的理想选择。










