在Beego中使用Jade模板

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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,以及jadeace都是可以解析為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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.