详解Node.js模板引擎Jade入门
jade是node.js的一个模板引擎,它借鉴了haml的很多地方,所以语法上和haml比较相近。并且,jade也支持空格。
1、标签
在jade里,一行开头的任何文本都被默认解释成html标签。并且你只需要你写开始标签——注意:不需要加“<>”。因为jade会帮我们渲染闭合和开始标签。例如:
body div h1 jade是node.js的一个模板引擎 p 它借鉴了haml的很多地方,所以语法上和haml比较相近。 div footer © pandora
上面的jade模板最终渲染出的html代码是:
<body> <div> <h1> jade是node.js的一个模板引擎</h1> <p>它借鉴了haml的很多地方,所以语法上和haml比较相近。</p> </div> <div> <footer>© pandora</footer> </div> </body>
注意:如果没有写标签名,则默认就是div标签。
2、变量/数据
传给jade模板的数据我们称之为locals。 使用等号“=”来输出一个变量的值。
(locals):
{ title: "express.js guide", body: "the comprehensive book on express.js" }
jade code :
h1= title p= body
渲染输出的html :
<h1>express.js guide</h1> <p>the comprehensive book on express.js</p>
3、读取变量
jade中读取变量的值是通过#{name}来实现的。例如:
- var title = "node" p i love #{title}
在模板被编译时变量的值就会被处理,所以,不要在可执行javascript(-)里使用它。
4、属性
属性紧跟在标签之后,且用“()”括起来,多属性用“,”分隔。例如:body (name1 = “value1”, name2 = “value2”)。
div(id="content", class='main') a(href='http://csdn.net', title='csdn主页', target='_blank') csdn:中国软件联盟 form(action="/login") button(type="submit", value="提交")
输出:
<div id="content" class='main'> <a href='http://csdn.net' title='csdn主页' target='_blank'> csdn:中国软件联盟</a> <form action="/login"> <button type="submit" value="提交"> </form> </div>
动态属性:
动态属性即属性的值是动态的,即用一个变量来表示属性的值。符号“|”可以在新的一行里写html节点内容。例如:
a(href=url, data-active=isactive) label input(type="checkbox", checked=ischecked) | yes / no
提供给上面模板的数据:
{ url: "/logout", isactive: true, ischecked: false }
最终渲染后输出的html:
<a href="" data-active=" rel="external nofollow" data-active"></a> <label> <input type="checkbox" />yes / no </label>
注意:属性值为false的属性在输出html代码时将被忽略;而没有传入属性值时,将默认为true.
5、字面量
为了省事,可以直接在标签名之后写类名和id名。例如:
div#content p.lead.center | pandora_galen #side-bar.pull-right // 没有标签名,默认为“div” span.contact.span4 a(href="/contact" rel="external nofollow" rel="external nofollow" ) contact me
渲染输出的html:
<div id="content"> <p class="lead center"> pandora_galen <div id="side-bar" class="pull-right"></div> <span class="contact span4"> <a href="/contact" rel="external nofollow" rel="external nofollow" > contact me </a> </span> </div>
6、文本
使用“|”符号输出原始文本。
div | 我两年前开始学习前端 | 在此之间,我学过了html, jquery, javascript, python, css3, html5, bootstrap, d3.js, svg...而现在我在学node。并且我已经深深的爱上了前端。
7、script 和 style块
使用“.”符号在html里创建
script. console.log("hello world!"); settiemout(function() { window.location.href = "http://csdn.net" }, 1000); console.log("good bye!");
生成的代码:
<script> console.log("hello world!"); settiemout(function() { window.location.href = "http://csdn.net" }, 1000); console.log("good bye!"); </script>
同理,style.生成的是<style></style>。
8、javascript代码
使用-,=或!=这三个符号在jade中写可以操纵输出的可执行js代码。这在要输出html元素和注入javascript时是很有用的。不过,这么做一定要小心避免跨站脚本(xss)的攻击。
比如,可以使用!=定义一个array, 输出标签数据:
- var arr = ['<a>', '<b>', '<c>'] ul -for (var i = 0; i < arr.length; i++) li span= i span!= "unescaped:" + arr[i] + "vs." span= "escaped:" + arr[i]
生成的代码如下:
<ul> <li><span>0</span><span>unescaped: <a>vs. </span><span>escaped: <a></span></li> <li><span>1</span><span>unescaped: <b>vs. </span><span>escaped: <b></span></li> <li><span>2</span><span>unescaped: <c>vs. </span><span>escaped: <c></span></li> </ul>
模板引擎jade和handlebars的一个主要的区别就是: jade允许在代码里写几乎所有的javascript ; 但是,handlebars则限制了开发人员只能使用少量的内置和自定义的helpers。
9、注释
jade的注释有两种:
<1>. 输出到页面的——“//”
<2>. 不输出到页面的—— “//-”
// 普通注释,会输出到渲染后生成的html页面 p hello jade content //- 特殊注释,不会输出到html页面 p (id="footer") copyright 2016
输出:
<!-- 普通注释,会输出到渲染后生成的html页面 --> <p> hello jade content </p> <p id="footer">copyright 2016</p>
10、if 语句
给if语句加个前缀-,这样就可以写标准的javascript代码了; 也可以不用前缀、不用括号,当然后者更简洁。
- var user = {} - user.admin = math.random() > 0.5 if user.admin button(class = "launch") launch spacecraft else button(class = "login") log in
此外,还有unless, 它相当于不或者!。
注意: 每行的代码结尾处并没有分号“;”
11、each语句
在jade里迭代很简单,只需要使用each语句就行了。
- var language = ['javascript', 'node', 'python', 'java'] div each value, index in language p= index + "," + value
输出:
<div> <p>0. javascript</p> <p>1. node</p> <p>2. python</p> <p>3. java</p> </div>
示例2:
- var language = ['javascript': -1, 'node': 2, 'python': 3, 'java': 1] div each value, key in languages p= key + ":" + value
输出:
<div> <p>javascript: -1</p> <p>node: 2</p> <p>python: 3</p> <p>java: 1</p> </div>
12、过滤器
过滤器的作用是: 用另一种语言来写一个文本块;
p :markdown # practical node.js [this book](http://csdn.net) really helps to grasp many coponents needed for modern-day web development.
注意: 要想使用markdown过滤器,需要安装markdown模块,以及marked和markdown npm包。
13、case
- var coins = math.round(math.random() * 10) case coins when 0 p you have no money when 1 p you have a coin default p you have #{coins} coins!
14、function mixin
如果你使用过sass又或者compass的mixin你肯定不会陌生,而jade 里mixin的使用方法和它们基本相同。
声明的语法: mixin name(param, param2, …….)
调用: +name(data)
mixin row(items) tr each item, index in items td= item mixin table(tabledata) table each row, index in tabledata +row(row) - var node = [{name: "express"}, {name: "jade"}, {name: "handlebars"}] +table(node) - var js = [{name: 'backbone'}, {name: 'angular'}, {name: "emberjs"}] +table(js)
输出:
<table> <tr> <td>express</td> </tr> <tr> <td>jade</td> </tr> <tr> <td>handlebars</td> </tr> </table> <table> <tr> <td>backbone</td> </tr> <tr> <td>angular</td> </tr> <tr> <td>emberjs</td> </tr> </table>
15、include
include与引入js和css外部文件很相似。它是自顶向下的方法: 在include其它文件的主文件里,我们决定要用什么。主文件会被首先处理(可以在主文件了定义数据locals),然后才会再接着处理主文件里所包含进来的子文件(子文件里可以使用主文件中定义的数据locals);
包含一个jade模板,用include /path/filename.
例如,在文件a里:
include ./includes/header
注意: 这里不用给模板名以及路径添加双引号或者单引号。
再例如,从父目录开始查找:
include ../includes/footer
注意:不能再文件名和文件路径中使用变量,因为includes/partials是在编译时处理的,而不是在执行时。
对于使用sass、compass又或者less的人这些事再熟悉不过的了。
16、extend
extend与include“唱对台戏”,正好相反,extend是一种自底向上的方法。它所包含的文件决定它要替换主文件中哪那一部分。
使用格式: extend filename 和 block blockname;
示例-1: 在文件file_a里:
block header p some default text block content p loading... block footer p copyright
示例-2: 在文件file_b里:
extend file_a block header p very specific text block content .main-content
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: javascript数组拍平方法总结