【原创】Regularjs: 用于创建数据驱动组件的新一代的活动模板引擎
发布于 10 年前 作者 leeluolee 7487 次浏览 最后一次编辑是 8 年前

是的,又是一个模板引擎,这种低级轮子竟然还有人造,在朋友你反驳之前,请先容我挣扎以下。

Regularjs是一个结合了字符串模板dom模板的优点的活动模板引擎(living template engine), 准确的说这个模板引擎的parser部分是基于字符串的而compiler部分是基于Dom的。而普遍市面上的模板不是纯粹基于字符串就是纯粹基于dom.

首先先回答两个基本问题。

什么是基于字符串的模板?

例子: ejs、handlebar、jade等 特点是有独立的parser来处理特有的语法,它的一般工作原理是

  1. parse 字符串模板, 输出中间状态 (函数或者ast->函数)
  2. 输入data,生成字符串,输出之后数据data与输出字符串不再有关联
  3. 插入字符串到指定位置(innerHTML等)

特点是:

  1. 语法灵活,自由度高,只输出必要的部分
  2. compile之后数据与输出不再关联,即它是"死的"

什么又是基于Dom的模板?

例子: angularjs, knockoutjs, avalonjs等

特点是没有自己的parse过程,一般工作原理是

  1. 将模板字符串插入到dom中,生成初始dom结构
  2. 自顶向下遍历输出的dom结构,提取指令事件等信息(通过getAttribute),改写dom结构(link)或形成绑定关系
  3. 输入数据data, 根据绑定关系触发dom结构变化(这一步可能与步骤2同时进行)

其实纯粹的dom-based的库其实不能称之为模板引擎. 它的特点是:

  1. 无parse,需要利用停留在初始dom结构上的属性信息来处理业务逻辑, 逻辑能力普遍基于指令或类似的定义,灵活度低。
  2. 生成的dom仍与data有关联,即是“活的”

什么又是活动模板引擎

简而言之,是基于字符串的parser + 基于dom的comiper,它的一般工作原理是

  1. 输入字符串模板 ,输出AST结构,例如regularjs的中间结构示例
  [
   {
    "type": "list",
    "sequence": {
      "type": "expression",
      "body": "_d_['items']",
      "constant": false,
      "setbody": "_d_['items']=_p_"
    },
    "variable": "item",
    "body": [
     ... for short ...
  ]
  1. compiler利用AST里包含的完整信息,逐级创建节点并组装成dom结构. 并实现绑定关系
  2. 输入data,根据数据-模板对应关系,最小化更新节点。

这种模板结合了字符串模板和dom模板的优势,只需要需要输出的内容,不会留不必要的placeholder在节点上(输入后右键查看元素: angularjs, regularjs),并且贴合了以前使用模板引擎的习惯,拥有完全自治的生命周期可以无缝与你正在使用框架继承(包裹angularjs)。

最后,有兴趣可以关注Regularjs的主页中文指南.

最最后,吐槽下Cnode的markdown样式实在太丑了。

1 回复
回到顶部