参看地址

一、模板语法

1、变量使用与输出

<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
或:
{{if user}}
<h2>{{user.name}}</h2>
{{/if}}

art-template 同时支持 {{expression}} 简约语法与任意 JavaScript 表达式 <% expression %>

2、原始输出

{{@value}}

<%- value %>

原始输出语句不会对 HTML 内容进行转义

3、条件

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

<% if (value) { %> ... <% } %>
<% if (value) { %> ... <% } else { %> ... <% } %>

4、循环

{{each target}}
{{$index}} {{$value}}
{{/each}}

<% for(var i = 0; i < target.length; i++){ %>
<%= i %> <%= target[i] %>
<% } %>
  1. target 支持 Array 与 Object 的迭代,其默认值为 $data 。target 一般是{data:数组}
  2. $value 与 $index 可以自定义:{{each target as val key}}  使用时可以不用$val直接val即可

5、变量

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

<% var temp = data.sub.content; %>

6、模板继承

{{extend './layout.art'}}
{{block 'head'}} ... {{/block}}

<% extend('./layout.art') %>
<% block('head', function(){ %> ... <% }) %>

模板继承允许你构建一个包含你站点共同元素的基本模板“骨架”。

7、子模板

{{include './header.art'}}
{{include './header.art' data}}

<% include('./header.art') %>
<% include('./header.art', data) %>

include 第二个参数默认值为 $data

8、打印输出

<% print(val, val2, val3) %>

9、过滤器

// 向模板中导入全局变量
template.defaults.imports.$dateFormat = function(date, format){/*[code..]*/};
template.defaults.imports.$timestamp = function(value){return value * 1000};

因为 imports 定义的全局变量的优先级会比普通模板变量高,所以建议命名使用 $ 前缀。

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

<%= $dateFormat($timestamp(date), 'yyyy-MM-dd hh:mm:ss') %>

{{value | filter}} 过滤器语法类似管道操作符,它的上一个输出作为下一个输入。

10、压缩html、js、css

template.defaults.minimize = true;

art-template 的页面压缩功能是在编译阶段实现的,因此完全不影响渲染速度,并且能够加快网络传输速度。但也有一个限制,它不能正常处理未闭合的 HTML 标签,因此使用 include 语句载入模板片段的时候请小心。

请避免书写这样的模板:

<body>
或:
</body></html>

使用 模板继承 代替 include 可以避免这样的问题出现。

11、调试

设置 template.defaults.debug=true 后,它会设置如下选项:

{
"bail": false,
"cache": false,
"minimize": false,
"compileDebug": true
}

debug 默认配置:

  • Node 环境 = process.env.NODE_ENV !== 'production'
  • 浏览器环境 = false

12、全局变量

1)内置变量清单

  • $data 传入模板的数据 {Object|array}
  • $imports 外部导入的所有变量,等同 template.defaults.imports {Object}
  • print 字符串输出函数 {function}
  • include 子模板载入函数 {function}
  • extend 模板继承模板导入函数 {function}
  • block 模板块声明函数 {function}

2)注入全局变量

template.defaults.imports.$console = console;
<% $console.log('hello world') %>

模板外部所有的变量都需要使用 template.defaults.imports 注入、并且要在模板编译之前进行声明才能使用。

13、配制语法规则

1)修改界定符

art-template 支持修改默认模板界定符 {{}} 与 <%%>

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

2)添加语法

从一个简单的例子说起,让模板引擎支持 ES6 ${name} 模板字符串的解析:

template.defaults.rules.push({
test: /\${([\w\W]*?)}/,
use: function(match, code) {
return {
code: code,
output: 'escape'
}
}
});

其中 test 是匹配字符串正则,use 是匹配后的调用函数。关于 use 函数:

  • 参数:一个参数为匹配到的字符串,其余的参数依次接收 test 正则的分组匹配内容
  • 返回值:必须返回一个对象,包含 code 与 output 两个字段:
    • code 转换后的 JavaScript 语句
    • output 描述 code 的类型,可选值:
      • 'escape' 编码后进行输出
      • 'raw' 输出原始内容
      • false 不输出任何内容

值得一提的是,语法规则对渲染速度没有影响,模板引擎编译器会帮你优化渲染性能。

js-template-art【二】语法的更多相关文章

  1. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  2. JavaScript模板引擎artTemplate.js——template()方法

    template(id, data)方法: id:必传,渲染模板的id. data:可选,一个Object对象. return:传data—>渲染完成html代码:不传data—>一个渲染 ...

  3. JavaScript模板引擎artTemplate.js——template.helper()方法

    上一篇文章我们已经讲到了helper()方法,但是上面的例子只是一个参数的写法,如果是多个参数,写法就另有区别了. <div id="user_info"></d ...

  4. JavaScript模板引擎artTemplate.js——template.compile()方法

    template.compile(source, options) source:必传,渲染模板的内容. options:可选,通常不传.(其实是我还没研究明白) return:一个渲染函数. 示例如 ...

  5. 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

    原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...

  6. js 正则练习之语法高亮

    原文:js 正则练习之语法高亮 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解.今天就分析下 次碳酸钴 和 Barret Lee 语法高亮实现. 先 ...

  7. 针对单个 js 文件禁用 ESLint 语法校验

    问题描述: 在 Vue-cli 创建的项目中,使用了 ESLint 规范代码的项目中 如何针对单个 js 文件禁用 ESLint 语法校验,但整个项目依然保留 ESLint 的校验规则? 解决方案: ...

  8. qrcode.js 动态生成二维码

    用qrcode.js动态生成二维码图片非常简单,只需要引入qrcode.js即可使用,而且可以自定义图片大小.背景色等信息. 1.jsp代码---页面头部引入qrcode.js,jquery文件可选 ...

  9. node.js 初学(二)—— 搭建注册/登录服务器

    node.js 初学(二)—— 搭建注册/登录服务器 理论上来说,代码实现在理论和实际上是一样的.但实际上来说,他们不是 做一个最简单的用户注册登录功能 1.接口定义: 注册:/user?act=re ...

  10. js生成简单二维码

    js文件下载地址:https://download.csdn.net/download/weixin_38296752/10554485 一.引入qrcode.js文件 <script type ...

随机推荐

  1. 关于使用_bstr_t的一个坑

    编程中需要将_variant_t转换为char*,常用的方法是:(const char*)_bstr_t(c_variant_t); 使用_bstr_t的构造函数:  _bstr_t(const _v ...

  2. HDU 2594 Simpsons’ Hidden Talents (KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594 这题直接用KMP算法就能够做出来,只是我还尝试了用扩展的kmp,这题用扩展的KMP效率没那么高. ...

  3. mybatis由浅入深day01_9动态sql(9.5sql片段_9.6foreach)

    9 动态sql 9.1 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 9.2 需求 用户信息综合查询列表和用户信息查询列表总数这两个 ...

  4. ssh&scp指定密钥

    scp时指定密钥: scp -P22   -r -i ~/.ssh/dongjing-shanghai.pem root@kiri_pro01:/data/backup/back_from_japan ...

  5. CSS3 Transform变形(2D转换)

    Transform:对元素进行变形:Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.但只有两个关键贞.开始,结束.Animation:对元素某个属性 ...

  6. GIT+ Coding使用方法

    1 进入码市 :https://coding.net    注册一个账户 2 创建一个项目: 3 本地window环境.安装git : https://git-scm.com/download/win ...

  7. 广义表操作 (ava实现)——广义表深度、广义表长度、打印广义表信息

    广义表是对线性表的扩展——线性表存储的所有的数据都是原子的(一个数或者不可分割的结构),且所有的数据类型相同.而广义表是允许线性表容纳自身结构的数据结构. 广义表定义: 广义表是由n个元素组成的序列: ...

  8. Docker源码分析(八):Docker Container网络(下)

    1.Docker Client配置容器网络模式 Docker目前支持4种网络模式,分别是bridge.host.container.none,Docker开发者可以根据自己的需求来确定最适合自己应用场 ...

  9. sencha touch 扩展篇之将sencha touch打包成安装程序(上)- 使用sencha cmd打包安装程序

    由于最近一直忙着android原生的开发,很久没有更新博客了,官方的sencha cmd工具功能非常强大,创建项目,压缩项目,打包安装程序都能轻松实现,这讲我们就给大家介绍下如何使用sencha cm ...

  10. 条件注释判断IE浏览器版本

    lt,lte,gt,gte分别表示什么 lt:小于当前版本 lte:小于或等于当前版本,包括本身 gt:大于当前版本 gte:大于或等于当前版本,包括本身 使用格式 // 如IE9以下(不包括IE9加 ...