Node模板引擎學(xué)習(xí)(1)--Jade

Jade

安裝:

npm install jade –global

安裝后本地隨便新建一個(gè)sample.jade文件秘车,執(zhí)行:

jade sample.jade

就能將其翻譯成標(biāo)準(zhǔn)的sample.html源文件了
命令參數(shù):
-P(大寫钧嘶,命令參數(shù)是大小寫敏感的)龟劲。Jade默認(rèn)編譯出來的html源文件里是沒有縮進(jìn)的炒嘲,不便于開發(fā)。加上-P參數(shù)后尝哆,編譯出來的html源文件里就有縮進(jìn)了:

jade -P sample.jade

-w用來watch監(jiān)視jade文件沮尿,每次改動(dòng)保存后自動(dòng)編譯成html文件,省去手動(dòng)執(zhí)行命令的麻煩:

jade -P -w sample.jade

-O用來給jade文件傳遞對(duì)象或JSON文件较解,用以替換模板內(nèi)的變量:

jade -P -w sample.jade -O sample.json

標(biāo)簽和屬性

省略尖括號(hào)畜疾,直接寫標(biāo)簽名。標(biāo)簽間的嵌套關(guān)系用換行加空格來實(shí)現(xiàn)印衔。緊接在標(biāo)簽名后加上.xx或#xx啡捶,就能給標(biāo)簽添加css類名和id。

標(biāo)簽名后第一個(gè)空格后面的內(nèi)容會(huì)被編譯成標(biāo)簽內(nèi)的文本內(nèi)容

標(biāo)簽屬性的正統(tǒng)寫法應(yīng)該是寫入()括號(hào)內(nèi)

多行文本

在每行前加上|豎線符

用這種寫法奸焙,可以用Jade語法來嵌套標(biāo)簽, 不僅可用于p標(biāo)簽等瞎暑,也常見于style和script標(biāo)簽

p
  span 第1行文本
  | 第2行文本
  | 第3行文本
  | 第4行文本

//編譯出來的結(jié)果
<p><span>第1行文本</span>第2行文本
  第3行文本
  第4行文本
<p>
script.
  console.log("open mind");
  console.log("learning quick");
  console.log("work hard");

變量

變量聲明很簡(jiǎn)單,前面加上-橫杠与帆。使用變量只要#{變量名}就行了了赌。例如:

- var cs = 'UTF-8'
meta(charset='#{cs}')

//編譯出來的結(jié)果
<meta charset="UTF-8">
input(value='#{aaa}')
input(value=aaa)

//編譯出來的結(jié)果
<input value="undefined">
<input>

如果不想HTML轉(zhuǎn)碼,可以將#改成!嘆號(hào)

可以前面加\反斜杠來讓Jade引擎不編譯變量

可以在標(biāo)簽后面緊接=等號(hào)(不轉(zhuǎn)義用!=)來輸出變量

可以看出用#{}如果變量未定義玄糟,將會(huì)編譯成undefined作為初始值勿她。但用=等號(hào)來編譯變量的話,如果變量未定義就忽略

有了變量就能輕松實(shí)現(xiàn)前后端分離阵翎。數(shù)據(jù)保存在JSON文件里逢并。前端用Jade模板制作頁(yè)面之剧,在需要顯示數(shù)據(jù)處用變量來實(shí)現(xiàn)。例如sample.json文件里:

{
  "charset": "UTF-8",
  "title": "My First Jade Page"
}

sample.jade文件里:

doctype html
html
  head
    meta(charset='#{charset}')
  body
    h1.titleClass#titleID #{title}

執(zhí)行命令:jade -P -w sample.jade -O sample.json后Jade文件里的變量被自動(dòng)替換砍聊。編譯出來的sample.html:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    <h1 id="titleID" class="titleClass">My First Jade Page</h1>
  </body>
</html>

語句

  • if-else
  • unless
  • case-when
  • for-in
  • each-in
  • while
- var author = 'Jack';
if author
  p 作者:#{author}
else
  p 無作者

//編譯出來的結(jié)果
<p>作者:Jack</p>

Jade還支持unless語句背稼,它是if-else的反向,寫法都一樣玻蝌,用的不多就不舉例了蟹肘。
Jade里的case-when語句就是JavaScript里的switch-case語句(不知為何…)

- var authors = ['Jack', 'Bill'];case authors[0]
  when 'Jack'
    p 作者是Jack
  when 'Bill'
    p 作者是Bill
  default
    p 無作者

//編譯出來的結(jié)果
<p>作者是Jack</p>

循環(huán)遍歷用for-in(注意上面的if-else,case-when語句前不用像變量那樣加上-橫杠俯树,但for的前面要加上-橫杠疆前。如果漏寫-橫杠,會(huì)被解析為標(biāo)簽):

- var person = {name:'Jack', gender: 'Male'}
- for (var prop in person)
  p= person[prop]

//編譯出來的結(jié)果
<p>Jack</p>
<p>Male</p>
循環(huán)遍歷也可以用each-in(each前的-橫杠加不加均可):- var employee = {name:'Jack', gender: 'male'}
- each value, key in person
  p #{key}: #{value}
- var language = ['Java', 'JavaScript', 'C++']
ul
  each item in language
    li #{item}

//編譯出來的結(jié)果
<p>name: Jack</p>
<p>gender: male</p>
<ul>
  <li>Java</li>
  <li>JavaScript</li>
  <li>C++</li>
</ul>

循環(huán)遍歷也可以用while(同樣前面加不加-橫杠均可):

- var n = 0
ul
  while n < 4
    li= n++

//編譯出來的結(jié)果
<ul>
  <li>0</li>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>

Mixin

mixin personInfo(name, hobbies)
  p #{name}'s hobbies:
    ul.hobby
      each hobby in hobbies
        li= hobby
+personInfo('Jack', ['movie', 'music'])

//編譯出來的結(jié)果
<p>Jack's hobbies:</p>
<ul class="hobby">
  <li>movie</li>
  <li>music</li>
</ul>

模板

Jade用block和extends來實(shí)現(xiàn)模板的繼承

block真正的作用在于占位聘萨,供子文件繼承竹椒,可以理解為傳統(tǒng)OO語言里的虛函數(shù)。父文件里定義的block米辐,子文件里用extends來繼承并重寫

例如每個(gè)文件的頁(yè)頭都一樣胸完,就body里內(nèi)容不一樣,可以寫一個(gè)header.jade:

doctype html
html
  head
    meta(charset='#{charset}')
    block scripts
      script(src='jquery.js')
      script(src='underscore.js')
      script(src='backbone.js')
  body
    block content
      p please write content

每個(gè)頁(yè)面的header都長(zhǎng)這樣翘贮。而body里定義了block content赊窥,這里block可以理解為一個(gè)占位符placeholder,需要繼承它的文件重寫block content狸页。根據(jù)業(yè)務(wù)需求寫頁(yè)面主體部分锨能,例如sample.jade改成這樣:

extends header

block content
  h1.titleClass#titleID #{title}
  a(, target='_blank') 我的主頁(yè)
  ……

在sample.jade里,開頭用extends表明和header.jade的繼承關(guān)系芍耘。然后根據(jù)業(yè)務(wù)重寫header.jade里的block content址遇。

(執(zhí)行jade -P -w sample.jade -O sample.json就能看到和之前一模一樣的頁(yè)面。引擎加載流程是:解析sample.jade斋竞,發(fā)現(xiàn)開頭有extends倔约,就去解析header.jade,將其編譯成html坝初。此時(shí)html里的body里是<p>please write content</p>浸剩。解析完header.jade就繼續(xù)解析sample.jade,發(fā)現(xiàn)block content鳄袍,于是會(huì)將定義在header.jade里的block content替換掉绢要。最終輸出的是正確的頁(yè)面內(nèi)容,而不是<p>please write content</p>拗小。(但如果你執(zhí)行的是jade -P -w header.jade -O sample.json會(huì)發(fā)現(xiàn)body里內(nèi)容為<p>please write content</p>))

除繼承外還可以用include包含重罪。Include會(huì)將內(nèi)容無腦全拷貝進(jìn)去。例如上面的sample.jade第一行extends header改成include header。

與extends不同蛆封,include就是無腦將另一個(gè)文件里的內(nèi)容直接拷貝進(jìn)去,不像block + extends可以重寫block勾栗。

注意:include包括extends如果省略后綴名惨篱,Jade默認(rèn)該文件時(shí).jade會(huì)進(jìn)行編譯。但如果另一個(gè)文件里寫的是原生的html围俘,需要寫明后綴名為.html(例如include xx.html)砸讳,明確告訴Jade不要編譯。

注釋

Jade里加上//就能添加注釋界牡,用雙斜杠的注釋會(huì)被輸出到html源碼里簿寂。

如果不想在html源碼里輸出注釋,用//-宿亡,在雙斜杠后加一橫杠常遂。

html里還可以寫注釋型的條件語句,常用于兼容IE挽荠。Jade里你同樣可以寫這些條件語句克胳,例如將上面header.jade改成能識(shí)別IE89,應(yīng)用不同的class:

doctype html
<!--[if IE 8]><html class='ie8'><![endif]-->
<!--[if IE 9]><html class='ie9'><![endif]-->
<!--[if !IE]><!--><html><!--<![endif]-->
head
  meta(charset='#{charset}')
  block scripts
    script(src='jquery.js')
    script(src='underscore.js')
    script(src='backbone.js')
body
  block content
  p please write content
</html>

上面因?yàn)橛辛藯l件語句圈匆,所以html標(biāo)簽用尖括號(hào)括了起來漠另,因此最下面要手動(dòng)加上來閉合標(biāo)簽。而且Jade是空格縮進(jìn)敏感的跃赚,需要將原先的head和body包括里面內(nèi)容笆搓,全往前縮進(jìn)2個(gè)空格。

塊注釋

塊注釋也是支持的:

body
  //
    #content
      h1 Example

渲染為:

<body>
  <!--
  <div id="content">
    <h1>Example</h1>
  </div>
  -->
</body>

Jade 同樣很好的支持了條件注釋:

body
  //if IE
    a() Get Firefox

渲染為:

<body>
  <!--[if IE]>
    <a >Get Firefox</a>
  <![endif]-->
</body>

過濾器

Jade同樣兼容其他模塊纬傲,例如寫博客愛用的markdown满败,寫css愛用的less,還有coffeeScript等叹括。只要npm安裝好后葫录,用:冒號(hào)+模塊名就能聲明使用這些模塊,例如:

:markdown
  ...
:less
  ...
:coffee
 ...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末领猾,一起剝皮案震驚了整個(gè)濱河市米同,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摔竿,老刑警劉巖面粮,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異继低,居然都是意外死亡熬苍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柴底,“玉大人婿脸,你說我怎么就攤上這事”ぃ” “怎么了狐树?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鸿脓。 經(jīng)常有香客問我抑钟,道長(zhǎng),這世上最難降的妖魔是什么野哭? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任在塔,我火速辦了婚禮,結(jié)果婚禮上拨黔,老公的妹妹穿的比我還像新娘蛔溃。我一直安慰自己,他們只是感情好篱蝇,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布城榛。 她就那樣靜靜地躺著,像睡著了一般态兴。 火紅的嫁衣襯著肌膚如雪狠持。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天瞻润,我揣著相機(jī)與錄音喘垂,去河邊找鬼。 笑死绍撞,一個(gè)胖子當(dāng)著我的面吹牛正勒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傻铣,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼章贞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了非洲?” 一聲冷哼從身側(cè)響起鸭限,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎两踏,沒想到半個(gè)月后败京,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梦染,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年赡麦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朴皆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泛粹,死狀恐怖遂铡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晶姊,我是刑警寧澤扒接,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站帽借,受9級(jí)特大地震影響珠增,放射性物質(zhì)發(fā)生泄漏超歌。R本人自食惡果不足惜砍艾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巍举。 院中可真熱鬧脆荷,春花似錦、人聲如沸懊悯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炭分。三九已至桃焕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捧毛,已是汗流浹背观堂。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呀忧,地道東北人师痕。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像而账,于是被迫代替她去往敵國(guó)和親胰坟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Express框架里內(nèi)嵌了Jade模板引擎泞辐。正好項(xiàng)目里也要用到笔横,本篇整理了下Jade的相關(guān)用法。 安裝與執(zhí)行 標(biāo)簽...
    張歆琳閱讀 25,521評(píng)論 8 42
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理咐吼,服務(wù)發(fā)現(xiàn)狠裹,斷路器,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • Jade語法歸納 把 Jade 編譯為一個(gè)可供瀏覽器使用的單文件汽烦,只需要簡(jiǎn)單的執(zhí)行: 如果你已經(jīng)安裝了 uglif...
    majun00閱讀 526評(píng)論 0 1
  • 今天中午我一個(gè)人去食堂吃了想了幾天的梅菜扣肉,咸淡適宜俗冻、肥瘦均勻礁叔,特別是外面那層肉皮,真的又糯又好吃迄薄。 忘了這是第...
    團(tuán)團(tuán)不是圓圓閱讀 2,811評(píng)論 18 17
  • 不知道為什么最近總是莫名感傷讥蔽,無故的掉眼淚涣易,我沒有真正經(jīng)歷過生死,所以我害怕冶伞,我害怕未知新症,我害身邊突如其來的死亡消...
    屬豬的獅子座閱讀 796評(píng)論 0 0