V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Lime
V2EX  ›  分享创造

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

  •  1
     
  •   Lime · 2017-01-17 09:34:09 +08:00 via iPhone · 4237 次点击
    这是一个创建于 2869 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直以来我就觉得 go 没有一个好用的模板引擎,渲染 html 的时候特别痛苦,总有一种有力气却使不出来的感觉。

    模板引擎一般有两种实现方式,一种是解析 html 语法树,然后根据一定的规则动态的拼接,另外一种是把模板预先生成代码,渲染模板时调用相关的函数即可。

    Go 内置的 template 包使用的是第一种方式,不过很多开源项目使用的是第二种方式,比如 quicktemplate 、 gorazor 等。不过这两个可能由于设计的问题,都没有实现模板继承和模板 include ,而且有的语法个人觉得不是太优雅。

    所以我想要一个 go 模板,它具备以下特性:

    • 原生的 golang 语法
    • 支持模板植入代码
    • 支持模板继承和 include
    • 高性能
    • 语法简单、优雅
    • 自动编译

    基于以上,实现了 hero 模板引擎,用过 nodejs EJS 模板引擎的童鞋应该很容易上手。 hero 目前已经在 http://bthub.io 线上使用。

    Github: https://github.com/shiyanhui/hero

    Gophers ,欢迎 issues 和 pr ,让我们一起共同打造 golang 最好的模板引擎!

    14 条回复    2017-01-17 21:34:23 +08:00
    zzn
        1
    zzn  
       2017-01-17 09:44:56 +08:00
    模版 include 是指什么?
    oott123
        2
    oott123  
       2017-01-17 10:06:10 +08:00
    总觉得模板引擎这东西吧,你用花括号包裹就容易看不清,还不如 /endif 之类来得更舒服(
    Lime
        3
    Lime  
    OP
       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
        4
    qianguozheng  
       2017-01-17 10:23:25 +08:00
    不想写页面。。。
    Lime
        5
    Lime  
    OP
       2017-01-17 10:34:52 +08:00 via iPhone
    @qianguozheng 我也不想写......但有的时候不写还没办法...
    njutree
        6
    njutree  
       2017-01-17 11:00:47 +08:00
    支持支持,不过觉得生存中间文件有点不优雅
    spice630
        7
    spice630  
       2017-01-17 11:07:16 +08:00
    Lime
        8
    Lime  
    OP
       2017-01-17 12:56:06 +08:00
    @njutree 是有点,这个做法有点类似 thrift 和 grpc ,先生成 go 代码,然后在调用之。 为了性能,忍了!
    Lime
        9
    Lime  
    OP
       2017-01-17 12:57:02 +08:00
    @spice630 star 已送,哈哈!
    ivmm
        10
    ivmm  
       2017-01-17 13:03:10 +08:00
    @oott123
    我倒是觉得 end if 的容易和语句混淆, 符号和英文不一样,容易看的出来,就是缩紧一多的确菊花一紧
    ivmm
        11
    ivmm  
       2017-01-17 13:03:23 +08:00
    @ivmm 缩进
    loading
        12
    loading  
       2017-01-17 13:08:35 +08:00 via Android
    怎么这个语法看着眼花呢……
    Lime
        13
    Lime  
    OP
       2017-01-17 13:12:06 +08:00
    @loading 设计的时候我已经尽可能精简了......有代码高亮可能会好点。语法跟 tj 大神的 ejs 有点像 https://github.com/tj/ejs
    qianguozheng
        14
    qianguozheng  
       2017-01-17 21:34:23 +08:00
    @Lime 写接口嘛,比如我最近做服务器想搞个配置一些参数的功能,我就用 web 的 api 来解析,通过 postman 发请求,毕竟是调试阶段,😜
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5545 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:30 · PVG 17:30 · LAX 01:30 · JFK 04:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.