【导读】go语言后端服务渲染html有什么库?本文介绍了go语言模版引擎模版引擎jet的用法。

很多人都说golang不太适合做网页渲染逻辑。如果与PHP相比,golang在这方面确实在开放上不是显得方便。当你的模板出现错误时,在go运行时一般会发生panic,导致当前请求失败。不仅如此,本身golang所提供的模板库性能也并非理想。当你在模板中出现一个小小的错误就会导致整个请求失败。

在逛github时,发现一个不错的模板引擎。根据作者所提供的benchmark结果,其关注的性能还是相当高的。有兴趣的同学可以到其官方主页中运行相应的测试用例。https://github.com/CloudyKit/jet

这次博客更新一部分功能,其模板渲染器就换掉了go所提供的模板引擎,改为了jet。使用起来感觉还可以,没有遇到太多麻烦。鉴于国内并么有太多人关注该库,特意将Jet的文档进行一部分汉化说明。

如果你要使用jet模板引擎,建议你直接使用最新的V2版本。相比较老版本而言,新版本的接口更加简单,解析速度也更快一些。

安装

go get -u github.com/CloudyKit/jet

创建一个模板渲染对象并制定模板所在目录

import (
    "os"
    "path/filepath"

    "github.com/CloudyKit/jet"
)

var View = jet.NewHTMLSet("./views")) // relative to the current working directory from where this code is run

// may also use an absolute path:
var root, _ = os.Getwd()
var View = jet.NewHTMLSet(filepath.Join(root, "views"))

jet比较省事的一点是,你只要制定所有模板所在的文件夹,它就会在该文件夹内寻找所需要的文件。无论是你制定的当前所要渲染的文件,还是模板中相对依赖的文件。它都能自动查找。

创建模板文件

<!-- file: "views/layouts/application.jet" -->
<!DOCTYPE html>
<html>
  <head></head>
  <body>
    {{yield body()}}
  </body>
</html>
<!-- file: "views/home.jet" -->
{{extends "layouts/application.jet"}}
{{block body()}}
  <main>
    This content will be yielded in the layout above.
  </main>
{{end}}

渲染模板

模板中肯定需要一些动态数据,这些数据需要封装在类型为jet.VarMap对象中。其实这个类型就是map[string]reflect.Value类型重命名。当jet渲染完成后,会将结果写入到一个io.Writer对象中。这样jet不限制我们将渲染结果输出到哪里,可以将其输出到磁盘,网络流或者是缓存中。简单代码如下:

templateName := "home.jet"
t, err := View.GetTemplate(templateName)
if err != nil {
    // template could not be loaded
}
var w bytes.Buffer // needs to conform to io.Writer interface (like gin's context.Writer for example)
vars := make(jet.VarMap)
if err = t.Execute(&w, vars, nil); err != nil {
    // error when executing template
}

jet模板渲染是同步操作,内部并没有任何协程参与。上面这个实例中,会在你制定的文件夹中寻找名为home.jet的文件,并将其渲染,渲染后的数据结果全部写入到w对象中。

转自:ashan.org/archives/967