art-template使用笔记

art-template 是前端的一个高性能 JavaScript 模板引擎,它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行性能。

通过下面一张图可以大致了解下 art-template 与其他方式渲染HTML页面的性能比较:

具体跟 Vue、React 这些前端主流框架比较的性能,官方并未给出数据,但是我认为只比较页面渲染能力的话,应该相差不多, Vue、React 是一整套的前端解决方案,而 art-template 只是一个 js模板引擎,二者定位和功能不同,不做详细比较,猜测 art-template 同样是使用虚拟 DOM 的方式进行页面渲染,否则能达到这样的性能,着实不容易。就学习而言,如果学习过 Vue、React,学这个非常简单,反过来学会 art-template 对学习 Vue、React也有一定帮助。

在网上查询资料的时候,发现 art-template 好像是腾讯团队开发开源的,了解到这个情况的时候,心中少不了吐槽,不可否认东西确实好用,但是架不住腾讯团队写的文档烂啊!!腾讯团队什么时候能在文档上面长点心,学学隔壁的阿里。废话不多说了,简单写下容易遇到的问题。

初始化问题

关于 art-template 模板编写语法很简洁; template 对象的初始化也非常简单,只有两行代码,

模板编写:

<script id="art-template" type="text/html">
<table>/******/<tbody>{{each classInfoList}}<tr><td>{{$index+1}}</td><td>{{$value.Id}}</td><td>{{$value.Name}}</td><td>{{$value.Teacher}}</td><td>{{$value.Remark}}</td><td><a href="{{$value.Uri}}">删除</a></td></tr>{{/each}}</tbody>
</table>
</script>

template对象初始化:

var html = template("art-template", datas);
document.getElementById('app').innerHTML = html;
  • "art-template" 是定义好的模板的 id
  • datas 是需要渲染的数据

JS执行时间、顺序问题

在网上找到的 Demo 大多都是在 js 里面写一个假数据,用定义好的数据去初始化 template 对象,例如:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>basic-demo</title>
<script src="../dist/template.js"></script>
</head>
<body>
<div id="content"></div>
<script id="test" type="text/html">
{{if isAdmin}}
<h1>{{title}}</h1>
<ul> {{each list as value i}} <li>索引 {{i + 1}} :{{value}}</li> {{/each}}
</ul>
{{/if}}
</script>
<script>
var data = { title: '基本例子', isAdmin: true, list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>

因为以前主要使用 Vue ,Vue 是有动态渲染,但是忘记了这个并没有提到是动态渲染,同时项目开发时,数据大多通过 Ajax 从后台获取,因此在开始时,将 template 对象初始化放在了 ajax 回调函数外,因为 ajax 请求数据需要花费时间,同时js代码跟后台代码执行顺序不同,并不是按行数依次执行,所以前期导致一直渲染失败。应注意 js 代码执行顺序和执行时间的问题。

完整ajax代码如下:

var datas = {title: "",classInfoList: []
}
$.ajax({type: "GET",dataType:"JSON",url: "/ClassHandler.ashx",success: function (data) {//原生JS序列化JSOn//datas.classInfoList = JSON.parse(data).classInfoList;datas.classInfoList = data.classInfoList;datas.title =data.title;html = template("art-template", datas);document.getElementById('app').innerHTML = html;}
})

template数据初始化问题

在上面也看到,序列化 template 对象一共传了两个参数,一个是模板的 Id,另外一个是数据。

但是这个数据有个一问题,如果返回回来的 JSON 数据是类似数组数据的话,是没有办法直接渲染的,如:

 [{"Id": 0,"Name": "班级0","Teacher": "教师0","Remark": "这是班级0的简介","Uri": "/deleteClass.ashx?id=0"}, {"Id": 1,"Name": "班级1","Teacher": "教师1","Remark": "这是班级1的简介","Uri": "/deleteClass.ashx?id=1"}, {"Id": 2,"Name": "班级2","Teacher": "教师2","Remark": "这是班级2的简介","Uri": "/deleteClass.ashx?id=2"}]

这个样子是没有办法直接进行渲染,需要对数据如上述代码块包装,才能正常渲染。

如果返回 JSON 数据为:

{"classInfoList": [{"Id": 0,"Name": "班级0","Teacher": "教师0","Remark": "这是班级0的简介","Uri": "/deleteClass.ashx?id=0"}, {"Id": 1,"Name": "班级1","Teacher": "教师1","Remark": "这是班级1的简介","Uri": "/deleteClass.ashx?id=1"}, {"Id": 2,"Name": "班级2","Teacher": "教师2","Remark": "这是班级2的简介","Uri": "/deleteClass.ashx?id=2"}],"title": "软件学院班级列表"
}

可以直接初始化 template 对象,并进行渲染(模板不变)

<script>$.ajax({type: "GET",dataType:"JSON",url: "/ClassHandler.ashx",success: function (data) {html = template("art-template", data);document.getElementById('app').innerHTML = html;}})
</script>

template 对象初始化需注意地方

API: template(filename, content)

根据模板名渲染模板。

  • 参数:

    • {string} filename
    • {Object,string} content
  • 返回值:
    • 如果 contentObject,则渲染模板并返回 string
    • 如果 contentstring,则编译模板并返回 function

浏览器版本无法加载外部文件,filename 为存放模板的元素 id

因为渲染的时候,数据大多从后台获取,后台返回的数据可能为字符串或JSON,如果第二个参数(content)传进来的是字符串的话,没有报错,但是渲染会失败,渲染结果如下:

因此,需注意 template 初始化赋值时,数据格式是否正确。

渲染问题

each 循环渲染问题

关于循环的语法,官方文档上写的很简洁:

默认在遍历 target 时,有两个值,value和index,其中 value 是单个对象值,index 是下标。

根据文档所写,我把

{{each classInfoList}}<tr><td>{{$index+1}}</td><td>{{$value.Id}}</td><td>{{$value.Name}}</td><td>{{$value.Teacher}}</td><td>{{$value.Remark}}</td><td><a href="{{$value.Uri}}">删除</a></td></tr>
{{/each}}

修改为:

{{each classInfoList val key}}<tr><td>{{$key+1}}</td><td>{{$val.Id}}</td><td>{{$val.Name}}</td><td>{{$val.Teacher}}</td><td>{{$val.Remark}}</td><td><a href="{{$val.Uri}}">删除</a></td></tr>
{{/each}}

浏览器在渲染的时候就报错了:

至今不清楚,是我没领会文档说明,还是 art-template 团队忘了维护文档了。

结语

本文只是 art-template js模板引擎的简单使用,还有其他几个接口、方式没有逐一介绍,在我看来这些已经能够满足基本的开发使用,至于更加复杂的渲染、渲染切换,Vue 比 art-template 省心。如有兴趣继续研究 art-template ,附上官方文档及参考博客链接。


参考文档:

  • art-template 官方文档
  • art-template官方API文档
  • js模板引擎-art-template常用总结

art-template踩坑相关推荐

  1. 【Vue】Vue1.0+Webpack1+Gulp项目升级构建方案的踩坑路

    最近半年在维护公司的一个管理后台项目,搭建之初的技术栈比较混乱,构建方案采用了Gulp中调用Webpack的方式,Gulp负责处理.html文件,Webpack负责加载.vue..js等.而在这一套构 ...

  2. 踩坑 :vue2 ajax异步请求数据,层数太多,页面无法渲染

    刚接触vue2不是太久,勉强算是小白一枚吧,在此分享一下我最近踩的一个坑,望以后的小白们借鉴: 首先,数据结构: data(){ return { outer: { mid: [{ inner: &q ...

  3. Ubuntu 配置大数据平台hadoop hive数据仓库之完整踩坑

    导读:作为大数据界的萌新,这篇文章的写作过程,经历了各种阻挠,也踩了无数坑,俗话说面向CSDN.度娘编程,然后多看官方文档,在遇到各种神奇的坑的时候,搜着搜着就到了国外,刹那间一大堆英文向你飞来,就知 ...

  4. restTemplate使用和踩坑总结

    日常工作中肯定会遇到服务之间的调用,尤其是现在都是微服务的架构,所以总结一下restTemplate的最常用的用法以及自己踩过的坑. restTemplate的使用 restTemplate底层调用的 ...

  5. vantUI组件:van-card 自定义内容 - 踩坑篇

    vantUI组件:van-card 自定义内容 - 踩坑篇 特别说明: 自定义用法,格式必须: <van-card> <template #tags> ····自定义内容·· ...

  6. Vant-UI 表单组件(Field组件):验证表单元素表单提交 - 踩坑篇

    Vant-UI 表单组件(Field组件):验证表单元素&&表单提交: 示例截图 · 如下: 示例 · 详细代码 · 如下: <template><div class ...

  7. Mint-UI框架router-link返回上一页的方法 - 踩坑篇

    使用mint-ui框架的header导航组件,<router-link to="">如何实现点击返回上一页? 代码如下: <template><!-- ...

  8. vue.js踩坑之单向数据流

    vue.js父子组件之间的数据通信,细节总结 隐性规则:单行数据流 学前疑问: 1.父组件如何向子组件通信数据? 2.父组件可以直接修改子组件的数据!但是反过来绝对不可以!那怎么解决这个问题呢? 3. ...

  9. vue.js踩坑之ref引用细节点

    vue.js组件之H5页面,DOM标签或者组件中,通过ref="自定义name名称"引用的细节点 要点简介:[ 见下文案例 ] 使用is=" "解决H5出现的标 ...

  10. 日常踩坑记录-汇总版

    开发踩坑记录,不定时更新 心得 RTFM 严谨的去思考问题,处理问题 严格要求自己的代码编写习惯与风格 注意 单词拼写 20200207 mybatis plus 自带insert插入异常 sql i ...

最新文章

  1. Lesson 16.1016.1116.1216.13 卷积层的参数量计算,1x1卷积核分组卷积与深度可分离卷积全连接层 nn.Sequential全局平均池化,NiN网络复现
  2. 操作系统之常考面试题
  3. 奉劝那些想学编程的人
  4. Flutter MaterialButton组件详细概述
  5. 30问提升技术人写作力-第1问作业
  6. iOS开发--底部按钮和应用图标显示未读消息
  7. python爬虫如何更换ip_Python爬虫被封IP,怎么换ip?
  8. ASCII、GB2312、GBK、GB18030、Unicode、UTF-8、BIG5 编码分析
  9. Java开源CMS系统
  10. matlab停止运行命令_matlab终止运行命令
  11. C语言(静态链接库和动态链接库)
  12. VMware ESXi 7.0 U2 SLIC Unlocker USB 网卡驱动集成镜像
  13. C#文字播放语音功能System.Speech类库的使用
  14. 看懂需要勇气,33张人性图!
  15. EXCEL 删除表格内的空格和空白字符
  16. uniapp:索引列表
  17. DUL Oracle Data Unloader工具下载
  18. 神舟zx8sp7s2装linux,战神ZX8-SP7S2游戏本搭GTX1070+桌面i7芯
  19. 微信小程序毕业设计 基于微信美食介绍点评小程序系统开题报告
  20. 阿里云AMD服务器ECS计算型c6a实例CPU网络性能评测

热门文章

  1. 方舟:生存进化PVE模式和PVP模式
  2. c++流密码算法实验
  3. 获取Powershell命令行参数
  4. LabVIEW编程LabVIEW开发高级数据采集技术定时与触发 例程与相关资料
  5. Linux之RAID技术学习整理
  6. 01编写10个线程,第一个线程从1加到10,第二个线程从11加20…第十个线程从91加到100,最后再把10个线程结果相加。
  7. 从0到1打造高成功率的食品品牌系列(一)食品企业从0到1创建品牌的20大误区
  8. 制作网站的缩略logo标志
  9. Parallels Desktop(PD虚拟机)如何分配内存和CPU核数?
  10. NetFlow流量分析