分享一个功能强大的 go 模板引擎

2017-01-17 09:34:09 +08:00
 Lime

一直以来我就觉得 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 最好的模板引擎!

4162 次点击
所在节点    分享创造
14 条回复
zzn
2017-01-17 09:44:56 +08:00
模版 include 是指什么?
oott123
2017-01-17 10:06:10 +08:00
总觉得模板引擎这东西吧,你用花括号包裹就容易看不清,还不如 /endif 之类来得更舒服(
Lime
2017-01-17 10:20:05 +08:00
@oott123 嗯,是的。我开始设计语法的时候也想过用 endif 、 endfor 这种来作为结束符,就像很多模板做的那样,比如 jinja2 。后来想了一下,<% code %>里边不应该只限制 if 、 for ,而应该是任何代码,比如

```go
<%
a := 1
if a == 2 {
%>

<% } %>
````

这样用 endfor ,就限制了这种用法。而且 TJ 大神的 ejs 也是<% } %>这种用法,就沿袭了。后边如果大家都觉得不是太好的话,我就修改它。
qianguozheng
2017-01-17 10:23:25 +08:00
不想写页面。。。
Lime
2017-01-17 10:34:52 +08:00
@qianguozheng 我也不想写......但有的时候不写还没办法...
njutree
2017-01-17 11:00:47 +08:00
支持支持,不过觉得生存中间文件有点不优雅
spice630
2017-01-17 11:07:16 +08:00
Lime
2017-01-17 12:56:06 +08:00
@njutree 是有点,这个做法有点类似 thrift 和 grpc ,先生成 go 代码,然后在调用之。 为了性能,忍了!
Lime
2017-01-17 12:57:02 +08:00
@spice630 star 已送,哈哈!
ivmm
2017-01-17 13:03:10 +08:00
@oott123
我倒是觉得 end if 的容易和语句混淆, 符号和英文不一样,容易看的出来,就是缩紧一多的确菊花一紧
ivmm
2017-01-17 13:03:23 +08:00
@ivmm 缩进
loading
2017-01-17 13:08:35 +08:00
怎么这个语法看着眼花呢……
Lime
2017-01-17 13:12:06 +08:00
@loading 设计的时候我已经尽可能精简了......有代码高亮可能会好点。语法跟 tj 大神的 ejs 有点像 https://github.com/tj/ejs
qianguozheng
2017-01-17 21:34:23 +08:00
@Lime 写接口嘛,比如我最近做服务器想搞个配置一些参数的功能,我就用 web 的 api 来解析,通过 postman 发请求,毕竟是调试阶段,😜

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/335070

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX