這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Jade是一個高效能的HTML模板引擎,它受到Haml的影響,是使用JavaScript實現的。Jade在用戶端也有支援,它的代碼比html可讀性要高很多,Jade是一個比較常用的HTML模板。
Beego是一個go語言的web應用程式開源web架構,而Beego從1.7.0開始支援更加複雜的模板引擎,當然也包括了對於jade的支援,支援更複雜模板引擎的PR地址https://github.com/astaxie/beego/pull/1940。
在介紹Jade的使用之前先來看下Go下面的html/template
包。
html/template
在Go語言中,html/template
包是一個很強大的html模板包,結合text/template
的模板文法,基本上可以滿足大部分的HTML模板需求,無論是Beego中是預設支援的兩種模板格式.tpl
和.html
,以及jade
和ace
都是可以解析為html/template
中的Template對象使用,就是說我們所使用的html模板最終都是基於html/template
包實現的。
html/template
使用執行個體:
package mainimport ( "html/template")type User struct { Name string}func main() { t := template.New("template example") t, _ = t.Parse("hello {{.Name}}!") p := User{Name: "jjz"} t.Execute(os.Stdout, p)}
上面的例子會輸出字串:hello jjz
。
通過上面的例子我們可以看到,如何建立一個模板,再使用模板函數Parse()
從字串中載入模板內容,使用模板函數Execute()
可以給模板替換欄位。替換模板欄位的文法,{{}}
中的欄位就是要替換欄位,{{. Name}}
表示需要替換的欄位名稱。
Beego
使用複雜模板的方式很簡單,增加一個模板引擎函數,在項目啟動並執行時候遍曆views
中的檔案,把指定的檔案解析為template.Template
對象,返回該對象提供使用,這個模板引擎函數就是:beego.AddTemplateEngine
。
AddTemplateEngine
beego.AddTemplateEngine
是一個用來把指定的檔案,轉換為template.Template
的對象的函數。它的第一個參數是檔案的尾碼名,在views
中的含有此尾碼名的檔案都會進入該方法進行處理。他的第二個參數是一個函數,用來處理檔案的轉換,最後會返回一個template.Template
的對象。有了這個函數,我們還少一個把jade檔案解析為template.Template
的方法,還好有人已經做了jade的Go語言實現。
jade.go
jade.go是Jade的Go語言實現。
jade.go
的使用,首先安裝jade.go:
go get github.com/Joker/jade
jade.go
使用樣本:
func main() { tpl, err := jade.Parse("name_of_tpl", "doctype 5: html: body: p Hello world!") if err != nil { return } fmt.Printf( "%s", tpl )}
輸出字串:
<!DOCTYPE html><html> <body> <p>Hello world!</p> </body></html>
有了jade.go
就可以在Beego中使用,把jade檔案轉換為Template對象,在beego中添加jade.go
解析jade模板的方法:
func addJadeTemplate() { beego.AddTemplateEngine("jade", func(root, path string, funcs template.FuncMap) (*template.Template, error) { jadePath := filepath.Join(root, path) content, err := utils.ReadFile(jadePath) fmt.Println(content) if err != nil { return nil, fmt.Errorf("error loading jade template: %v", err) } tpl, err := jade.Parse("name_of_tpl", content) if err != nil { return nil, fmt.Errorf("error loading jade template: %v", err) } fmt.Println("html:\n%s",tpl) tmp := template.New("Person template") tmp, err = tmp.Parse(tpl) if err != nil { return nil, fmt.Errorf("error loading jade template: %v", err) } fmt.Println(tmp) return tmp, err })}
jade.go
目前只支援使用字串的方式接卸jade模板,因此需要先把.jade檔案的內容以字串的方式讀取出來。讀取檔案的方法:
func ReadFile(path string) (str string, err error) { fi, err := os.Open(path) defer fi.Close() fd, err := ioutil.ReadAll(fi) str = string(fd) return}
jade.go解析出的結果也是一個字串,因此在代碼中需要把字串轉換為template.Template
對象,使用了Template.Parse()
方法。
解析jade模板的引擎方法需要在main()
中調用,添加完jade的模板轉換引擎之後,就可以在Beego
中使用jade模板了。
jade模板的使用
首先定義一個頁面home.jade
:
doctype htmlhtml head title pageTitle body h1 jade .content {{.content}}
其中{{.content}}
是需要替換的欄位,Controller
層代碼:
func (c *MainController) Jade() { c.Data["content"] = "this is jade template" c.TplName = "home.jade"}
運行之後產生的頁面代碼:
<!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>pageTitle</title> </head> <body> <h1>jade</h1> <div class="content">this is jade template</div> </body></html>
通過添加一個解析模板的引擎就可以在beego中使用jade的模板,beego從1.7.0之後開始支援複雜的模板引擎,不僅僅是對於jade的支援,也包括對於其他模板引擎的支援。
除了jade之外,在這個PR中推薦使用的是aceHTML模板引擎。
ace
ace是一個Go語言的HTML模板引擎,它借鑒了Slim和Jade,在Go語言裡有超高的人氣。
ace模板
在beego中的使用與使用Jade
類似,首先安裝ace
的依賴包:
go get github.com/yosssi/ace
在main函數中添加ace模板解析引擎:
func addAceTemplate() { beego.AddTemplateEngine("ace", func(root, path string, funcs template.FuncMap) (*template.Template, error) { aceOptions := &ace.Options{DynamicReload: true, FuncMap: funcs} aceBasePath := filepath.Join(root, "base") aceInnerPath := filepath.Join(root, strings.TrimSuffix(path, ".ace")) tpl, err := ace.Load(aceBasePath, aceInnerPath, aceOptions) if err != nil { return nil, fmt.Errorf("error loading ace template: %v", err) } return tpl, nil }) }
注意使用ace模板需要指定一個base.ace
,另外使用ace.Load()
函數可以直接返回一個template.Template
對象,不需要再做其他轉換的工作。
添加完模板引擎之後就可以直接在views中添加.ace檔案使用,建立一個home.ace
檔案:
= doctype htmlhtml lang=en head meta charset=utf-8 title Base and Inner Template body h1 ace .content {{.content}}
同樣的{{.content}}是也需要在controller
層本替換成需要的內容,controller層代碼:
func (c *MainController)Ace() { c.Data["content"] = "this is ace template" c.TplName = "home.ace"}
範例程式碼地址:https://github.com/jjz/go/tree/master/template