一直以来我就觉得 go 没有一个好用的模板引擎,渲染 html 的时候特别痛苦,总有一种有力气却使不出来的感觉。
模板引擎一般有两种实现方式,一种是解析 html 语法树,然后根据一定的规则动态的拼接,另外一种是把模板预先生成代码,渲染模板时调用相关的函数即可。
Go 内置的 template 包使用的是第一种方式,不过很多开源项目使用的是第二种方式,比如 quicktemplate 、 gorazor 等。不过这两个可能由于设计的问题,都没有实现模板继承和模板 include ,而且有的语法个人觉得不是太优雅。
所以我想要一个 go 模板,它具备以下特性:
基于以上,实现了 hero 模板引擎,用过 nodejs EJS 模板引擎的童鞋应该很容易上手。 hero 目前已经在 http://bthub.io 线上使用。
Github: https://github.com/shiyanhui/hero
Gophers ,欢迎 issues 和 pr ,让我们一起共同打造 golang 最好的模板引擎!
1
zzn 2017-01-17 09:44:56 +08:00
模版 include 是指什么?
|
2
oott123 2017-01-17 10:06:10 +08:00
总觉得模板引擎这东西吧,你用花括号包裹就容易看不清,还不如 /endif 之类来得更舒服(
|
3
Lime OP @oott123 嗯,是的。我开始设计语法的时候也想过用 endif 、 endfor 这种来作为结束符,就像很多模板做的那样,比如 jinja2 。后来想了一下,<% code %>里边不应该只限制 if 、 for ,而应该是任何代码,比如
```go <% a := 1 if a == 2 { %> <% } %> ```` 这样用 endfor ,就限制了这种用法。而且 TJ 大神的 ejs 也是<% } %>这种用法,就沿袭了。后边如果大家都觉得不是太好的话,我就修改它。 |
4
qianguozheng 2017-01-17 10:23:25 +08:00
不想写页面。。。
|
5
Lime OP @qianguozheng 我也不想写......但有的时候不写还没办法...
|
6
njutree 2017-01-17 11:00:47 +08:00
支持支持,不过觉得生存中间文件有点不优雅
|
7
spice630 2017-01-17 11:07:16 +08:00
|
8
Lime OP @njutree 是有点,这个做法有点类似 thrift 和 grpc ,先生成 go 代码,然后在调用之。 为了性能,忍了!
|
12
loading 2017-01-17 13:08:35 +08:00 via Android
怎么这个语法看着眼花呢……
|
13
Lime OP @loading 设计的时候我已经尽可能精简了......有代码高亮可能会好点。语法跟 tj 大神的 ejs 有点像 https://github.com/tj/ejs
|
14
qianguozheng 2017-01-17 21:34:23 +08:00
@Lime 写接口嘛,比如我最近做服务器想搞个配置一些参数的功能,我就用 web 的 api 来解析,通过 postman 发请求,毕竟是调试阶段,😜
|