腾讯art-template4,即vue后又获一利器

art-template是一个简约、超快的模板引擎,官方给出的优点及特性是:

1.拥有接近 JavaScript 渲染极限的的性能

2.调试友好:语法、运行时错误日志精确到模板所在行;支持在模板文件上打断点(Webpack Loader)

3.支持 Express、Koa、Webpack

4.支持模板继承与子模板

5.浏览器版本仅 6KB 大小

其中第2点看出来不错哦,支付打断点,其它几个优点见仁见智。

首先了解一下框架工作流程,大致可以分为两步:编辑模板和渲染模板。

编辑模板就是将需要动态生成的DOM抽象成为模板,渲染则是利用渲染函数,把后端返回的数据 填入模板中相应的位置上,生成最终的html串并且回填到html页面的指定位置中。

 

下面开始学习这旅吧。

1.先去网络或github上去下载art-template.js文件,然后在html或jsp里引入文件即可以使用

<script src="https://github.com/aui/art-template/tree/master/lib/template-web.js"></script>


2.学习一个框架,从3点开始下手

第一:数据怎么展示

第二:数据怎么提供

第三:数据怎么生效。

2.1 第一:数据怎么展示:

ArtTemplate提供2种语法

1.标准语法或叫做极简语法,使用的是双大括号或者叫“胡子”,推荐使用,看起来简洁

{{if data}}<h2>{{data.name}}</h2>
{{/if}}

只将数据放到胡子,其它标签安jsp或html语法写

2.原始语法,<%%>

<% if (data) { %><h2><%= data.name %></h2><% } %>

使用jsp的语法,我们知道”<%%>”里是可以写java代码的,可以定义局部变量和java代码语句。把数据和逻辑那块放到<%%>里写,其它按正常的逻辑写,类似写jsp。缺点是看起来不整洁,特别是页面复杂的,优点是拥有强大的逻辑表达能力

 

3.双大括号或胡子里可以使用的逻辑符包括“.””[]”,”三目运算符”,”||&”,”逻辑运算符”。如下:

{{value}}

{{data.key}}

{{data['key']}}

{{a ? b : c}}

{{a || b}}

{{a + b}}

例子如下:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>basic-demo</title>
<script src="../lib/template-web.js"></script>
</head><body>
<div id="content"></div>
<script id="test" type="text/html">
<h1>{{name}}性别是{{sex==1?'男':'女'}}</h1><ul>{{each list value i}}<li>第{{i + 1}}门课 :{{value}}</li>{{/each}}
</ul>
<h1>其中数学和英语总分:{{math+english}}</h1>
</script><script>
var data = {name:"小明",sex:1,math:90,english:73,list: ['文艺','数学','英语', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>


渲染出来的结果:

1).红色部分是我们特别关注的地方,强调一点,这里的模块指的是用

<script type="text/html">XXXX代码</script>

包裹的部分。胡子和标签都在里面写,脚本视做一个模块。

2).胡子里可以使用指定的操作符,如逻辑判断有运算符,如果不足够,可以使用原始语法,那里逻辑运算比较全面。

3).让渲染出来的元素在页面上生效。

var html = template('test', data);document.getElementById('content').innerHTML = html;


4.条件判断

{{if value}} ... {{/if}}

{{if v1}} ... {{else if v2}} ... {{/if}}

所以取数据和逻辑判断都在胡子里。例子:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>basic-demo</title>
<script src="../lib/template-web.js"></script>
<script src="../lib/jquery.2.1.1.min.js"></script>
</head><body>
<div id="content"></div>
<script id="testP" type="text/html">
<h1>{{name}}性别是{{sex==1?'男':'女'}}</h1>
{{if math > 90}}
<2>数学成绩上等</h2>
{{else if math >70}}
<h2>数学成绩中等</h2>
{{else if math > 60}}
<h2>数学成绩及格</h2>
{{/if}}
<ul>{{each list value i}}<li>第{{i + 1}}门课 :{{value}}</li>{{/each}}
</ul>
<h1>其中数学和英语总分:{{math+english}}</h1>
</script><script>
var data = {name:"小明",sex:1,math:90,english:73,list: ['文艺','数学','英语', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var html = template('testP', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>


结果如下:


看红色部分,以{{if value}}开头,以{{/if}}结尾,中间可以有else if。可以做到java里

if(value){}else if(value){}else if(value){}


5.模拟for或foreach逻辑。如上面的例子:

<ul>{{each list value i}}<li>第{{i + 1}}门课 :{{value}}</li>{{/each}}
</ul>


6.设置变量:{{set temp = value}}

例如:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>basic-demo</title>
<script src="../lib/template-web.js"></script>
<script src="../lib/jquery.2.1.1.min.js"></script>
</head><body>
<div id="content"></div>
<script id="testP" type="text/html">
{{set nb=math+english}}
<h2>数字的别名nb值:{{nb}}</h2>
<h1>{{name}}性别是{{sex==1?'男':'女'}}</h1>
{{if math > 90}}
<2>数学成绩上等</h2>
{{else if math >70}}
<h2>数学成绩中等</h2>
{{else if math > 60}}
<h2>数学成绩及格</h2>
{{/if}}
<ul>{{each list value i}}<li>第{{i + 1}}门课 :{{value}}</li>{{/each}}
</ul>
<h1>其中数学和英语总分:{{math+english}}</h1>
</script><script>
var data = {name:"小明",sex:1,math:90,english:73,list: ['文艺','数学','英语', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var html = template('testP', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>

7.过滤器

template.defaults.imports.dateFormat = function(date, format){/*[code..]*/};

template.defaults.imports.timestamp = function(value){return value * 1000};

使用{{value|filter}}

使用类似管道符来传递数据,数据会传递到定义的过滤器函数filter里

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>helper-demo</title>
<script src="../../lib/template-web.js"></script>
</head><body>
<h1>自定义过滤器</h1>
<div id="content"></div>
<script id="test" type="text/html">
<h2>过滤的第一种使用方法:{{time | dateFormat:'yyyy年 MM月 dd日 hh:mm:ss'}}</h2>
<h2>过滤的第二种使用方法:{{$imports.dateFormat(1408536771253,'yyyy年 MM月 dd日 hh:mm:ss')}}</h2>
<h2>特例:{{$imports.test(1408536771253)}}</h2>
</script><script>/*** 对日期进行格式化,* @param date 要格式化的日期* @param format 进行格式化的模式字符串*     支持的模式字母有:*     y:年,*     M:年中的月份(1-12),*     d:月份中的天(1-31),*     h:小时(0-23),*     m:分(0-59),*     s:秒(0-59),*     S:毫秒(0-999),*     q:季度(1-4)* @return String* @author yanis.wang* @see http://yaniswang.com/frontend/2013/02/16/dateformat-performance/*/function test(value){return value;}template.defaults.imports.dateFormat =  function (date, format) {if (typeof date === "string") {var mts = date.match(/(\/Date\((\d+)\)\/)/);if (mts && mts.length >= 3) {date = parseInt(mts[2]);}}date = new Date(date);if (!date || date.toUTCString() == "Invalid Date") {return "";}var map = {"M": date.getMonth() + 1, //月份"d": date.getDate(), //日"h": date.getHours(), //小时"m": date.getMinutes(), //分"s": date.getSeconds(), //秒"q": Math.floor((date.getMonth() + 3) / 3), //季度"S": date.getMilliseconds() //毫秒};format = format.replace(/([yMdhmsqS])+/g, function(all, t){var v = map[t];if(v !== undefined){if(all.length > 1){v = '0' + v;v = v.substr(v.length-2);}return v;}else if(t === 'y'){return (date.getFullYear() + '').substr(4 - all.length);}return all;});return format;
};// --------var data = {time: 1408536771253,
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>


结果如下


第一种方式是直接使用方式,通过管道符将数据拿到过滤器里,第二种方式是函数方式,我们知道,模板通过 $imports可以访问到模板外部的全局变量与导入的变量,我们可以使用$import直接方式通过template.defaults.imports导入的函数或变量,也可以访问全局的函数或变量,注意是全局的,所以通过$imports可以直接调用方法或变量,所以,有第3个例子,通过$imports模板变量访问了没导入但是是全局的test函数。


art-template.js提供了如下几种内置变量:

1.$data 传入模板的数据,如上数据可以$data.math访问到数学分数是多少

2.$imports外部导入的变量以及全局变量,(重要,重点,重量,重要的事说3遍,还不带重的)

3.print 字符串输出函数,后面可根随机个值,然后将拼接的字符串打印出来,比如如上数据:<h2>print函数:print name "的数学是"  math ",英文是" english  ",总分是" {{math + english}}</h2>

结果如下:



4.include子模板载入函数

5.extend模板继承模板导入函数

6.block 模板块声明函数


第二:数据怎么提供

我们知道js里提供数据常用json格式,数据怎么提供的问题涉及到art-template的2种渲染方式。

第一种直接提供模板名和数据源渲染,再将渲染后的模板页面添加到jsp里某个dom元素里。使用template(“filename”,content)

Filename:模板名,如上面script脚本id,或者单独抽出来的子模板路径,

Content:如果提供的是object,一般当做提供的是json格式数据,那么template方法会渲染模板将以string形势返回渲染后的结果,最张将返回的string添加到dom元素上。

如果 content为string,则编译模板并返回function,

一般使用方式是var html = template('testP', data);然后将返回的字符串html插入到dom元素上document.getElementById('content').innerHTML = html;

 

第二种。以字符串形势提供模板,调用 compile或者render编译模板,然后将数据提供给模板。注意以字符串形势提供的模板严格来讲并不是”模板“,必需经过编译才行。例如:

var source = '<ul>'
+    '{{each list value i}}'
+        '<li>索引 {{i + 1}} :{{value}}</li>'
+    '{{/each}}'
+ '</ul>';
var data = {list: ['摄影', '电影', '民谣', '旅行', '吉他']
}
var render = template.compile(source);
var html = render(data);


结果:

compile(source, options)编译模板并返回一个渲染函数。先编译再提供数据

或者编译和提供数据放一起

var render = template.render(source,data);

document.getElementById('content').innerHTML = render;

结果同上。

 

所以:

template(filename, content)

compile(source, options)

render(source, data)

即是提供数据和让数据怎么生效的三种方式。这也解释了第三个问题数据怎么生效。

第三:数据怎么生效

见第二解答。


高级用法include函数,

{{include '模板id'}}

{{include '模板id' data}}

data 数默认值为$data,也可赋值,指定数据源

例子:

<body>
<div id="content"></div>
<script id="test" type="text/html">
<h1>{{title}}</h1>
{{include 'list'}}
</script><script id="list" type="text/html">
<ul>{{each list value i}}<li>索引 {{i + 1}} :{{value}}</li>{{/each}}
</ul>
</script><script>var data = {title: '嵌入子模板',list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>


结果如下:



模板id为test使用Includ函数包裹了一个模板id为list的模板。虽然显示出来了,但这里有个坑。所以模板都必需写在同一个html或jsp里,不同模板可以写在不 同的<script id="xxx" type="text/html">,用id区别。换名话说include只能包裹同一页面的模板,如果模板存放在其它目录中则include无效。如果想要独立出模板放在单独文件里,需要使用企鹅开发的另一个框架TmodJS,它和art-template都是一家公司开发的TmodJS框架依赖于art-template框架的一款模板预编译器,感觉兴趣的同学可以自行百度

 

到这里我们基本上学会了art-template.js。如果说还有什么要学习的,估计就是框架的配置了。

配置

1.框架提供了.defaults属性,里面可以设置很多框架的默认属性。上面我们学习到的imports就是.defaults里的属性template.defaults.imports.XXX变量=XXX值。

它也提供了其它一些默认参数设置。

// 模板名
filename: null,
// 模板语法规则列表
rules: [nativeRule, artRule],
// 是否开启对模板输出语句自动编码功能。为 false 则关闭编码输出功能
// escape 可以防范 XSS 攻击
escape: true,
// 启动模板引擎调试模式。如果为 true: {cache:false, minimize:false, compileDebug:true}
debug: detectNode ? process.env.NODE_ENV !== 'production' : false,
// bail 如果为 true,编译错误与运行时错误都会抛出异常
bail: true,
// 是否开启缓存
cache: true,
// 是否开启压缩。它会运行 htmlMinifier,将页面 HTML、CSS、CSS 进行压缩输出
// 如果模板包含没有闭合的 HTML 标签,请不要打开 minimize,否则可能被 htmlMinifier 修复或过滤
minimize: true,
// 是否编译调试版
compileDebug: false,
// 模板路径转换器
resolveFilename: resolveFilename,
// 子模板编译适配器
include: include,
// HTML 压缩器。仅在 NodeJS 环境下有效
htmlMinifier: htmlMinifier,
// HTML 压缩器配置。参见 https://github.com/kangax/html-minifier
htmlMinifierOptions: {collapseWhitespace: true,minifyCSS: true,minifyJS: true,// 运行时自动合并:rules.map(rule => rule.test)ignoreCustomFragments: []
},
// 错误事件。仅在 bail 为 false 时生效
onerror: onerror,
// 模板文件加载器
loader: loader,
// 缓存中心适配器(依赖 filename 字段)
caches: caches,
// 模板根目录。如果 filename 字段不是本地路径,则在 root 查找模板
root: '/',
// 默认后缀名。如果没有后缀名,则会自动添加 extname
extname: '.art',
// 忽略的变量。被模板编译器忽略的模板变量列表
ignore: [],
// 导入的模板变量
imports: runtime


至于有多少是有用的,只能见仁见智

2.除了直接使用.defaults外,框架还提供了config(name,value)函数,按上面提供的配置属性填值即可。

想要了解最多建议去gitHub上看。

art-template@4 新特性一览

Github源码

教程

腾讯art-template4,即vue后又获一利器相关推荐

  1. 腾讯数据解读:95后基本不爱用微信,98%都是成年人,社交应用存在巨大机会...

    这几天一份<2015年最新微信用户数据报告>引起了PMcaff产品经理社区会员之间传阅.同时也引起了小编的兴趣,截止今年第一季度末,微信每月活跃用户已达到5.49亿,用户覆盖200多个国家 ...

  2. 电巢:继腾讯与联通混改后,又有两家企业官宣,科技巨头与国企混改,意味着什么?

    前言: 11月2日,一则"中国联通和腾讯成立合营企业"的消息引发热议,一时间众说纷纭.随后,"腾讯副总裁已担任中国联通董事"相关话题登上微博热搜,中国联通股价尾 ...

  3. [经验教程]腾讯视频VIP会员开通后如何申请退款取消腾讯视频会员VIP退款教程

    腾讯视频VIP会员开通后如何申请退款? 1.打开腾讯视频VIP会员开通支付订单,如确实不需要用腾讯视频VIP会员在再申请退款,请不要恶意申请. 2.进入后,选择遇到的问题:不满意商家的会员服务或充错会 ...

  4. 谷歌跟风推微信小程序;中兴解禁后首获订单;Yahoo Messenger正式关闭 | 极客头条...

    「CSDN 极客头条」,是从CSDN网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 快讯速知 雪中送 ...

  5. 腾讯云图片(行为)验证码,腾讯天御验证码,前vue后python端配置。前后端分离drf下的

    腾讯验证码功能开通 官网相关链接:腾讯T-Sec 天御 验证码 腾讯防水墙 点击进入腾讯T-Sec 天御 验证码注册登录后,送一周20000条验证测试数据. 可以先体验一下 在图形验证中创建一个验证 ...

  6. Vue - 使用 腾讯云SCF部署Vue项目(支持GitHub Action)

    一.前提条件 1.本地已有一个Vue2/Vue3项目 腾讯云SCF本身支持使用模板创建(模板创建参考)一个Vue项目并部署,但本文主要讲解将本 地原有的Vue项目改造为支持Serverless SCF ...

  7. 在腾讯云服务器跑Vue + SpringBoot项目

    背景:闲来无事,跟着做了个Vue+SpringBoot项目,做了一些之后项目内容没什么思路搞什么了,然后就想着再搭个服务器. 一:项目及云服务器还有域名准备 项目:这个-自己准备吧,只要自己做好的能在 ...

  8. 阿里云、腾讯云纷纷宕机后,用户只能坐等损失?

    这个夏天,云服务日子都不太好过!继上月末阿里云服务出现技术故障后,腾讯云服务又出了大岔子. 昨天上午7点开始,陆续有网友反映,腾讯云服务出现宕机.随后,腾讯云广州区域全面断网,腾讯云主页.控制台.DN ...

  9. 82.使用vue后怎么针对搜索引擎做SEO优化?

    什么是SEO 搜索引擎优化(Search engine optimization,简称SEO),指为了提升网页在搜索引擎自然搜索结果中(非商业性推广结果)的收录数量以及排序位置而做的优化行为,是为了从 ...

  10. <必知>在腾讯云买了服务器后不知道登录密码,如何重置密码

    在购买腾讯云服务器时,如果在购买时没有设置密码,那么云服务器创建后是没有初始码的 ###我们可以在控制台"重置密码"来获取密码 1.登录云服务器控制台 2.将正在运行的服务器关机 ...

最新文章

  1. 「思想钢印」成真!33位中美科学家最新成果:用光成功改变大脑认知
  2. “Z世代”崛起,网易云信助力猫耳FM引领声音风潮
  3. ESP32-S3与ESP32-S2相比,有什么不同呢?
  4. Java 对象和类的一些笔记总结
  5. 51单片机实现4位数以内的加减法
  6. python语言的开发者_写给.NET开发者的Python教程(一):引言
  7. 检测c/c++中内存泄露
  8. 《第一行代码第三版》总结篇
  9. github contribbution 没记录怎么破?
  10. 都说DBA 是越老越值钱, 那你是没干过DBA
  11. 为什么自动驾驶遇瓶颈,但自动代客泊车却很热?
  12. 公众号开发素材管理,php删除微信素材
  13. 以太坊毕业设计DAPP开发-彩票的设计与实现
  14. SpringBoot | SpringBoot快速入门
  15. 如何转换DWG文件格式?来试试这两种方法
  16. 禅道讲义之超级管理员
  17. 免费有效站外推广方法(附录经典案例)
  18. 前端 == Javascript
  19. PHP medoo怎么样,Medoo很强大啊!
  20. smalldatetime mysql_SQLSERVER中datetime和smalldatetime类型分析说明

热门文章

  1. Excel高级图表制作②——帕累托图
  2. python实现合并多个excel中同名的sheet
  3. fixed在ios失效解决方案
  4. 2021年真正还能够用的一键制作词云图网站
  5. CPU卡指令返回错误集
  6. 彻底解决Android Studio Minimum supported Gradle version is X.Y.Z. Current version is x.y.z.问题
  7. windows server服务器打安全补丁
  8. 科研linux发型版本,[合集]哪些Linux系统科研能用呢 - 优秀的Free OS(Linux)版 - 北大未名BBS...
  9. 从400亿估值的链家网成长为4000亿的房地产产业平台,贝壳做对了这三点创新
  10. 如何在图片上添加边框和文字