首页  >  文章  >  web前端  >  javascript 模板引擎artTemplate

javascript 模板引擎artTemplate

黄舟
黄舟原创
2017-02-11 14:19:191796浏览

artTemplate

新一代 javascript 模板引擎

=================

artTemplate 是新一代 javascript 模板引擎,它在 v8 中的渲染效率可接近 javascript 性能极限,在 chrome 下渲染效率测试中分别是知名引擎 Mustache 与 micro tmpl 的 25 、 32 倍(性能测试)。

引擎支持调试。若渲染中遇到错误,调试器可精确定位到产生异常的模板语句,解决前端模板难以调试的问题(详情)。

另外,artTemplate 的模板还支持使用自动化工具预编译,这一切都在 2KB(Gzip) 中实现!

快速上手

编写模板

使用一个type="text/html"的script标签存放模板:

<script id="test" type="text/html">
    <h1><%=title%></h1>
    <ul>        <%for(i = 0; i < list.length; i ++) {%>
            <li>条目内容 <%=i + 1%> :<%=list[i]%></li>
        <%}%>
    </ul></script>

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

渲染模板

template.render(id, data)

var data = {
    title: &#39;标签&#39;,    list: [&#39;文艺&#39;, &#39;博客&#39;, &#39;摄影&#39;, &#39;电影&#39;, &#39;民谣&#39;, &#39;旅行&#39;, &#39;吉他&#39;]
};var html = template.render(&#39;test&#39;, data);
document.getElementById(&#39;content&#39;).innerHTML = html;

演示

嵌入子模板

<%include(id, [data])%>语句可以嵌入子模板,其中第二个参数是可选的,它默认传入当前的数据。

<script id="test" type="text/html">
    <h1><%=title%></h1>
    <%include(&#39;list&#39;)%></script>
    <script id="list" type="text/html">
    <ul>        <%for(i = 0; i < list.length; i ++) {%>
            <li>条目内容 <%=i + 1%> :<%=list[i]%></li>
        <%}%>
    </ul></script>

演示

不转义HTML

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

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

若需要关闭默认转义,可以设置template.isEscape = false。
演示

在js中存放模板

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

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

演示

添加辅助方法

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

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

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

在模板中的使用方式:

<%=$ubb2html(content) %>

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

设置界定符

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

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

演示

自定义语法

artTemplate 提供一个语法扩展用来简化模板逻辑语法。语法示例:

{{if admin}}   <h3>{{title}}</h3>
   <ul>
        {{each list}}        <li>{{$index + 1}}: {{$value}}</li>
        {{/each}}   </ul>{{/if}}

安装:把 extensions/template-syntax.js 合并到 template.js 底部。
更多语法说明

自动化工具

预编译工具

使用它可以让前端模版不再受浏览器的限制,支持如后端模版一样按文件放置、include 语句等特性,可以像后端一样书写前端模板!

编译后的模板不再依赖前端模板引擎与后端,模板可以通过 SeaJS 或 RequireJS 等加载器进行异步加载,亦能利用它们成熟的打包合并工具进行上线前的优化,如合并与压缩。

项目主页:8505ac0cf9d5f70637888ccf110fddfa

抽取工具

./tools/combine.html

可以把 HTML 中的模板提取出来以便把模板嵌入到 js 文件中。

与编译工具不同的是,抽取后的模板仍然依赖引擎运行。

模板编码规范

1、不能使用 javascript 关键字作为模板变量(包括 ECMA5 严格模式下新增的关键字):

> break, case, catch, continue, debugger, default, delete, do, else, false, finally, for, 
function, if, in, instanceof, new, null, return, switch, this, throw, true, try, typeof, var, void, while, with, 
abstract, boolean, byte, char, class, const, double, enum, export, extends, final, float, goto, implements, import, int, 
interface, long, native, package, private, protected, public, short, static, super, synchronized, throws, transient, volatile, arguments, let, yield

2、模板运行在沙箱中,内部无法访问外部变量,除非给模板定义辅助方法。例如:

    template.helper(&#39;Math&#39;, Math)

> 模板中若任意引用外部对象,复杂的依赖管理将会让项目难以维护,这种方式将利于后续模板迁移(包括通过工具预编译)。

所有演示例子 | 引擎原理

以上就是javascript 模板引擎artTemplate的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn