Jade是Node的一个模板引擎,借鉴了Haml,语法上和Haml有很多类似之处,Jade的主要优势为HTML元素同事渲染闭合和开始标签,当然也会添加符号<>和< />。
一行开头的任何文本都会被默认解释称HTML标签,标签后的文本和空格会被解析成内联的HTML,即元素的文本内容:
body div h1 Hello node p jade语法 div footer ©App 上述模板会被解析成:
<body> <div> <h1>Hello node</h1> <p>jade 语法</p> </div> <div> <footer> App</footer> </div> </body> 传给Jade模板的数据称为 locals 。有输出一个变量,使用等号 = :
h1= title p= body //传递的locals { title:'数据1', body: 'body变量' } 输出地HTML:
<h1>数据1</h1> <p>body变量</p> 如果要在文本中读取变量的值,则通过 #{name} 语法实现:
- var title = 'node.js' p I am studying #{title}. 属性紧跟在标签的名字之后,用括号括起来,格式是 name=value ,多个属性用逗号分开:
div(id='content', class='main') a(href='http://www.ido321.com', title='我的博客') 博客地址 form(action='/login') button(type='submit') div(class='hero') Learn Node 输出地HTML为:
<div id="content" class="main"> <a href="http://www.ido321.com">博客地址</a> <form action="/login"> <button type='submit'></button> </form> <div class="hero">Learn Node</div> </div> 属性值可以用 locals 中的变量代替,符号 | 允许在新的一行中写HTML中的内容,即 该符号之后的那行内容会变成文本内容 :
a(href=url, data-active=isActive) label input(type='checkbox',checked=isChecked) | yes/no //locals数据 { url: '/login', isActive:true, isChecked:false } 输出地HTML为:
<a href="/login" data-active='true'></a> <label> <input type='checkbox' />yes/no </label> 可以输出多行文本内容:
div | 文本1 | 文本2 在Jade中,如果没有写标签名,则默认是 div ,因而,可以直接在元素后写类和id来生成元素:
div#center p.lead.test | web app #side.pull-right span.contact.span4 a(href="/contact") contact me 输出地HTML为:
<div id="center"> <p class="lead test"> web app <div id="side" class="pull-right"></div> <span class="contact span4"> <a href="/contact">contact me</a> </span> </p> </div> 使用 . ,可以直接在模板中输入Javascript和Style:
script. console.log('hello'); setTimeout(function(){ console.log('script'); },1000); 被编译后,输出内容为:
<script> console.log('hello'); setTimeout(function(){ console.log('script'); },1000); </script> 上述是通过 script 标签嵌入js,如果要在模板编译时使用Javascript,可以使用符号 - 、 = 和 != :
- 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] 输出地HTML内容:
<ul> <li> <span>0</span><span>unescaped:<a>vs.</span><span>escaped:<a> </li> <li> <span>1</span><span>unescaped:<b>vs.</span><span>escaped:<b> </li> <li> <span>2</span><span>unescaped:<c>vs.</span><span>escaped:<c> </li> </ul> 还可以加入注释。如果要输出注释,则使用 // ,如果不输出注释,则使用 //- :
// 输出注释 p 上面是注释 //- 不输出注释 div 上面注释没有输出 对应输出地HTML内容是:
<!-- 输出注释--> <p>上面是注释</p> <div>上面注释没有输出</div> 通过符号 - 能在模板中嵌入js,还有一种不需要前缀 - 和括号的简洁写法:
- var user = {} - user.admin = Math.random() > 0.5 if user.admin button(class = "test") 这是按钮 else | 文本 unless 的判断则和 if 相反。
改语句用于迭代数组或对象,比 for 更简洁的语法:
- var language = ['php', 'node', 'java']; div each value, index in language p= index + '. ' + value 输出地HTML为:
<div> <p>0. php</p> <p>1. node</p> <p>2. java</p> </div> 有多个选择区分时,可以用 case 实现:
- var coins = Math.round(Math.random() * 10) case coins when 0 p You hava no money when 1 p You have a coin default p You hava #{coins} coins mixin 是带参数,并产生一些HTML的函数。声明的语法是 mixin name(param1, 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: 'hapi'}, {name: "derby"}] +table(node) 输出地HTML为:
<table> <tr> <td>express</td> </tr> <tr> <td>hapi</td> </tr> <tr> <td>derby</td> </tr> </table> include 是自顶向下的方法,用于引入其他的Jade模板,实现模板的复用,语法: include /path/filename 。
比如,在A文件中:
include ./includes/header 不用给模板名字和路径加上单引号和双引号,支持相对路径:
//从父目录开始查找 include ../xxx extend 是自底向上的方法,包含的文件决定它要替换主文件的哪一个部分,语法: extend filename 和 block filename 。
在文件A中:
block header p default text block content p Loading.... block footer p copyright 在文件B中:
extend A block header p 这是文件B block content .main-content