Juicer——a fast template engine
https://blog.csdn.net/yutao_struggle/article/details/79201688
当前最新版本: 0.6.8-stable
Juicer 是一个高效、轻量的前端 (Javascript) 模板引擎,效率和易用是它追求的目标。 除此之外,它还可以运行在 Node.js 环境中。
名字的由来
倘若我们把数据比作新鲜可口的水果,把模板看做是水,Juicer 就是把水果和水榨出我们需要的HTML代码片段的榨汁机。
juicer的引入
<script type=”text/javascript” src=”juicer-1.0.min.js”></script>
Juicer的使用方法
编译模板并根据给定的数据立即渲染模板
juicer(tpl, data);
仅编译模板暂不渲染,它会返回一个可重用的编译后的函数
var compiled_tpl = juicer(tpl);
根据给定的数据,对之前编译好的模板进行数据渲染
var compiled_tpl = juicer(tpl);
var html = compiled_tpl.render(data);
注册/注销自定义函数(对象)
juicer.register(‘function_name’, function);
juicer.unregister(‘function_name’);
自定义模板语法边界符,下边是 Juicer 默认的边界符。你可以借此解决 Juicer 模板语法同某些后端语言模板语法冲突的情况
juicer.set({
'tag::operationOpen': '{@',
'tag::operationClose': '}',
'tag::interpolateOpen': '${',
'tag::interpolateClose': '}',
'tag::noneencodeOpen': '$${',
'tag::noneencodeClose': '}',
'tag::commentOpen': '{#',
'tag::commentClose': '}'
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
默认参数配置
{
cache: true [false],
strip: true [false],
errorhandling: true [false],
detection: true [false]
}
参数更改:
juicer.set('strip',false);
juicer.set('cache',false);
或
juicer.set({
'strip': false,
'cache': false
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
语法
${变量}
使用 ${} 输出变量值,其中 _ 为对数据源的引用(如 ${_},常用于数据源为数组的情况)。支持自定义函数(通过自定义函数你可以实现很多有趣的功能,类似 ${data|links} 就可以 通过事先定义的自定义函数 links 直接对 data 拼装出<a href=”..” alt=”..” /> ).
${name}
${name|function}
${name|function, arg1, arg2}
- 1
- 2
- 3
示例:
/*data数据*/
var json = {
links: [
{href: 'http://juicer.name', alt: 'Juicer'},
{href: 'http://benben.cc', alt: 'Benben'},
{href: 'http://ued.taobao.com', alt: 'Taobao UED'}
]
};
/*模板*/
var tpl = [
'{@each links as item}',
'${item|links_build} <br />',
'{@/each}'
].join('');
/*函数*/
var links = function(data) {
return '<a href="' + data.href + '" alt="' + data.alt + '" />';
};
/*注册自定义函数*/
juicer.register('links_build', links);
/*编译并渲染模板*/
juicer(tpl, json);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
以上代码执行后会出现结果被转义了:
<a href="http://juicer.name" alt="Juicer" <br />
<a href="http://benben.cc" alt="Benben" <br />
<a href="http://ued.taobao.com" alt="Taobao UED" <br />
- 1
- 2
- 3
转义/避免转义
出于安全角度的考虑,${变量} 在输出之前会对其内容进行转义,如果你不想输出结果被转义,可以使用 $${变量} 来避免这种情况
内联辅助函数{@helper}…{@/helper}
{@helper numberPlus}
function(number) {
return number + 1;
}
{@/helper}
var tpl = 'Number: ${num|numberPlus}';
juicer(tpl, {
num: 123
});
//输出Number:124
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
循环遍历 {@each} … {@/each}
对数组进行循环遍历可取得元素或索引值
{@each list as item, index}
${item.prop}
${index}
{@/each}
- 1
- 2
- 3
- 4
辅助循环{@each i in range(m,n)}
{@each i in range(5, 10)}
${i}; //输出 5;6;7;8;9;
{@/each}
- 1
- 2
- 3
判断{@if}…{@else if}…{@else}…{@/if}
{@each list as item,index}
{@if index===3}
the index is 3, the value is ${item.prop}
{@else if index === 4}
the index is 4, the value is ${item.prop}
{@else}
the index is not 3, the value is ${item.prop}
{@/if}
{@/each}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
注释{# 注释内容}
{# 我是注释}
- 1
子模板嵌套 {@include tpl, data}
HTML代码:
<script type="text/juicer" id="subTpl">
I'm sub content, ${name}
</script>
- 1
- 2
- 3
javascript代码:
var tpl = 'Hi, {@include "#subTpl", subData}, End.';
juicer(tpl, {
subData: {
name: 'juicer'
}
});
/*输出:Hi, I'm sub content, juicer End.*/
//或者通过数据引入子模板,下述代码也将会有相同的渲染结果:
var tpl = 'Hi, {@include subTpl, subData}, End.';
juicer(tpl, {
subTpl: "I'm sub content, ${name}",
subData: {
name: 'juicer'
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
完整示例
模板页面tpl_list.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>公告消息</title>
</head>
{@each LIST as item,index}
{@if item.NOTICE_READ==0}
<ul>
<li >
<div>
<ul>
<li>
<label >${item.NOTICE_TITLE}</label>
<span>${item.NOTICE_TIME}</span>
</li>
<li>
<label>
${item.NOTICE_CONTENT}
</label>
</li>
</ul>
</div>
</li>
</ul>
{@/if}
{@if item.NOTICE_READ==1}
<ul>
<li>
<div>
<ul>
<li>
<label>${item.NOTICE_TITLE}</label>
<span>${item.NOTICE_TIME}</span>
</li>
<li>
<label>
${item.NOTICE_CONTENT}
</label>
</li>
</ul>
</div>
</li>
</ul>
{@/if}
{@/each}
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
主页面notice.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>公告消息</title>
<script type="text/javascript" src="jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="juicer-1.0.min.js"></script>
</head>
<body>
<div id="P040201">
<div class="page" data-page="noticeMessage" title="公告消息" >
</div>
<div class="page" data-page="noticeDetail" title="公告详情">
</div>
</div>
</body>
<script type="text/javascript" src="notice.js"></script>
<script type="text/javascript">
me.init();
console.log("...end");
</script>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
notice.js
var panel, pages, pageA;
var me = {
init : function() {
console.log("init");
panel = $("#P040201");
pages = panel.find(".page");
pageA = pages.filter("[data-page='noticeMessage']");
list ={
LIST : [
{
"NOTICE_ID" : "1",
"NOTICE_TITLE" : "贷款",
"NOTICE_CONTENT" : "关于移动CRM的开发申请工作贷款流程审批关于移动CRM的开发申请工作贷款流程审批,关于移动CRM的开发申请工作贷款流程审批,关于移动CRM的开发申请工作贷款流程审批,关于移动CRM的开发申请工作贷款流程审批。",
"NOTICE_TIME" : "2018-1-25 9:00",
"NOTICE_READ" : "0"
},
{
"NOTICE_ID" : "2",
"NOTICE_TITLE" : "jquery data",
"NOTICE_CONTENT" : "在元素上存放或读取数据,返回jQuery对象。当参数只有一个key的时候,为读取该jQuery对象对应DOM中存储的key对应的值,值得注意的是,如果浏览器支持HTML5,同样可以读取该DOM中使用 data-[key] = [value] 所存储的值。参见最后一个示例。当参数为两个时,为像该jQuery对象对应的DOM中存储key-value键值对的数据。\
如果jQuery集合指向多个元素,那将在所有元素上设置对应数据。 这个函数不用建立一个新的expando,就能在一个元素上存放任何格式的数据,而不仅仅是字符串。\
V1.4.3 新增用法, data(obj) 可传入key-value形式的数据。",
"NOTICE_TIME" : "2018-1-25 9:00",
"NOTICE_READ" : "0"
}
]
};
me.initPageA();
},
initPageA : function() {
$.get("tpl_list.html",function(tpl){
var tpl = juicer(tpl,list);
pageA.html(tpl);
});
}
};
Juicer——a fast template engine的更多相关文章
- The template engine
Play has an efficient templating system which allows to dynamically generate HTML, XML, JSON or any ...
- 如何选择Javascript模板引擎(javascript template engine)?
译者 jjfat 日期:2012-9-17 来源: GBin1.com 随着前端开发的密集度越来越高,Ajax和JSON的使用越来越频繁,大家肯定免不了在前台开发中大量的使用标签,常见到的例子如下: ...
- [PowerShell]template engine
今天讨论的是如何在Powershell里实现一个简单的Template Engine的功能. 假设模板文件的内容如下:template.tt hello $name welcome $company ...
- JFinal Template Engine 使用
官方文档:JFinal Template Engine 文档
- 【Reship】use of tangible T4 template engine
1.first of all 之前在 “使用T4模板生成代码 – 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “Multipl ...
- 最近兰州的js风格写个插件和一个template engine
/* *@Product Name: Rational Framework Author: Calos Description: pager !important: pager */ (functio ...
- Js template engine
P http://www.jquery4u.com/javascript/10-javascript-jquery-templates-engines/ http://www.creativebloq ...
- Inside a super fast CSS engine: Quantum CSS (aka Stylo)
https://hacks.mozilla.org/2017/08/inside-a-super-fast-css-engine-quantum-css-aka-stylo/?utm_source=d ...
- 500 Lines or Less: A Template Engine(模板引擎)
介绍: 多数项目都是包含很多的逻辑处理,只有少部分的文字文本处理.编程语言非常擅长这类项目.但是有一些项目只包含了少量的逻辑处理,大量的文本数据处理.对于这些任务,我们期望有一个工具能够很好的处理这些 ...
随机推荐
- STM32出现HardFault故障的解决方法
https://wenku.baidu.com/view/a4a7499afad6195f312ba6d2.html https://wenku.baidu.com/view/085b6fbe5022 ...
- NTP Reply Flood Attack (NTP反射型DDos攻击)
简介 NTP Reply Flood Attack (NTP射型Ddos攻击)以下简称NTP_Flood是一种利用网络中NTP服务器的脆弱性(无认证,不等价数据交换,UDP协议),来进行DDos行为的 ...
- unity, water cube
<纪念碑谷>里有一关开始是一个宝箱展开后里面有一个water cube,其中还有小鱼在游.如下截图: 因为我们知道<纪念碑谷>是unity做的,而现在正开始学unity,所以也 ...
- jquery动态生成html代码 怎么 获取id 或 class
动态创建的节点要用live方法加事件,语句要改为: $(“.del").live("click", function() { alert("获取到了" ...
- 解决Eclipse无法打开“Failed to load the JNI shared library”
这是因为JDK配置错误所导致的现象. 一般说来,新购笔记本会预装64位的windows系统,而在网上下载软件时,32位会优先出现在页面中(现在来说是这个情况,但我认为未来64位会越来越普及). 如果你 ...
- MS SQL表字段自增相关的脚本
--查询表是否有自增字段 SELECT OBJECTPROPERTY(OBJECT_ID('[表名]'), 'TableHasIdentity') --查询表的自增字段 SELECT COLUMN_N ...
- Redis(十五):哨兵Sentinel
Redis哨兵 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你 ...
- AESDK报错AEGP Magic Error的解决
原因是要先释放了流,再释放流的值,顺序问题导致报错. 解决方法是先释放流的值,再释放流 mSuites->StreamSuite2()->AEGP_DisposeStreamValue(v ...
- android BaseAdapter getView 理解
ListView是安卓中很经常使用的一个控件. 安卓设计使用Adapter来对ListView进行管理. 可是系统提供的Adapter无法满足一些复杂的显示情况,这个时候我们就须要使用BaseAdap ...
- 【ActiveMQ】ActiveMQ在Windows的安装,以及点对点的消息发送案例
公司最近会用MQ对某些业务进行处理,所以,这次我下载了apache-activemq-5.12.0-bin把玩下. 基于练习方便需要,使用Windows的版本. 参考的优秀文章: activemq的几 ...