最近有个同事在写业务的时候,发现往模板引擎里面传数据,怎么传都报错(变量找不到之类的)。我们用的模板引擎是baiduTemplate。而之前并没有出现类似的情况,经过一番排查,发现是使用了use strict
,baiduTemplate源码使用了eval
实现,严格模式下是不能使用eval的。经过了这么大的坑后,打算好好研究下前端模板引擎,就从熟悉的undscore开始吧。
underscore是个非常成熟的前端类库了。现在已经更新到1.83
版本了。关于unserscore的api可以参考其官网文档。本次我们的主题是分析其template模板引擎部分的实现。
##template实现思路
首先我们定义一个字符串:
|
|
模板引擎说的简单点,就是用已知的数据(data)去替换tpl中相应的变量,然后生成一份新的字符串。
怎么替换呢?
这里应该比较明显,用正则去匹配。
var reg = /\{[A-Za-z]*\}/;//匹配{}
var para = reg.exec(tpl);
匹配到第一个{name}后,标志name,并保存其之前的html标签<div>
,然后继续匹配剩余的tpl。
最后,将模板中的标识变为data的数据即可,得到新的html。
大概的思路是这样的,这里面还要考虑如何直接输出js代码,如何过滤等。下面来看看underscore是怎么实现的。
##underscore中实现的模板引擎
|
|
这里不得不提两点:
- 这段代码太经典了,太精彩了,太销魂了。即可以细嚼慢咽,又让人回味无穷。
- underscore
1.8
之前版本的实现跟当前版本有些出入,导致api也不尽相同。最新版已经不支持预编译与解析一句话同时传参搞定了,这本身也是不合理的。现在是先预编译模板得到处理函数,然后再去填充数据。