如图5-1所示,模板引擎通过将数据和模板组合在一起生成最终的HTML,而处理器则负责调用模板引擎并将引擎生成的HTML返回给客户端。
如前所述,Web模板引擎演变自SSI(服务器端包含)技术,并最终衍生出了诸如PHP、ColdFusion和JSP这样的Web编程语言。这种演变导致的一个结果是模板引擎并没有相应的标准,并且对各个因为不同原因创造出来的模板引擎来说,它们拥有的特性也是五花八门、各不相同的。不过大致来讲,我们可以把模板引擎划分为两种理想的类型,这两种类型的模板正好处于两个极端。
图5-1 模板引擎通过组合数据和模板来生成最终展示的HTML
- 无逻辑模板引擎(logicless template engine)——将模板中指定的占位符替换成相应的动态数据。这种模板引擎只进行字符串替换,而不执行任何逻辑处理。无逻辑模板引擎的目的是完全分离程序的表现和逻辑,并将所有计算方面的工作都交给处理器完成。
- 嵌入逻辑的模板引擎(embedded logic template engine)——将编程语言代码嵌入模板当中,并在模板引擎渲染模板时,由模板引擎执行这些代码并进行相应的字符串替换工作。因为拥有在模板里面嵌入逻辑的能力,所以这类模板引擎能够变得非常强大,但与此同时,这种能力也会导致逻辑分散遍布在不同的处理器之间,使代码变得难以维护。
因为不需要进行逻辑处理,所以无逻辑模板引擎的渲染速度往往会更快一些。一些模板引擎虽然自称是无逻辑模板引擎,但它们实际上并非只执行字符串替换操作。比如,Mustache虽然自称是无逻辑模板引擎,但它实际上也提供了一些能够执行条件判断操作和循环操作的标签(tag)。
另外,最极端的嵌入逻辑模板引擎通常表现得跟普通的编程语言一样,比如PHP就是一个很好的例子:PHP一开始是作为独立的Web模板引擎出现的,但今时今日的很多PHP页面已经很难看到哪怕一行HTML代码,我们甚至已经不太可能继续把PHP看作是一个模板引擎了,实际上PHP本身就拥有很多模板引擎,比如,Smarty
和Blade
都是为PHP构建的。
对于嵌入逻辑模板引擎的最大争论,就是认为它把表现和逻辑搅合在了一起,并将逻辑分散在多个不同的地方,导致代码变得难以维护。而对于无逻辑模板引擎的争论则是认为这种理想化的模板引擎并不实用,并且会导致处理器需要包含更多逻辑,特别是表现方面的逻辑,并因此给处理器带来不必要的复杂度。
在实际中,绝大多数有用的模板引擎都会介于以上这两种理想的模板引擎之间,其中有些模板引擎更接近于无逻辑模板引擎,而其他一些模板引擎则更接近于嵌入逻辑模板引擎。Go标准库提供的模板引擎功能大部分都定义在了text/template
库当中,而小部分与HTML相关的功能则定义在了html/template
库里面。这两个库相辅相成:用户可以把这个模板引擎当做无逻辑模板引擎使用,但与此同时,Go也提供了足够多的嵌入式模板引擎特性,使这个模板引擎用起来既有趣又强大。