【JavsScript】推荐五款流行的JavaScript模板引擎
摘要:Javascript模板引擎作为数据与界面分离工作中最重要一环,受到开发者广泛关注。本文通过开发实例解析五款流行模板引擎:Mustache、Underscore Templates、Embedded JS Templates、HandlebarsJS、Jade templating。
近日一位20岁的开发者Jack Franklin在《The top 5 JavaScript templating engines》一文中向开发者们推荐了5款流行的JavaScript模板引擎。下面为该文的译文。
当你创建JavaScript应用时,你必然会用到JavaScript模板。当对HTML进行更新时,你可使用模板来代替库(如jQuery),使用模板可以大大简化你的代码。该文将例举当前较流行的一些模板库。
1.Mustache
Mustache通常被称为JavaScript模板的基础。另一个流行的解决方案Hanldebars实际上就是基于Mustache构建而成的。这并不意味着Mustache是一个不好的模板解决方案。下面例举一例:
- Mustache.render("Hello, {{name}}", { name: "Jack" });
- // 返回: Hello, Jack
一旦在页面中包含了Mustache,你就可以访问全局对象“Mustache”。你可使用其中最主要的方法“render”,它包含两个参数。首个参数是实际的模板,第二个参数则为需要传入的参数值。
上例中,你可以看见“{{name}}”。其中的“{{}}”实际上为Mustache的语法,表示一个占位符。当Mustache对其进行编译时,它将在传入的对像中寻找“name”属性,并用该属性的值(该例中为“Jack”)来代替“{{name}}”。
在这里,模板只为一个字符串,但如果你有一个更复杂的模板,该方法可能就不适用了。通常的解决方案是将模板放在“script”标签中:
- <script type="text/x-mustache" id="template">
- <p>Hello, {{name}}</p>
- </script>
然后,我们可以访问的script标签的内容。例如,使用jQuery,它很容易实现:
- var temp = $("#template").html();
- Mustache.render(temp { name: "Jack" });
- // 返回: <p>Hello, Jack</p>
给“script”一个浏览器无法理解的“type”属性,浏览器就会忽略该Script,不将它作为JavaScript,也不会执行它。
你也可在模板中使用循环,如下面这个模板:
- {{#people}}
- {{name}}
- {{/people}}
传递数据:
- { people: [ { name: "Jack" }, { name: "Fred" } ] }
你将得到“JackFred”字符串。
Mustache还有更多的功能,点击这里查看详情。
Underscore提供了各种各样的有用的方法,也提供了简单的模板。它的语法与Mustache稍有不同。下面为一个简单案例:
- _.template("Hello, <%= name %>", { name: "Jack" });
- // 返回:Hello, Jack
如果你曾经使用过Embedded Ruby(缩写为ERB),你就会对该语法更为熟悉。“<%=name%>”表示无论“name”是什么值,都应该输出在“<%=name%>”的位置。Underscore同样有循环与条件语句,但与Mustache同样稍有不同。
- var template = "<% _.each(people, function(name) { %> <li><%= name %></li> <% }); %>"
- _.template(template, { people: ["Jack", "Fred"] } );
在Underscore模板中,你可以在“<% %>”是插入任何JavaScript。注意,“<%= %>”用于输出,<% %>用来包含JavaScript。这意味着你在JS中使用的任何形式的循环与条件语句同样可以在Underscore中使用。
了解Underscore更多功能,请点击这里查看。
Embedded JS(EJS) 来源于ERB模板,且与ERB有很多相似之处。它有着与ERB相同的Tag,且包含很多相同的功能。
EJS的特别之处在于,你需要把模板存于单独文件中,并将文件名传递给EJS。它会加载该文件,并返回HTML。
- // in template.ejs
- Hello, <%= name %>
- // in JS file
- new EJS({ url: "template.ejs" }).render({ name: "Jack" });
- // 返回: Hello, Jack
注意,你可以加载文本模板:
- new EJS({ text: "Hello, <%= name %>" }).render({ name: "Jack" });
下面将介绍如何进行循环,以数组“People”为例,并在网站上链接到他们的个人页面:
- // template.ejs
- <ul>
- <% for(var i = 0; i < people.length; i++) { %>
- <li><%= link_to(people[i], "/profiles/" + people[i]) %></li>
- <% } %>
- </ul>
- // in JS file
- new EJS({ url: "template.ejs" }).render({ people: [ "Jack", "Fred" ] })
- // Each rendered <li> will look like:
- <li><a href="/profiles/Jack">Jack</a></li>
这与Underscore 有些相似,但要注意“link_to”的使用。它是EJS定义的一个Helper,以便链接更容易使用。
了解更多EJS,请关注EJS官方网站。
Handlebars为最流行的模板引擎之一,构建于Mustache之上。适用于Mustache模板的功能同样适用于Handlebars模板。同时,Handlebars还增加了很多Helper。其中之一是“With”。
- // with this template:
- var source = "{{#with author}} <h2>By {{firstName}} {{lastName}}</h2> {{/with}}";
- var template = Handlebars.compile(source);
- var html = template({ author: { firstName: "Jack", lastName: "Franklin" } });
- // returns: <h2>By Jack Franklin</h2>
注意,Handlebars编译器的工作方式略有不同。首先,你把该模板传递给“Handlebars.compile”,它会返回一个函数。你将包含数据的对象传递给该函数,该函数将返回HTML。“{#with}}”Helper取得一个对象,并允许你在其中向该对象传递属性。但不是采用以下形式:
- {{ author.firstName}} {{author.lastName}}
而是下面这种形式
- {{#with author}} {{firstName}} {{lastName}} {{/with}}
这样可以节约输入,尤其当你十分频繁地使用它时。
Handlebars也提供了“each”Helper:
- var source = "{{#each people}} {{name}} {{/each}}";
- var template = Handlebars.compile(source);
- var html = template({ people: [{ name: "Jack" }, { name: "Fred" }] });
- //返回: "JackFred"
此外,你还可以使用自己的方法来扩展Handlebars,具体方法可参与该文档。
随着Node.js的流行及大量Web应用构建于它之上,现在已有很多模板被设计用于服务器端。Jade模板与我们目前为止看到的大不相同,它依靠大量的缩进与空格。下面看一例:
- // template.jade
- p
- | Hello,
- = name
- // JS
- jade.renderFile("template.jade", { name: "Jack" }, function(err, result) {
- console.log(result);
- // logs: Hello, Jack
- });
首次看到Jade可能会让你不舒服,但你会很快适应它。在“p”下面缩进两个字符,表明这两个字符存在于“p”内。“|”用来告知Jade,该行是需要输出的纯文本;“=”用来告知Jade寻找一个名为“name”的变量。
我们同样可以在Jade中使用循环:
- each person in people
- li=person
调出存储名字的数组:{ people: [ "Jack", "Fred" ]},它将输出:
- <li>Jack</li><li>Fred</li>
Jade具有很多其他模板所不具有的功能。它也可以做诸如输出Script标签此类的事:
- script(type="text/javascript", src="myfile.js")
了解更多Jade templating功能,请点击这里查看。
这里只例举了最流行的五款模板引擎。此外还有很多,希望以该文为起点,帮你找到最适合你自己的模板引擎。(编译:陈秋歌 审校:夏梦竹)
原文链接:The top 5 JavaScript templating engines
http://www.csdn.net/article/2013-09-16/2816951-top-five-javascript-templating-engines
【JavsScript】推荐五款流行的JavaScript模板引擎的更多相关文章
- JavaScript模板引擎artTemplate.js——为什么使用模板引擎?
作为一个工作一年的菜鸟,在公司做了几个外包项目,也接触到了不同形式的web开发.其实也没多少,就是javaweb开发和HTML5移动开发,这两者在页面展示的时候的解决方案还是有所不同的. 1.vo+e ...
- 推荐13款javascript模板引擎
javaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于j ...
- Javascript模板引擎mustache.js详解
mustache.js是一个简单强大的Javascript模板引擎,使用它可以简化在js代码中的html编写,压缩后只有9KB,非常值得在项目中使用.本文总结它的使用方法和一些使用心得,内容不算很高深 ...
- JavaScript模板引擎Template.js使用详解
这篇文章主要为大家详细介绍了JavaScript模板引擎Template.js使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 template.js 一款 JavaScript 模板引 ...
- 最简单的JavaScript模板引擎
在小公司待久了感觉自己的知识面很小,最近逛博客园和一些技术网站看大家在说JavaScript模版引擎的事儿,完全没有概念,网上一搜这是08年开始流行起来的...本来以为这是很高深的知识,后来在网上看到 ...
- JavaScript模板引擎实例应用
在之前的一篇名为<移动端基于HTML模板和JSON数据的JavaScript交互>的文章中,我向大家说明了为什么要使用JavaScript模板以及如何使用,文末还提到了laytpl.art ...
- 如何选择Javascript模板引擎(javascript template engine)?
译者 jjfat 日期:2012-9-17 来源: GBin1.com 随着前端开发的密集度越来越高,Ajax和JSON的使用越来越频繁,大家肯定免不了在前台开发中大量的使用标签,常见到的例子如下: ...
- 高性能JavaScript模板引擎原理解析
随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC ...
- JavaScript模板引擎
JavaScript模板引擎实例应用 在之前的一篇名为<移动端基于HTML模板和JSON数据的JavaScript交互>的文章中,我向大家说明了为什么要使用JavaScript模板以及 ...
随机推荐
- Python 读取excel
一.到python官网下载http://pypi.python.org/pypi/xlrd模块安装, sudo python setup.py install 二.使用介绍 1.导入模块 import ...
- TopFreeTheme精选免费模板【20130703】
今天我们给大家分享13个最新的主题模板,5款WordPress主题,5款Joomla模板,3款OpenCart主题. BowThemes – BT Folio v1.0 Template for Jo ...
- 上传控件swfupload的使用笔记
1.下载下来的官方domo里不同的例子里会引入各自的JS,注意区分.可以直接拿官方例子来改成自己想要的例子. 2.注意PHP配置文件里也有最大上传文件限制,如果文件太大会上传不成功. 3.如果有问题可 ...
- 使用Go开发一个简单的服务器程序
最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌callback,虽然我也很喜欢异步模型,但我一直都觉得JS是反人类的.后台就用了go处理, ...
- 给一已经排序数组A和x,求A中是否包含两个元素之和为x
亲爱的大神老爷们,这是小渣第一次写blog,欢迎大家来喷(批评指正),算法渣因为面试中连这道题都不会写就自己琢磨了一下,也参考了网上大家的做法 解法一: 思路:从首尾向目的靠拢,因为已经排序,[假设存 ...
- Android将ScrollView移动到最底部
转载地址:http://hi.baidu.com/gaogaf/item/36e8a4c8ac6ba31050505848 scrollTo方法可以调整view的显示位置.在需要的地方调用以下方法即可 ...
- 无线网WEP的安全测试及防范
650) this.width=650;" border="0" alt="" src="http://img1.51cto.com/att ...
- php--opp--1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...
- ESP8266 TCP传输AT指令顺序
); //复位 ret = ESP8266_Cmd ( );//测试AT启动 ret = ESP8266_Cmd ( );//选择WIFI应用模式softAP+station //ret = ESP8 ...
- 成功获取并更改中兴F660光猫的超级用户密码解除四台限制
上次雷雨后更换的中兴的F660光猫还是很不错的,很稳定,不过超级密码确实记不住,找了些资料,今天成功的更改了密码,简要的写出过程以备下次参考: 第一步:获取超级密码(已知用户名telecomadmin ...