是的,又是一个模板引擎,这种低级轮子竟然还有人造,在朋友你反驳之前,请先容我挣扎以下。
Regularjs是一个结合了字符串模板和dom模板的优点的活动模板引擎(living template engine), 准确的说这个模板引擎的parser部分是基于字符串的而compiler部分是基于Dom的。而普遍市面上的模板不是纯粹基于字符串就是纯粹基于dom.
首先先回答两个基本问题。
什么是基于字符串的模板?
例子: ejs、handlebar、jade等 特点是有独立的parser来处理特有的语法,它的一般工作原理是
- parse 字符串模板, 输出中间状态 (函数或者ast->函数)
- 输入data,生成字符串,输出之后数据data与输出字符串不再有关联
- 插入字符串到指定位置(innerHTML等)
特点是:
- 语法灵活,自由度高,只输出必要的部分
- compile之后数据与输出不再关联,即它是"死的"
什么又是基于Dom的模板?
例子: angularjs, knockoutjs, avalonjs等
特点是没有自己的parse过程,一般工作原理是
- 将模板字符串插入到dom中,生成初始dom结构
- 自顶向下遍历输出的dom结构,提取指令事件等信息(通过getAttribute),改写dom结构(link)或形成绑定关系
- 输入数据data, 根据绑定关系触发dom结构变化(这一步可能与步骤2同时进行)
其实纯粹的dom-based的库其实不能称之为模板引擎. 它的特点是:
- 无parse,需要利用停留在初始dom结构上的属性信息来处理业务逻辑, 逻辑能力普遍基于指令或类似的定义,灵活度低。
- 生成的dom仍与data有关联,即是“活的”
什么又是活动模板引擎
简而言之,是基于字符串的parser + 基于dom的comiper,它的一般工作原理是
- 输入字符串模板 ,输出AST结构,例如regularjs的中间结构示例
[
{
"type": "list",
"sequence": {
"type": "expression",
"body": "_d_['items']",
"constant": false,
"setbody": "_d_['items']=_p_"
},
"variable": "item",
"body": [
... for short ...
]
- compiler利用AST里包含的完整信息,逐级创建节点并组装成dom结构. 并实现绑定关系
- 输入data,根据数据-模板对应关系,最小化更新节点。
这种模板结合了字符串模板和dom模板的优势,只需要需要输出的内容,不会留不必要的placeholder在节点上(输入后右键查看元素: angularjs, regularjs),并且贴合了以前使用模板引擎的习惯,拥有完全自治的生命周期可以无缝与你正在使用框架继承(包裹angularjs)。
最后,有兴趣可以关注Regularjs的主页和中文指南.
最最后,吐槽下Cnode的markdown样式实在太丑了。
#支持支持