在Beego中使用Jade模板
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 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)
}
上面的例子會輸出字串: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 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"
}
執行之後生成的頁面程式碼:
<!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 html
html 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
原文:https://segmentfault.com/a/1190000007532274
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- vue 使用Jade模板寫html,stylus寫cssVueHTMLCSS
- 學習篇:NodeJS中的模板引擎:jadeNodeJS
- beego 模板中對變數的對比Go變數
- 國內哪些公司在使用BeegoGo
- Node模板引擎學習(2)--Jade語法歸納
- beego orm使用GoORM
- [js高手之路]Node.js模板引擎教程-jade速學與實戰4-模板引用,繼承,外掛使用Node.js繼承
- 在 PBootCMS 中,使用 {php} 和 {eval} 標籤可以在模板中執行 PHP 程式碼bootPHP
- 影片直播系統原始碼,在Laravel中自定義模板函式 並在模板中呼叫原始碼Laravel函式
- thinkphp-在模板中使用原生PHPPHP
- 對beego在併發上的疑惑Go
- 使用beego擼了一個社群Go
- beego session 根本無法正常使用GoSession
- nodejs express框架一個工程中同時使用ejs模版和jade模版NodeJSExpress框架
- Node 學習 -- jade
- jade 渲染js片段JS
- 在Xcode6中找回失去的模板XCode
- 關於C++中在模板引數中使用Lambda表示式的問題C++
- thinkphp控制器變數在模板中顯示PHP變數
- 模板與例項在系統中的應用
- onethink自定義外掛 怎麼在模板裡面使用模板的繼承?繼承
- ubuntu 16.04下安裝node.js的jade模組,jade已經安裝到全域性,無法找到jade命令UbuntuNode.js
- Golang框架Beego在Windows環境下小試牛刀Golang框架Windows
- 在Ubuntu上快速搭建基於Beego的RESTful APIUbuntuGoRESTAPI
- 使用Beego構建一個web專案GoWeb
- beego log中增加request id的一種方式Go
- Beego: 怎麼在 c.ServeJSON() 後馬上停止GoJSON
- beego檔案上傳使用getFile出錯Go
- Beego 再出發Go
- beego問題Go
- 模板引擎使用詳解:包含公共模板
- Go實戰專案-Beego的orm的基本使用GoORM
- beego 怎麼與vue.js一起使用?GoVue.js
- GoCN為什麼沒有使用beego來搭建呢?Go
- Word在Normal.dot模板檔案中儲存預設資訊ORM
- Flask——模板的使用Flask
- Beego 框架巔峰之路Go框架
- beego tag詳解Go