前端模版引擎 - art-template 【下】

我们接着上篇 《 前端模版引擎 - artTemplate 【上】 》 继续讲解 artTemplate 的最新版本 art-template

新版本的 art-template 据作者所说有以下的改变:

  1. 调试增强
    支持运行时错误调试,编译错误调试。
  2. 断点
    使用 Webpack Loader 后可以输出 SourceMap,支持在浏览器中对模板进行断点调试。
  3. 混合式语法
    art-template 从 v3.0 开始默认采用的是简洁语法,相对于 ejs 式的语法,简洁语法优点是利于读写,弊端是逻辑控制非常有限,比如循环控制等。v4.0 同时支持两种语法,在功能与易用性之间取得较好的平衡。
  4. 模板继承
    模板继承允许你构建一个包含你站点共同元素的基本模板“骨架”。
  5. 自定义语法
    art-template@4.0 支持应用多个模板解析规则。

阅读完其文档,新版的 artTemplate 大致的语法并有什么改变,新增了一下功能并修改了 API ,看起来是比旧版本的代码要优雅一点。文档我觉得是有点乱的,假如没有用过之前版本的话,小白上手比较麻烦,下面我尝试用自己的语言进行讲解。

没用过前面版本的同学,直接可以看下面这一段:


1. 简介

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
—— 来自某度


art-template 以优雅的方式解决你 web 开发中 dom 字符串拼接与数据绑定的工具

2. 使用环境

art-template 目前含有5种使用环境,区别与上一个版本,并没有开发 Grunt 跟 Gulp 的插件( 因为他觉得 webpack 才是主流喔~ ),而是新增了两种基于 Node.js 平台下的 ExpressKoa,同时 tmodjs 替换成 art-template-loader

a. NodeJS
$ cnpm install art-template --save

b. 浏览器版本
下载:template-web.js(gzip: 6kb)

c. Webpack 插件
art-template-loader

d. Express 插件
express-art-template

e. Koa 插件
koa-art-template


3. 语法

安装完 art-template 后,这里将会介绍如何编写其模板文件。其语法有原生跟简洁两种,因为简洁语法在循环条件的逻辑控制比较有限,同时该模板支持两种语法的并存,他们可以互助互补,所以下面我基本都是按照简洁语法说明在必要的时候才会加上原生语法。

a. 输出
别的不说,数据绑定肯定是第一项吧

{{value}}             // 目前最常见的双花括号数据绑定
{{data.key}}       // 对象点方式
{{data['key']}}    // 另外一种对象处理方式
{{a ? b : c}}       // 三元运算
{{a || b}}           // 或运算  防止 undefined 报错
{{a + b}}          // 并列输出
{{$data['list']}}  // 官档说是为模板一级的特殊变量,我目前看不出它跟 {{value}} 有什么不同,应用场景有待发掘

b. 不转义
art-template 源码中就禁用了 html 片段转义成字符串了,要是想使用原文输出

{{@value}}

老版本的 # 也是可以用的

{{#value}}

c. 条件与循环

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

// 循环更老版本是改变了的,更简单了点,同时可以看出,并不能写更多的逻辑,只是单纯的循环数组
{{each target}}
    {{$index}} {{$value}}
{{/each}}

// 可以采用原生语法,达到更多的逻辑实现
<% for(var i = 0; i < target.length; i++){ %>
    <%= i %> <%= target[i] %>
<% } %>

注意:
target 支持 array 与 object 的迭代,其默认值为 $data。
$value 与 $index 可以自定义:{{each target val key}}。

d. 变量
相对于老版本还新增加了变量的定义,确实对后台修改了参数名时,减少了人工替换的工作量

{{set temp = data.sub.content}}

e. 模板继承
新增的 “骨架” 继承也是一个挺好用的东西,只能在 NodeJS 中使用,或者采用 webpack 进行编译,原因是 js 中不能注入外部文件的机制

如何使用看后续

{{extend './layout.art'}}  // 引入模板骨架
{{block 'head'}} ... {{/block}}  // 需要替换的包裹标签

骨架 html

<!--layout.art-->
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>{{block 'title'}}My Site{{/block}}</title>
    {{block 'head'}}
    <link rel="stylesheet" href="main.css">
    {{/block}}
</head>
<body>
    {{block 'content'}}{{/block}}
</body>
</html>

应用 index.html

<!--index.art-->
{{extend './layout.art'}}
{{block 'title'}}{{title}}{{/block}}
{{block 'head'}}
    <link rel="stylesheet" href="custom.css">
{{/block}}
{{block 'content'}}
<p>This is just an awesome page.</p>
{{/block}}

f. 子模板

 // 引入子模板,在浏览器版本中不能使用 url 的方式,只能采用 模板 ID 方式,与旧版本无异,可参考我的上一篇文章的使用方式
{{include './header.art'}} 
{{include './header.art' data}}

g. 过滤器
跟旧版本一样的管道符机制,只是过滤器注册的方法改变了

{{date | timestamp | dateFormat 'yyyy-MM-dd hh:mm:ss'}}

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

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


4. 使用方法

a. NodeJS

  • 按上述语法编写模板文件,后缀可以用 .art 与其他 .html 文件区分(用不用都没关系)
  • 编写 Node 的运行的 js 文件
// use
var template = require('art-template');
var html = template(__dirname + '/demo.art', {
    user: {
        name: 'Max-demo'
    }
});

// compile && cache 这里提供一个动态编写模板方法,有这个业务需求可以选用,但一般都是我们本地自己编写好模板的
template('/welcome.art', 'hi, <%=value%>.');

b. 浏览器版本使用
跟旧版差不多

var html = template('test', data);
document.getElementById('content').innerHTML = html;
// 更多用法看我上一篇文章

c. Webpack 用法
先看文档,在后续我写 webpack 时,会再补充插件说明
art-template-loader

d. Express 用法
还没研究过这个库,以后会在本人的 Node教程 中研究该库
express-art-template

e. Koa 用法
还没研究过这个库,以后会在本人的 Node教程 中研究该库
koa-art-template


5. API

  • template(filename, content) - 渲染 & 动态生成模板缓存
// 在渲染时,[filename] 可以是文件路径,但在浏览器版中只能是模板 ID ,[content] 为渲染数据
var html = template(__dirname + '/demo.art', {
    user: {
        name: 'Max-demo'
    }
});

&

var html = template('test', data);
// 该方法只能在 Node 与 其他工具下使用
// 这时 [filename] 是生成的文件路径,[content] 为模板 html 片段
template('/welcome.art', 'hi,{{value}}');
  • .compile(source, options) - 编译模板并返回一个渲染函数
// 该方法应用于外部引入 js 文件模板或动态渲染

// 外部引入模板,请看上一篇中的 [compile.js - 模板外置方法]
var render = template.compile(source);
var html = render({
    list: ['摄影', '电影', '民谣', '旅行', '吉他']
});

// 动态渲染
var render = template.compile('hi, {{value}}');
var html = render({value: 'Max'});

// 这里的 [options] 是一个 template.defaults 中的配置对象
  • .render(source, data, options)
    编译并返回渲染结果
// 上面动态渲染的一步到位方法

var html = template.render('hi, {{value}}', {value: 'Max'});

// 这里的 [options] 是一个 template.defaults 中的配置对象
  • .defaults
    模板引擎默认配置
    查看

常用的提一下:
template.defaults.minimize = true; // 压缩代码

template.defaults.rules // 语法正则改写

// 原始语法的界定符规则
template.defaults.rules[0].test = /<%(#?)((?:==|=#|[=-])?)[ \t]*([\w\W]*?)[ \t]*(-?)%>/;
// 标准语法的界定符规则
template.defaults.rules[1].test = /{{([@#]?)[ \t]*(\/?)([\w\W]*?)[ \t]*}}/;

template.defaults.imports // 定义变量

template.defaults.imports.log = console.log;

<% $imports.log('hello world') %>  == console.log('hello world')
  • .extension
    给 NodeJS require.extensions 注册的模板渲染函数
// 加载 .ejs 模板
var template = require('art-template');
require.extensions['.ejs'] = template.extension;
var view = require('./index.ejs');
var html = view(data);

一般只要用.art ,因为其默认被注册,可以直接使用,不是在 Node 环境下其实不需要做这些用 .html 就好。

好了,上面就是 《 前端模版引擎 - art-template 【下】 》的全部内容了,希望能够对你有所帮助~


该篇收录于文集:前端技术栈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 前言 因为工作的关系,我在接手项目的时候发现以前的同事都是用 artTemplate 进行模板渲染的。鉴于它方便用...
    Max_Law阅读 27,843评论 4 24
  • 因个人精力有限,暂停简书的维护,欢迎大家关注我的知乎https://www.zhihu.com/people/we...
    尾尾阅读 1,162评论 3 13
  • 学习流程 参考文档:入门Webpack,看这篇就够了Webpack for React 一. 简单使用webpac...
    Jason_Zeng阅读 3,106评论 2 16
  • 今天买的新的吉他效果器到了,插上连接线,戴上监听耳机,打开鼓机,效果调到失真,弹动几个和弦,燃爆了!!!! 我想起...
    LeBronZames阅读 223评论 0 0
  • 人言可畏,人言何所谓 还记得张信哲的《过火》里有句歌词:关于流言我装作无动于衷。有时候只是装作无动于衷,又有几...
    一个意外的结尾阅读 406评论 0 0