简单介绍

javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注。

artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,并且充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现。

javascript 模板引擎基本原理

虽然每个引擎从模板语法、语法解析、变量赋值、字符串拼接的实现方式各有所不同,但关键的渲染原理仍然是动态执行 javascript 字符串。

可看:http://cdc.tencent.com/?p=5723 基本原理的例子

artTemplate 高效的秘密

1、预编译
在一般的模板引擎实现原理中,因为要对模板变量进行赋值,所以每次渲染都需要动态编译 javascript 字符串完成变量赋值。而 artTemplate 的编译赋值过程却是在渲染之前完成的,这种方式称之为“预编译”。

2、更快的字符串相加方式
很多人误以为数组 push 方法拼接字符串会比 += 快,要知道这仅仅是 IE6-8 的浏览器下。实测表明现代浏览器使用 += 会比数组 push 方法快,而在 v8 引擎中,使用 += 方式比数组拼接快 4.7 倍。所以 artTemplate 根据 javascript 引擎特性采用了两种不同的字符串拼接方式。

使用方法

1、引用js文件:<script src="js/arttmpl.js"></script>
2、页面中,使用一个type="text/template"的script标签存放模板:

<script id='doctor-template' type="text/template"><% for(var i in data){ var item=data[i]; %><li class="mui-table-view-cell mui-media "><a href="javascript:;" class="mui-navigate-right"><div class="mui-media-object mui-pull-left"><img src="<%=(item.photo)%>" width="100%"><span class="mui-badge mui-badge-danger"><%=(item.score)%>分</span>    </div><div class="mui-media-body"><%=(item.name)%>&nbsp;<span class="mui-badge mui-badge-warning"><%=(item.position)%></span><p class="mui-ellipsis"><%=(item.hospital)%></p><p class="mui-ellipsis"><%=(item.desc)%></p></div></a></li><% } %></script>

模板逻辑语法开始与结束的界定符号为<% 与 %>,若<%后面紧跟=号则输出变量内容。

3、渲染模板

template.render(id, data);

继续上面的例子:

var fragment = template('doctor-template', {"data":[{name:"王静",score:4.5,photo:'images/logo.png',hospital:"江苏省中医院",desc:'妇科、不孕不育症、月经病等',position:'副医师'},{name:"啦啦",score:4.9,photo:'images/logo.png',hospital:"鼓楼医院",desc:'儿童呼吸系统疾病的诊治,对于儿童疾病',position:'主治医师'}]});

不转义HTML

模板引擎默认数据包含的 HTML 字符进行转义以避免 XSS 漏洞,若不需要转义的地方可使用==。

<script id="test" type="text/template">
<%==value%>
</script>

若需要关闭默认转义,可以设置:

template.config('escape', false);

在js中存放模板

var source ='<ul>'+    '<% for (var i = 0; i < list.length; i ++) { %>'+ '<li>索引 <%= i + 1 %> :<%= list[i] %></li>'+'<% } %>'+'</ul>';
var data = {list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var render = template.compile(source);
var html = render(data);
document.getElementById('content').innerHTML = html;

template.compile([id], source)将返回一个渲染函数。其中 id 参数是可选的,如果使用了 id 参数,可以使用template.render(id, data)渲染模板。

添加辅助方法

template.helper(name, callback)辅助方法一般用来进行字符串替换,如 UBB 替换、脏话替换等。

例如扩展一个UBB替换方法:

template.helper('$ubb2html', function (content) {return content.replace(/[b]([^[]?)[/b]/igm, '<b>$1</b>').replace(/[i]([^[]?)[/i]/igm, '<i>$1</i>').replace(/[u]([^[]?)[/u]/igm, '<u>$1</u>').replace(/[url=([^]])]([^[]?)[/url]/igm, '<a href="$1">$2</a>').replace(/[img]([^[]?)[/img]/igm, '<img src="$1" />');
});

在模板中的使用方式:

<%=$ubb2html(content) %>

注意:引擎不会对辅助方法输出的 HTML 字符进行转义。

设置界定符

若前端模板语法与后端语法产生冲突,可以修改模板引擎界定符,例如:

template.openTag = "<!--[";
template.closeTag = "]-->";

GitHub 地址

更多参考文档:http://aui.github.io/artTemplate/

js模板引擎——art Template相关推荐

  1. js模板引擎art template数组渲染的方法

    转载:js模板引擎art template数组渲染的方法 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,模板引擎种类也是五花八门,我就说几个安全性高.错误处理调 ...

  2. html jquery 模板引擎,jquery template.js前端模板引擎

    作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串.浏览器对其进行 ...

  3. JS模板引擎sychelTemplate

    sychelTemplate 简介 0.sychelTemplate希望创造一个用户觉得"简单好用"的JS模板引擎 注:等不及可以直接点左侧导航中的"C.使用举例&quo ...

  4. js模板引擎渐进--if/else(7)

    有了 each 的经验后,要实现 if/else 这种指令就简单了-------在  case '}' 处对 varcode 进行指令的判断即可. 模板代码: {if data.value==1}&l ...

  5. php yii 模板引擎,模板引擎(Template Engines)

    使用模板引擎(Using template engines) 默认情况下,Yii 使用 PHP 作为其默认的模板引擎语言,但是,你可以配置 Yii 以扩展的方式支持其他的渲染引擎, 比如 Twig 或 ...

  6. js模板引擎 之handlebars.js

    最近在接触郑州知识库,里面使用到的技术是值得自己学习的. 该项目前端使用的是handlebars.js模板引擎框架.模板引擎框架用于数据与结构分离的思想,实现页面动态分离的效果. 1.为什么使用模板引 ...

  7. 解决laytpl.js模板引擎插件加载模板后无法获取模板中的元素id等内容

    一.问题描述 在页面中使用laytpl.js模板引擎,在页面加载后无法使用jquery获取模板中的html元素,以下是图片和代码: 在添加或修改完毕后重新加载页面,不能使用jquery获取模板中的ht ...

  8. js模板引擎渐进--后记

    至此,算是完成了一个系列了. 本来是想写的更详细的,但是太详细每次说的东西就少的可怜. 在学习的过程中,每次的改进改动博主都是复制一个新的文件进行,整个有二十多篇,中间有很多小细节的东西,集中在 ea ...

  9. js模板引擎Nunjucks

    js模板引擎Nunjucks Nunjucks中文文档

最新文章

  1. 创建在“system.net/defaultProxy”配置节中指定的 Web 代理时出错。
  2. java aes php_php和java的aes默认加密算法有点区别及解决方法。
  3. CARTA:Gartner的持续自适应风险与信任评估战略方法简介
  4. Day1 字符串格式化
  5. 分布式ID-数据库多主模式
  6. process.cwd __dirname __filename 区别
  7. Python 第三方模块之 beautifulsoup(bs4)- 解析 HTML
  8. php漏洞书籍,PHP漏洞全解(一)-PHP网站的安全性问题
  9. 6. 隐藏 index.php
  10. 图文详细解说DevExpress 2015新版亮点【附文档下载】
  11. Jupyter Notebook代码字体更改
  12. flash builder java_如何在具有Java 1.7的OSX上运行FlashBuilder 4.7
  13. SMART200 DP01模块通讯问题
  14. Windows 实时语音转文字|免费语音视频翻译转文字|语音会议记录方案
  15. 如何进行网站流量分析?你需要知道这些指标
  16. 关于错误local variable ‘str‘ referenced before assignment
  17. Structure of a Google Docs document 谷歌文档的结构
  18. Vue.js中$refs{}获取DOM元素
  19. Python爬取手机壁纸
  20. STC89C52RC单片机控制流水灯

热门文章

  1. java swing实现简单图片显示(测试生成图片快捷方式)
  2. [Swift]多维数组的表示和存储:N维数组映射到一维数组(一一对应)!
  3. swiper轮播后hover无效问题解决案例
  4. 实验室信息管理系统(南京浩展软件)
  5. PHP5.6.6上运行 ecshop 2.7.3常见问题处理
  6. 2013/8月读书计划
  7. Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
  8. Android UI事件处理
  9. Linux学习日记:第二天
  10. scrapy-redis 分布式哔哩哔哩网站用户爬虫