Juicer 中文文档

当前最新版本: 0.6.8-stable

Juicer 是一个高效、轻量的前端 (Javascript) 模板引擎,使用 Juicer 可以是你的代码实现数据和视图模型的分离(MVC)。 除此之外,它还可以在 Node.js 环境中运行。

你可以在遵守 MIT Licence 的前提下随意使用并分发它。Juicer 代码完全开源并托管在 Github 上,如果你在使用的过程中发现 什么 Bug 抑或是一些好的建议都欢迎在 Github Issue 上提交。

名字的由来

倘若我们把数据比作新鲜可口的水果,把模板看做是水,Juicer 就是把水果和水榨出我们需要的HTML代码片段的榨汁机。

Juicer 的引入

<script type="text/javascript" src="juicer-min.js"></script>

* 使用方法

> 编译模板并根据所给的数据立即渲染出结果.

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': '}'
});

默认参数配置

{cache:          true [false],strip:          true [false],errorhandling:  true [false],detection:      true [false]
}

默认配置是 Juicer 推荐的使用方式,如果你使用过程中的确需要更改这些参数,可以这么做:

逐条参数更改:
juicer.set('strip',false);
juicer.set('cache',false);
批量参数更改:
juicer.set({'strip': false,'cache': false
};

Juicer 默认会对编译后的模板进行缓存,从而避免同一模板多次数据渲染时候重复编译所耗的时间, 如无特殊需要,强烈不建议关闭默认参数中的 cache,这么做将会令 Juicer 缓存失效从而降低性能.

* 语法

a. ${变量}

使用 ${} 输出变量值,其中 _ 为对数据源的引用(如 ${_},常用于数据源为数组的情况)。支持自定义函数(通过自定义函数你可以实现很多有趣的功能,类似 ${data|links} 就可以 通过事先定义的自定义函数 links 直接对 data 拼装出<a href=".." alt=".." /> ).

${name}
${name|function}
${name|function, arg1, arg2}

让我们通过一个例子演示一下自定义函数的奇妙用法吧.

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);

上述代码执行后我们会发现结果是这样的:

&lt;a href=&quot;http://juicer.name&quot; alt=&quot;Juicer&quot; <br />
&lt;a href=&quot;http://benben.cc&quot; alt=&quot;Benben&quot; <br />
&lt;a href=&quot;http://ued.taobao.com&quot; alt=&quot;Taobao UED&quot; <br />

可以看得出,结果被转义了,如果我们上边使用 $${item|links} 就会得到我们预期的结果,这就是下边即将提到的避免转义。

转义/避免转义

出于安全角度的考虑,${变量} 在输出之前会对其内容进行转义,如果你不想输出结果被转义,可以使用 $${变量} 来避免这种情况。 例如:

var json = {value: '<strong>juicer</strong>'
};var escape_tpl='${value}';
var unescape_tpl='$${value}';juicer(escape_tpl, json); //输出 '&lt;strong&gt;juicer&lt;/strong&gt;'
juicer(unescape_tpl, json); //输出 '<strong>juicer</strong>'

b. 内联辅助函数 {@helper} ... {@/helper}

如果你需要在页面或者模板内定义辅助函数,可以像这样使用 `helper`,同时支持Node和Browser.

<!--
{@helper numberPlus}function(number) {return number + 1;}
{@/helper}
-->

Javascript 代码:

var tpl = 'Number: ${num|numberPlus}';juicer(tpl, {num: 123
});//输出 Number: 124

c. 循环遍历 {@each} ... {@/each}

如果你需要对数组进行循环遍历的操作,就可以像这样使用 `each` .

{@each list as item}${item.prop}
{@/each}

如果遍历过程中想取得当前的索引值,也很方便.

{@each list as item, index}${item.prop}${index} //当前索引
{@/each}

d. 判断 {@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}

e. 注释 {# 注释内容}

为了后续代码的可维护性和可读性,我们可以在模板中增加注释.

{# 这里是注释内容}

f. 辅助循环 {@each i in range(m, n)}

辅助循环是 Juicer 为你精心设置的一个语法糖,也许你会在某种情境下需要它.

{@each i in range(5, 10)}${i}; //输出 5;6;7;8;9;
{@/each}

g. 子模板嵌套 {@include tpl, data}

子模板嵌套可以让你更灵活的组织你的模板代码,除了可以引入在数据中指定的子模板外,当然你也可以通过指定字符串`#id`使用写在`script`标签中的模板代码.

HTML代码:

<script type="text/juicer" id="subTpl">I'm sub content, ${name}
</script>

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'}
});

* 在 Node.js 环境中运行

在命令行中执行:
npm install juicer在代码中这么引入:
var juicer = require('juicer');
var html = juicer(tpl, data);

在 express.js 框架中使用

在 express 2.x 系列版本中:

npm install juicer
var juicer = require('juicer');
app.set('view engine', 'html');
app.register('.html', {compile: function(str, options) {return juicer.compile(str, options).render;}
});

在 express 3.x 系列版本中:

npm install juicer
var juicer = require('juicer');
var fs = require('fs');
app.set('view engine', 'html');
app.engine('html', function(path, options, fn){fs.readFile(path, 'utf8', function(err, str){if (err) return fn(err);str = juicer(str, options);fn(null, str);});
});

或者也可以借助 juicer-express-adapter 中间件在Node端使用Juicer以及简单的include功能。

npm install juicer-express-adapter

在命令行预编译模板文件:

npm install -g juicer
juicer example.juicer.tmpl -f example.js// type `juicer` after install for more help.
// 全局模式安装 `juicer` 后,在命令行下输入 `juicer` 可以获得更多帮助信息。

* 一个完整的例子

HTML 代码:<script id="tpl" type="text/template"><ul>{@each list as it,index}<li>${it.name} (index: ${index})</li>{@/each}{@each blah as it}<li>num: ${it.num} <br />{@if it.num==3}{@each it.inner as it2}${it2.time} <br />{@/each}{@/if}</li>{@/each}</ul>
</script>Javascript 代码:var data = {list: [{name:' guokai', show: true},{name:' benben', show: false},{name:' dierbaby', show: true}],blah: [{num: 1},{num: 2},{num: 3, inner:[{'time': '15:00'},{'time': '16:00'},{'time': '17:00'},{'time': '18:00'}]},{num: 4}]
};var tpl = document.getElementById('tpl').innerHTML;
var html = juicer(tpl, data);

Juicer 中文文档相关推荐

  1. PyTorch官方中文文档:torch.optim 优化器参数

    内容预览: step(closure) 进行单次优化 (参数更新). 参数: closure (callable) –...~ 参数: params (iterable) – 待优化参数的iterab ...

  2. golang中文文档_Golang 标准库 限流器 time/rate 设计与实现

    限流器是后台服务中十分重要的组件,在实际的业务场景中使用居多,其设计在微服务.网关.和一些后台服务中会经常遇到.限流器的作用是用来限制其请求的速率,保护后台响应服务,以免服务过载导致服务不可用现象出现 ...

  3. springboot中文文档_登顶 Github 的 Spring Boot 仓库!艿艿写的最肝系列

    源码精品专栏 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 My ...

  4. Apache Spark 2.2.0 中文文档 翻译活动

    为什么80%的码农都做不了架构师?>>>    Spark 2.2.0 已然发布(2017-07-11 发布) 5 天了,更新了一些新套路吧! 此版本从 Structured Str ...

  5. Python爱好者周知:Scikit-Learn中文文档正式发布

    整理 | 费棋 出品 | AI科技大本营(公众号ID:rgznai100) 近日,Scikit-Learn 中文文档已由开源组织 ApacheCN 完成校对.该中文文档依然包含了 Scikit-Lea ...

  6. GitHub 中文文档正式发布

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 中国作为全球最大的人口大国,所属开发者在 GitHub 上的占比自 ...

  7. 推荐:Webpack2入门到深入的中文文档

    2019独角兽企业重金招聘Python工程师标准>>> 最近看了一本不错的<<webpack2中文文档>>的PDF,对比于wepack2官网(https:// ...

  8. matlab中文文档_Linux下Matlab安装

    如果觉得文章好看,欢迎点赞.同时欢迎关注微信公众号:氷泠之路. 引言 抱歉国庆由于各种原因一直没空更新文章,啊啊啊啊啊.... 因为在忙各种各样的事情,都怪女朋友,另外也更新了"装备&quo ...

  9. 使用编译器——Solidity中文文档(8)

    写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第八部分<使用编译器>,特发布出来邀请solidity爱好者.开发者做公开 ...

最新文章

  1. opencv python 多帧降噪算法_防抖技术 | OpenCV实现视频稳流
  2. Linux环境安装Mysql
  3. 设计模式到底离我们有多远
  4. Maven与IDEA结合
  5. msbuild构建步骤_如何按照以下步骤构建最终的AI聊天机器人
  6. java 高级编程进阶_JAVA高级编程之hibernate进阶学习
  7. Golang 五种原子性操作的用法详解
  8. openstack: No valid host was found. There are not enough hosts available
  9. Atitit 嵌入式tomcat 嵌入式服务器 attilax 你感觉艾提拉 总结 比起嵌入jetty ,文件可以自动刷新貌似还不错。。方便调试debug package com.attilax.
  10. 接口自动化测试平台,Django“踩坑”之旅(四):“Not Found: /favicon.ico”错误处理
  11. c语言驻波,C版:基于声学驻波的液位检测方法C2-1(全文完整版)
  12. 【杂记】数据存储架构
  13. 酷派 手机 stop charging
  14. 家装产业的数字化,正在成为越来越多人的新共识
  15. 十一、PL/SQL过程
  16. ACL 2017 最佳长论文,带你创造一门优雅的新语言
  17. 图傅里叶变换(GFT)
  18. cpolar内网穿透外网远程访问本地网站
  19. 大数据培训课程Yarn资源调度器任务的推测执行
  20. 火车运煤问题 - 增加一个简单算法实现

热门文章

  1. python打包成.exe程序
  2. 数据结构(一)---顺序表的实现---java版
  3. 在控制台中录入学生姓名(python)
  4. 关于VMware虚拟机的上网
  5. 谷歌最新双塔DNN召回模型——应用于YouTube大规模视频推荐场景
  6. Java I/O体系原理
  7. 聊聊高并发(二十六)解析java.util.concurrent各个组件(八) 理解CountDownLatch闭锁
  8. Redis Cluster高可用(HA)集群环境搭建详细步骤
  9. Ubuntu 16.04安装Memcached(单机)
  10. 光伏行业春意盎然?一文看懂行业家底和五大趋势