beetl功能与Freemarker功能比较
东西好不好,先比一下功能,拿目前最流行的Freemarker来做比较
完全参考了
Freemarker
官方文档(
2.3.19
)
第一列是freemarker官方文档目录,第二列是表示
beetl
中是否具有同样的功能
通过下列表格,可以看出绝大部分功能, beetl 都是支持的
功能 |
是否支持 |
备注 |
1.1 简介 |
支持 |
|
1.2 模板 + 数据模型 = 输出 |
支持 |
|
1.3 数据模型一览 |
支持 |
|
1.4.1 简介 |
支持 |
|
1.4.2 (.1--.4) 指令示例 |
支持 |
Beetl 中,采用includeFileTemplate 标签来include 一个文件。Beetl 中还支持switch/case |
1.4.2.5 处理不存在的变量 |
支持 |
不支持询问变量是否存在, 但可以通过扩展函数来支持 |
2.1 基本内容 |
支持 |
|
2.2.1 类型 简介 |
大部分支持 |
很少使用的节点类型 不支持 |
2.2.2 标量 |
支持 |
|
2.2.3 容器 |
支持 |
|
2.2.4 方法和函数 |
支持 |
可以通过扩展函数来间接支持 |
2.2.5 其它(节点类型) |
不支持 |
|
3.1 总体结构 |
支持 |
|
3.2 指令 |
支持 |
|
3.3 表达式 |
支持 |
集合操作不支持,但可以通过扩展函数来实现集合操作。 截取字符串也不是内置的,但可以通过扩展函数来实现,如str.subString |
3.3.3.1 字符串 |
支持 |
|
3.3.3.2 数字 |
支持 |
|
3.3.3.3 布尔值 |
支持 |
|
3.3.3.4 序列 |
支持 |
采用js 语法的json 格式支持。但不包括支持 start ..end 这样的方式 |
3.3.3.5 哈希表 |
支持 |
|
3.3.4 检索变量 |
支持 |
|
3.3.5 字符串操作 |
不支持 |
此语法很奇怪,只能说freemaker 复杂了语法 |
3.3.5.2 获取一个字符 |
支持 |
通过扩展函数支持 |
3.3.6.1 序列操作 连接 |
支持 |
通过扩展函数支持 |
3.3.6.2 序列切分 |
支持 |
通过扩展函数支持 |
3.3.7 哈希表操作 连接 |
支持 |
|
3.3.8 算数运算 |
支持 |
|
3.3.9 比较运算 |
支持 |
|
3.3.10 逻辑操作 |
支持 |
|
3.3.11 内建函数 |
支持 |
|
3.3.13 处理不存在的值 |
支持 |
通过扩展函数支持 |
3.3.13.1 默认值 |
部分支持 |
|
3.3.13.2 检测不存在的值 |
支持 |
|
3.3.14 括号 |
支持 |
|
3.3.15 表达式中的空格 |
支持 |
|
3.3.16 操作符的优先级 |
支持 |
无 数字范围 这个概念 |
3.4 插值 |
支持 |
|
4.1 自定义指令 (宏) |
支持 |
间接通过标签等支持 |
4.1.4 嵌套内容 |
支持 |
Beetl 中主要用在layout 标签里 |
4.1.5 宏和循环变量 |
支持 |
|
4.2 在模板中定义变量 |
支持 |
|
4.3 命名空间 |
部分支持 |
通过扩展函数支持, |
4.4 空白处理 |
支持 |
Beetl 中不需要此额外功能 |
4.5 替换(方括号)语法 |
支持 |
|
东西好不好,再比一下性能,那被公认为性能良好的Freemarker做比较
性能比较
单线程:
还是以常用模板为准(大小6K ),循环渲染50000 次,需要时间(毫秒为单位)如下
Beetl1.2M1
解释执行方式(普通模式),运行三次,分别 1356,1365,1348
Beetl1.2M1
编译执行方式(普通模式),运行三次,分别 913,922,905
Freemarker
分别是 1155,1130,1122
Beetl1.2M1
允许字节流优化,解释方式执行三次,分别是 587,605,610
Beetl1.2M1
允许字节流优化,编译方式执行三次,分别是 385,355,370
简而言之,对beetl 做运行时编译,byte 输出设定后,渲染5 万次6K 的模板,性能如下
Freemarker |
Beetl |
1140 毫秒 |
370 毫秒 |
及时不对beetl 做任何优化,性能也与Freemarker 持平
最后,向给位有志从事开源开发的朋友号召,无论你是工作10+年的老手,还是在学习就读的学生,如果愿意从事beetl开发和维护,我非常欢迎。我用了很多业余的精力去一个人搞一个开源的方方面面的工作,感到非常费神。我希望找一个能力突出,愿意去维护beetl开源的人。有想法可以留言。