Jade是一個(gè)高性能的HTML模板引擎互婿,它受到Haml的影響,是使用JavaScript實(shí)現(xiàn)的梨州。Jade在客戶端也有支持蛛碌,它的代碼比html可讀性要高很多,Jade是一個(gè)比較常用的HTML模板寻定。
Beego是一個(gè)go語(yǔ)言的web應(yīng)用程序開(kāi)源web框架儒洛,而B(niǎo)eego從1.7.0開(kāi)始支持更加復(fù)雜的模板引擎,當(dāng)然也包括了對(duì)于jade的支持特姐,支持更復(fù)雜模板引擎的PR地址https://github.com/astaxie/beego/pull/1940。
在介紹Jade的使用之前先來(lái)看下Go下面的html/template
包黍氮。
html/template
在Go語(yǔ)言中唐含,html/template
包是一個(gè)很強(qiáng)大的html模板包,結(jié)合text/template
的模板語(yǔ)法沫浆,基本上可以滿足大部分的HTML模板需求捷枯,無(wú)論是Beego中是默認(rèn)支持的兩種模板格式.tpl
和.html
,以及jade
和ace
都是可以解析為html/template
中的Template對(duì)象使用,就是說(shuō)我們所使用的html模板最終都是基于html/template
包實(shí)現(xiàn)的专执。
html/template
使用實(shí)例:
package main
import (
"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)
}
上面的例子會(huì)輸出字符串:hello jjz
淮捆。
通過(guò)上面的例子我們可以看到,如何新建一個(gè)模板,再使用模板函數(shù)Parse()
從字符串中加載模板內(nèi)容攀痊,使用模板函數(shù)Execute()
可以給模板替換字段桐腌。替換模板字段的語(yǔ)法,{{}}
中的字段就是要替換字段,{{. Name}}
表示需要替換的字段名稱。
Beego
使用復(fù)雜模板的方式很簡(jiǎn)單苟径,增加一個(gè)模板引擎函數(shù)案站,在項(xiàng)目運(yùn)行的時(shí)候遍歷views
中的文件,把指定的文件解析為template.Template
對(duì)象棘街,返回該對(duì)象提供使用蟆盐,這個(gè)模板引擎函數(shù)就是:beego.AddTemplateEngine
。
AddTemplateEngine
beego.AddTemplateEngine
是一個(gè)用來(lái)把指定的文件遭殉,轉(zhuǎn)換為template.Template
的對(duì)象的函數(shù)石挂。它的第一個(gè)參數(shù)是文件的后綴名,在views
中的含有此后綴名的文件都會(huì)進(jìn)入該方法進(jìn)行處理险污。他的第二個(gè)參數(shù)是一個(gè)函數(shù)痹愚,用來(lái)處理文件的轉(zhuǎn)換,最后會(huì)返回一個(gè)template.Template
的對(duì)象罗心。有了這個(gè)函數(shù)里伯,我們還少一個(gè)把jade文件解析為template.Template
的方法,還好有人已經(jīng)做了jade的Go語(yǔ)言實(shí)現(xiàn)渤闷。
jade.go
jade.go是Jade的Go語(yǔ)言實(shí)現(xiàn)疾瓮。
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文件轉(zhuǎn)換為T(mén)emplate對(duì)象狼电,在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文件的內(nèi)容以字符串的方式讀取出來(lái)弦蹂。讀取文件的方法:
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解析出的結(jié)果也是一個(gè)字符串肩碟,因此在代碼中需要把字符串轉(zhuǎn)換為template.Template
對(duì)象,使用了Template.Parse()
方法凸椿。
解析jade模板的引擎方法需要在main()
中調(diào)用削祈,添加完jade的模板轉(zhuǎn)換引擎之后,就可以在Beego
中使用jade模板了脑漫。
jade模板的使用
首先定義一個(gè)頁(yè)面home.jade
:
doctype html
html
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"
}
運(yùn)行之后生成的頁(yè)面代碼:
<!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>
通過(guò)添加一個(gè)解析模板的引擎就可以在beego中使用jade的模板,beego從1.7.0之后開(kāi)始支持復(fù)雜的模板引擎优幸,不僅僅是對(duì)于jade的支持吨拍,也包括對(duì)于其他模板引擎的支持。
除了jade之外,在這個(gè)PR中推薦使用的是aceHTML模板引擎。
ace
ace是一個(gè)Go語(yǔ)言的HTML模板引擎,它借鑒了Slim和Jade,在Go語(yǔ)言里有超高的人氣郁轻。
ace模板
在beego中的使用與使用Jade
類(lèi)似队秩,首先安裝ace
的依賴包:
go get github.com/yosssi/ace
在main函數(shù)中添加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模板需要指定一個(gè)base.ace
笑旺,另外使用ace.Load()
函數(shù)可以直接返回一個(gè)template.Template
對(duì)象,不需要再做其他轉(zhuǎn)換的工作刹碾。
添加完模板引擎之后就可以直接在views中添加.ace文件使用燥撞,新建一個(gè)home.ace
文件:
= doctype html
html lang=en
head
meta charset=utf-8
title Base and Inner Template
body
h1 ace
.content {{.content}}
同樣的{{.content}}是也需要在controller
層本替換成需要的內(nèi)容,controller層代碼:
func (c *MainController)Ace() {
c.Data["content"] = "this is ace template"
c.TplName = "home.ace"
}