东西好不好,先比一下功能,拿目前最流行的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开源的人。有想法可以留言。