前端模板引擎

作者:heero 来源:heero博客 时间:2010-07-27 12:33:00 

说起模板引擎,很多人会认为这是后台的东西(如PHP的Smarty、Java的Velocity),跟前端没有关系。然而,随着前端的逻辑变得越来越复杂,引入模板技术已经是非常必要了。

模板引擎的主要功能就是把变化的数据融入到不变的模板中,并生成最终结果。目前,前端的主要数据格式无非是XMLJSON

如果选择XML作为数据格式,XSLT就是最佳的模板语言。大三时做的一个社团网站就是采用了这样的模式。XML+XSLT的缺点非常明显:

  • 兼容性问题。XML+XSLT在不同浏览器下的转换方式有所不同。

  • XML、XSLT的语法都是极其冗余的,数据量相对较大。

如果选择JSON作为数据格式,似乎没有原生的模板语言可用,只能生拼字符串。例如,把下面代码中的data转换成一个表格:

var data = [
  { id : 1, name : 'Google', url : "google.com" },
  { id : 2, name : '百度', url : "baidu.com" },
  { id : 3, name : '有道', url : "youdao.com" }
], html = [];

html.push('<table>');
for (var i = 0; i < data.length; i++) {
  html.push('<tr>');
  html.push('<td>', data[i].id, '</td>');
  html.push('<td><a href="http://', data[i].url, '" target="_blank">', data[i].name, '</a></td>');
  html.push('</tr>');
}
html.push('</table>');

document.write(html.join("\r\n"));

看到这么多单引号、双引号之后,我觉得很头晕。这明显是不可取的。恰巧,大三下学期实习的时候,在一位前辈的代码中看到一种正则表达式做的简单模板引擎

function parseTemplate(data, tpl) {
  return tpl.replace(/\{\$(\w+)\}/g, function($0, $1) {
    return data[$1];
  });
}

有了parseTemplate后,连接字符串的过程就可以简化为(粗体部分为模板):

html.push('<table>');
for (var i = 0; i < data.length; i++) {
  html.push(
    parseTemplate(data[i], '<tr><td>{$id}</td><td><a href="{$url}" target="_blank">{$name}</a></td></tr>')
  );
}
html.push('</table>');

这样优化过后,代码清晰了一点。然而,这种模板引擎无法应付稍微复杂一点的逻辑。假设我要突出显示排在第一位的数据,parseTemplate就无能为力了。

模板引擎必须要支持for、if等简单逻辑,否则其应用范围就会非常小。然而,要支持这些逻辑,又必须要有一套完善的语法系统。后来,还是著名的Javascript大师John Resig给我们解决了这个问题。他写了一个非常简短的函数实现了支持Javascript语法的模板引擎(详见此处)。其原理是把模板语言“编译”为Javascript的原生语法。这个引擎的优点在于:

  • 可以使用任何Javascript支持的语法。

  • Parse模板的过程在闭包内执行,不会产生全局变量。

  • 对“编译”后的模板进行了缓存,下次可以跳过“编译”的过程直接使用。

我对这段代码进行了少量改造,添加到jRaiser中,也就是jRaiser.util.parseTpl。主要是把模板语言中的“<%”和“%>”改成了“<#”和“#>”,因为前者容易与后端模板产生冲突。利用这个模板引擎,上面的代码可以再简化为:

var template = '\
<table>\
<#  for (var i = 0; i < data.length; i++) {  #>\
  <tr>\
    <td><#=data[i].id#></td>\
    <td><a href="<#=data[i].url#>" target="_blank"><#=data[i].name#></a></td>\
  </tr>\
<#  }  #>\
  \
</table>'
;

document.write( $.util.parseTpl(template, { data : data }) );

至此,显示的逻辑已经完全在模板里面,代码清晰明了。

标签:JSON,XML,前端,模板引擎
0
投稿

猜你喜欢

  • Sql Server 2005的1433端口打开局域网访问和进行远程连接

    2024-01-26 10:57:52
  • 纯JS实现动态时间显示代码

    2024-05-02 17:31:34
  • 从IIS到SQL Server数据库安全

    2008-12-24 15:58:00
  • Go 防止 goroutine 泄露的方法

    2024-04-26 17:26:28
  • 深刻理解Oracle数据库的启动和关闭

    2010-07-26 13:08:00
  • Python异常之常见的Bug类型解决方法

    2022-09-02 15:17:14
  • ASP实现多域名同一空间的处理实例

    2008-10-29 09:46:00
  • JavaScript队列函数和异步执行详解

    2024-04-22 13:26:21
  • Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释

    2022-06-01 11:09:45
  • Python ini文件常用操作方法解析

    2022-01-07 09:52:44
  • SqlServer 巧妙解决多条件组合查询

    2023-07-01 14:15:00
  • SQL Server内存遭遇操作系统进程压榨案例分析

    2024-01-14 06:58:51
  • Go本地测试小技巧解耦任务拆解

    2023-08-29 14:09:26
  • ACCESS 2007出现“错误 '80040e14'“

    2008-06-19 13:21:00
  • 使用Python进行QQ批量登录的实例代码

    2021-07-14 16:58:04
  • 软件测试实现Finddler的手机抓包过程

    2023-12-27 03:36:40
  • Oracle to_char函数的使用方法

    2024-01-19 01:47:37
  • python字典排序实例详解

    2021-10-12 12:12:02
  • Python抓取今日头条街拍图片数据

    2021-11-03 12:30:57
  • 分享8 个常用pandas的 index设置

    2023-10-24 14:22:13
  • asp之家 网络编程 m.aspxhome.com