最好的模板引擎Beet的6大创新点

2011年发布Beetl 0.5的时候,新闻是在Iteye上发布的,老资格程序员可能预料Iteye上会发生什么了,我收到的最多的不是鼓励和喝彩,而是吐槽,”又是一个轮子“是里面最大的声音。尽管4年前的版本还只是个雏形,但实际上已经开始有了与众不同创新点。我将在本文介绍一下Beetl的创新点和创新思路,希望有志从事开源开发的人能借鉴

首先,Beetl是一个脚本风格的模板,这顺应了新时代程序员的审美。

freemarker 当初为什么能从模板引擎中脱颖而出,其实与当时XML流行无不关系。程序员习惯了用XML来处理问题,配置也好,流程说明也好,交互接口也好,无处不有XML,像我一样的大多数程序员,自然就接收了freemaker, 当我在确定Beetl的风格的时候,首先就排除了XML,因为2010后,XML已经不流行了,程序员更加务实了。我打开记事本,写了几种风格的模板语法,最后还是确定了类似JS风格

var a = 1;
var b= a+2;
for(item in items){
    print(item.name);
}

尽管语法上没有创新,但将脚本风格的语法应用在模板上还是创新的,独此一家。这是因为:

  • 视图渲染往往有更复杂的渲染逻辑,freemaker的xml风格,还是velociy指令风格,力不从心。脚本风格顺应了视图渲染更加复杂和难搞这一事实。
  • JS 语法渗透了现在各个编程各个方面,程序员习惯了JS语法,也自然习惯了在模板引擎中使用类似js语法风格的模板引擎

其次,Beetl 能自定义定界符和控制符号,独此一家

模板语言是嵌入在模板里的,所有涉及到定界符号和站位符号,其他模板语言定界符号都是固定的,如JSP总是用<%%> ,php 用的是<?  ?>,veclociy 是采用# 和回车换号符号。Beetl 则完全能自定义定界符和占位符号,适用于各种应用场景,比如可以定义#和回车作为定界符号

#for(item in items){
<td>${item.name}</td>
#}

也可以定义注释符号作为定界符

<!--: for(item in items){ -->
<td>${item.name}</td>
<!--:}-->

正如Beetl能自定义定界符和站位符号,Beetl也许是唯一一个能用beetl模板生成beetl模板的模板引擎,而其他模板引擎则太费劲才能完成这个任务

第三: Beetl能对语法树做定制,从而改变渲染逻辑的模板引擎,又是独此一家的模板引擎

Beetl在线体验里,有beetl语法体验,可以输入beetl代码,运行,获得期望输出,如果用户输入while(true), 这将对服务器造成伤害,大部分后来跟随Beetl的在线体验模板引擎,比如freemarker,rythmn,tinytemplate 都对此无能为力,或者通过kill thread方式来避免用户乱搞。但Beetl不是,Beetl定制了While循环处理节点,循环超过5次就结束循环。

还有在我主导的另外一个开源Beetl SQL里,也有类似需要,如下SQL模板,

select * from user where 1=1
-- if(user.name!=null)
and name = ${user.name}
--}

(注,--是定界符,伪装成注释,这样容易在sql客户端调试)当执行模板的时候,${user.name} 并不是需要输出其属性值,而是需要输出?,并记录其值以便随后操作

select * from user where 1=1
and name = ?

只需要定制Beetl模板引擎,修改
PlaceholderST
 
节点,改成如下代码即可

public final void execute(Context ctx)
{
	Object value = expression.evaluate(ctx);
	ctx.byteWriter.writeString("?");
	List list = (List)ctx.getGlobal("_paras");
	list.add(value);
}

定制模板引擎作为高级特性,已经有数个项目被应用到,这在其他模板引擎里不可想象的

第四:Beetl 支持Ajax标记,完美将模板开发和Ajax开发结合起来。

在Beetl推出Ajax标记之前,前端开发者都认为模板引擎和Ajax水火不容,Beet改变了这个现状,通过推出Ajax标志支持,完美结合了模板引擎渲染和无刷新的Ajax。消除了各自的缺点

<div id="table-container" >
<%
//ajax片段开始
#ajax userTable: {
%>

<table>
        <tr><td width=100>id</td><td width=100>姓名</td></tr>
        <%for(user in users){%>
        <tr><td>${user.id}</td><td>${user.name}</td></tr>
        <%}%>
</table>

当前页面<span id="current">${page!1}</span><span style="width:20px"></span>
<a href="#"><span  class="page">next</span></a> <a href="#" ><span  class="page">pre</span></a>
<%
//ajax片段结尾
}
%>

如上代码所示,如果渲染整个页面,如render("user.html").则ajax标记忽略,模板正常渲染,如果后台仅仅渲染render("user.html#userTable"); 则模板引擎会找到userTable 的标记,仅仅渲染这一部分。

正如在我的文章里提到过,单存用js来实现ajax,会有一些问题,如

  • SEO无法优化;
  • 头一次访问页面无法立即看到内容,
  • 还有对服务器造成过多并发量等

用了Beetl Ajax标记,能完美解决这些问题,其他模板引擎,无论是老资格Freemaker,还是新出现的tinytemplate,都不具备这个功能。我觉得这些模板引擎应该顺应web技术发展新方向,像Beetl那样推出ajax局部渲染技术

第五,Beetl支持单独模板测试,无需控制层以及其提供的模型

尽管所有模板引擎支持MVC分层开发,但实际上在Beetl之前,谁能正正提供分层呢?所谓分层开发,不但是可以单独开发,而且还需要单独测试而无需其他层(M和V)。也只有Beetl才能做到这真正做到一点,关于如何实现,可以参考官网,或者我的一个开源项目BingoUI,没有用任何后台代码实现的一个UI标签库,一套前端代码同时支持pc和mobile

第六,模板语法里有创新语法,也借鉴了其他语言的语法。

Beetl虽然引用在模板领域,但实际上本质上时个脚本语言,为了模板输出定制的语言,因此他有许多创新语法,着在其他模板引擎里很少有,或者他们都是借鉴Beetl的

  1. 安全输出,user.wfie.name!"单身",安全输出指不存在或者为null的时候输出,可以是常量或者表达式
  2. 省略的三元表达式,${success?"checked"},如果条件为true,输出checked,否则,什么都不输出
  3. for(){ } elsefor {}  不像语言,如果没有进入循环,什么事情都不需要做,模板语言则不同,因此提供elsefor,这是为模板引擎定制的
  4. directive safe_output_open 指令,比如打开安全输出,这样,后面代码都不需要输入安全输出符号!
  5. 模板变量,允许模板输出到一个变量里,方便以后使用,如在继承布局里经常使用模板变量
  6. ajax标记,如前说叙
  7. select- case 语法,类似go或者swift里的switch-case
  8. 虚拟属性语法 如 list.~size.

除此之外,还有很多实用功能,,比如

  1. 本地调用安全管理器
  2. 直接调用java代码
  3. html 标签(定制后能支持父子标签,貌似只有jsp tag能做到)
  4. 绑定标量的html标签,如<#cms:content id = "" var ="item">...</#cms:content>
  5. 最完善的错误提示,甚至因为中文标点导致语法错的提示都有

 总结 

Beetl是个功能强大模板引擎,是除了jsp以外,唯一同时兼顾了脚本和标签的模板语言,本文仅仅列出了Beetl创新部分,回击那些轮子党的轮子言论(尽管轮子党人数庞大,但他们只有一个言论,这很搞笑),让有志从事开源的开发者们借鉴我的开源思路。  同时本文也展示了模板引擎的生命力仍然可以持续和古老的模板引擎技术仍然发扬光大,顺应时代潮流和现代程序审美观。

时间: 2024-12-22 19:28:13

最好的模板引擎Beet的6大创新点的相关文章

js模板引擎介绍搜集

js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTemplate等),如何从这么多纷繁的模板引擎中选择一款适合自己的呢,笔者最近对主流的js模板引擎(mustache,doT,juicer,artTemplate,baiduTemplate,Handlebars,Underscore)做了一番调研,分享出来希望对大家有用. 从这几个指标来比较js模板

调研js模板引擎

js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTemplate等),如何从这么多纷繁的模板引擎中选择一款适合自己的呢,笔者最近对主流的js模板引擎(mustache,doT,juicer,artTemplate,baiduTemplate,Handlebars,Underscore)做了一番调研,分享出来希望对大家有用. 从这几个指标来比较js模板

浅析js模板引擎

js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTemplate等),如何从这么多纷繁的模板引擎中选择一款适合自己的呢,笔者最近对主流的js模板引擎(mustache,doT,juicer,artTemplate,baiduTemplate,Handlebars,Underscore)做了一番调研,分享出来希望对大家有用. 从这几个指标来比较js模板

十大模板引擎

1) Jade Jade是一个有着完善API和惊艳特性的JavaScript模板引擎.使用空白与缩进敏感的代码格式编写HTML页面.基于Node.js,运行在服务器端. 2) Mustache Mustache是一个logic-less(无逻辑或轻逻辑)语法模板.可以用于组织HTML.配置文件.源代码在内的任何东西.Mustache使用JavaScript对象的值,用来扩展模板代码中的大括号标签. 3) Transparency Transparency是一个强大的客户端模板引擎,用来将数据绑定

artTemplate模板引擎学习实战

在我的一篇关于智能搜索框异步加载数据的文章中,有博友给我留言,认为我手写字符串拼接效率过低,容易出错.在经过一段时间的摸索和学习之后,发现现在拼接字符串的方法都不在是自己去书写了,而是使用Javascript引擎.而javascript引擎的实质就是帮我们把带有JavaScript代码的伪THTML语句编译为HTML. 如果有不了解的朋友,可以前往这两篇文章: 淘宝购物车页面 PC端和移动端实战 淘宝购物车页面 智能搜索框Ajax异步加载数据 源码地址: GitHub:Uncle-Keith 回

《开源框架那点事儿25》:对框架模板引擎实现方式的改造实录

点滴悟透设计思想,Tiny模板引擎优化实录! 增加框架设计兴趣小组:http://bbs.tinygroup.org/group-113-1.html Tiny模板引擎的实现方式原来是採用的编译方式,近期发生了一些问题.因此我认为有必要把编译方式调整为解释方式,为此就開始了此次实现活动. 编译方式存在的问题 当时採用编译方式.主要是考虑到编译方式在执行时不必再去遍历语法树.因此就採用了编译方式. 可是在实际应用其中,出现了例如以下问题: 文件路径冲突的问题 因为採用的是编译方式,这个时候就存在在

Smarty模板引擎技术(一)

一.Smarty模板引擎简介 什么是smarty? Smarty是采用php写的一个模版引擎,设计的目的是要将php代码与html代码分离,使php程序员只专注于php代码的编写,网页美工只专注于网页的美化 没有模版引擎时出现的问题? html中php代码比重越来越大 页面的数量越来越多 程序设计与美工设计分工不明确 传统的php文件: 1. php代码跟html混编在一起,不利于程序员和美工的分工,程序员和美工不能同时修改一个文件 2.数据的传递同一页面传递,php数据在页面中的显示需要使用p

JavaScript模板引擎实现数据交互

经过1年的磨练,近期终于稍微明白到,前端是怎么做到企业要求的:数据交互. 1,ajax+json这个是必须学的,但没问题,我们可以通过这个博客来慢慢了解怎么回事? 2,可以通过JS框架和JS模板来实现,但最后还是要用到ajax+json的. 注意:个人建议 假如项目页面数量是少于50-100个的,那么推荐使用JS模板:如果大于100个的用JS框架.各有各优势嘛. 今晚的博客分几次写完,看到这句话删除就证明已经写完了. 先分享JS模板的内容:我这次推荐使用百度的模板引擎,因为他比腾讯的art运行速

推荐13款javascript模板引擎

javaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于javascript 实现的模板引擎,类似于 Microsoft’s jQuery template plugin,但更简单易用! 2. EasyTemplate 在使用过Freemarker模 板后,感觉它的 语法比较朴实,平易近人,容易上手,于是决定按它的语法风格实现一个前端的 模板引擎,这就有了