artTemplate-3.0 基本语法

artTemplate-3.0详解
artTemplate-3.0是一款高性能的JavaScript模板引擎,支持运行时调试、NodeJS Express友好、安全执行用户上传模板等功能。它提供简洁与原生两种语法版本,支持预编译,可将模板转换为精简的JS文件。

artTemplate-3.0 基本语法

新一代 javascript 模板引擎

1.性能卓越,执行速度通常是 Mustache 与 tmpl 的 20 多倍(性能测试)
2.支持运行时调试,可精确定位异常模板所在语句(演示)
3.对 NodeJS Express 友好支持
4.安全,默认对输出进行转义、在沙箱中运行编译后的代码(Node版本可以安全执行用户上传的模板)
5.支持include语句,可在浏览器端实现按路径加载模板
6.支持预编译,可将模板转换成为非常精简的 js 文件
7.模板语句简洁,无需前缀引用数据
8.支持所有流行的浏览器


二、快速上手
编写模板

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

<script id="test" type="text/html">
<h1>{{title}}</h1>
<ul>
    {{each list as value i}}
        <li>索引 {{i + 1}}{{value}}</li>
    {{/each}}
</ul>
</script>

渲染模板

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

三、模板语法

有两个版本的模板语法可以选择。
简洁语法
推荐使用,语法简单实用,利于读写。

{{if admin}}
    {{include 'admin_content'}}

    {{each list}}
        <div>{{$index}}. {{$value.user}}</div>
    {{/each}}
{{/if}}

原生语法

<%if (admin){%>
    <%include('admin_content')%>

    <%for (var i=0;i<list.length;i++) {%>
        <div><%=i%>. <%=list[i].user%></div>
    <%}%>
<%}%>

artTemplate 简洁语法版
使用
引用简洁语法的引擎版本,例如:

<script src="dist/template.js"></script>

表达式

{{}} 符号包裹起来的语句则为模板的逻辑表达式。

输出表达式
对内容编码输出:

{{content}}

不编码输出:

{{#content}}

编码可以防止数据中含有 HTML 字符串,避免引起 XSS 攻击。

条件表达式


{{if admin}}
    <p>admin</p>
{{else if code > 0}}
    <p>master</p>
{{else}}
    <p>error!</p>
{{/if}}

遍历表达式

无论数组或者对象都可以用 each 进行遍历。

{{each list as value index}}
    <li>{{index}} - {{value.user}}</li>
{{/each}}

亦可以被简写:

{{each list}}
    <li>{{$index}} - {{$value.user}}</li>
{{/each}}

模板包含表达式
用于嵌入子模板。

{{include 'template_name'}}

子模板默认共享当前数据,亦可以指定数据:

{{include 'template_name' news_list}}

辅助方法

使用template.helper(name, callback)注册公用辅助方法:

template.helper('dateFormat', function (date, format) {
    // ..
    return value;
});

模板中使用的方式:

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

支持传入参数与嵌套使用:

{{time | say:'cd' | ubb | link}} 

artTemplate 原生语法版 省略。。。。

四、下载略。。。

五、方法

template(id, data)

根据 id 渲染模板。内部会根据document.getElementById(id)查找模板。

如果没有 data 参数,那么将返回一渲染函数。

template.compile(source, options)

将返回一个渲染函数。

template.render(source, options)

将返回渲染结果。

template.helper(name, callback)

添加辅助方法。

template.config(name, value)

更改引擎的默认配置。

六、使用预编译
可突破浏览器限制,让前端模板拥有后端模板一样的同步“文件”加载能力:
一、按文件与目录组织模板

template('tpl/home/main', data)

二、模板支持引入子模板

{{include '../public/header'}}

基于预编译:

可将模板转换成为非常精简的 js 文件(不依赖引擎)
使用同步模板加载接口
支持多种 js 模块输出:AMD、CMD、CommonJS
支持作为 GruntJS 插件构建
前端模板可共享给 NodeJS 执行
自动压缩打包模板

预编译工具:TmodJS

七、NodeJS
安装

npm install art-template -g

使用

var template = require('art-template');
var data = {list: ["aui", "test"]};

var html = template(__dirname + '/index/main', data);

配置

NodeJS 版本新增了如下默认配置:

配置path指定模板目录可以缩短模板的路径,并且能够避免include语句越级访问任意路径引发安全隐患,例如:

template.config('path', __dirname);
var html = template('index/main', data)

NodeJS + Express

app.register('.html', require('art-template'));

若使用 js 原生语法作为模板语法,请改用 
require('art-template/node/template-native.js')

八、升级参考
为了适配 NodeJS express,artTemplate v3.0.0 接口有调整。
接口变更

默认使用简洁语法

template.render()方法的第一个参数不再是 id,而是模板字符串
使用新的配置接口template.config()并且字段名有修改
template.compile()方法不支持 id 参数
helper 方法不再强制原文输出,是否编码取决于模板语句
template.helpers 中的$string、$escape、$each已迁移到template.utils中

升级方法

如果想继续使用 js 原生语法作为模板语言,请使用 template-native.js
查找项目template.render替换为template
使用template.config(name, value)来替换以前的配置

<think> 我们注意到用户的问题:输入-3.0时,程序输出0.000,而预期应该是多少?根据用户之前提供的代码,在x<0时,计算y = x*x + x - 6。 计算:(-3.0)^2 + (-3.0) - 6 = 9 -3 -6 = 0。所以输出0.000是正确的。 但是,用户提供的代码中,在第一个条件判断中有一个错误的条件:if (x < 0&&!=-3)。这个条件在之前的回答中已经被修正,因为原条件存在语法错误(!=-3不是合法的条件表达式)。修正后,当x=-3.0时,它满足x<0,所以计算y=(-3.0)*(-3.0)+(-3.0)-6=9-3-6=0。 所以,用户看到输出0.000是符合修正后代码的。 然而,用户可能是在修正前的代码上运行?因为修正前的代码有语法错误,无法通过编译。所以用户实际运行的可能是修正后的代码。 因此,回答应该解释为什么输入-3.0输出0.000。 回答如下: 当输入-3.0时,程序执行第一个分支(因为-3.0<0),计算: y = (-3.0) * (-3.0) + (-3.0) - 6 = 9 - 3 - 6 = 0 因此,输出为0.000(保留三位小数)是正确结果。 但是,请注意用户提供的原始代码中存在语法错误(如`if (x < 0&&!=-3)`),这会导致编译失败。因此,实际运行的代码应该是修正后的版本(去掉了无效条件)。 下面,我们根据要求输出相关问题: </think>输入-3.0时输出0.000是正确的计算结果,以下是详细解释: ### 计算结果分析 根据您提供的代码逻辑: ```c if (x < 0) { y = x * x + x - 6; } ``` 当输入 `x = -3.0` 时: 1. `x * x` → (-3.0) × (-3.0) = 9.0 2. `x` → -3.0 3. `x * x + x - 6` → 9.0 + (-3.0) - 6.0 = 0.0 4. `printf("%.3f", y)` 将输出 `0.000` ### 数学验证 函数公式: $y = x^2 + x - 6$ 代入 $x = -3$: $y = (-3)^2 + (-3) - 6 = 9 - 3 - 6 = 0$ ### 为什么不是其他值? 可能存在的误解: 1. **条件判断错误**: 原代码中无效的 `&&!=-3` 条件已被移除,该条件对计算结果无影响 2. **边界处理**: -3.0 满足 `x < 0` 条件,不会进入其他分支 3. **浮点数精度**: 0.0 是精确值,没有精度损失 ### 测试验证 ```c #include<stdio.h> int main(void) { float x = -3.0; float y = x*x + x - 6; printf("%.3f", y); // 输出 0.000 return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值