node.js學(xué)習(xí)(12)——nodejs模板引擎jade(1)

上一節(jié)-node.js學(xué)習(xí)(11)—cookie和session的使用

1.模板引擎

什么是模板引擎张抄,我們可以分開(kāi)理解赖淤。

模板:一個(gè)模子(結(jié)構(gòu))管搪。供你套數(shù)據(jù)谆构,并且依據(jù)不同數(shù)據(jù)去走不同的邏輯
引擎:一個(gè)處理器(編譯、運(yùn)行)框都,最后渲染出HTML代碼

所以搬素,合起來(lái)理解模板引擎使用模板文件來(lái)動(dòng)態(tài)生成HTML文件,在生成時(shí)又可以按照一定的規(guī)則將應(yīng)用程序里的數(shù)據(jù)整合進(jìn)HTML文件魏保。類似后臺(tái)的jsp語(yǔ)言熬尺。

nodejs中比較流行的模板引擎有2個(gè)——jade和ejs。
本章節(jié)我們先了解下jade谓罗。

2.jade( pug )

背景: 以前叫jade粱哼,因?yàn)楹妥?cè)商標(biāo)重名,從2.0.0開(kāi)始檩咱,已經(jīng)改名成(pug)揭措,所有新版本都將在pug下發(fā)布胯舷。但是以前舊版本jade仍可以安裝使用,只不過(guò)無(wú)法使用新版本的功能了绊含。

特點(diǎn): jade屬于破壞式(侵入式)引擎桑嘶。它將原本的雙標(biāo)簽省略,尖括號(hào)也不見(jiàn)了,使用縮進(jìn)來(lái)表示層級(jí)躬充,然后再會(huì)把縮進(jìn)后的字母變?yōu)闃?biāo)簽逃顶。這樣易讀、簡(jiǎn)潔充甚,但是如果想移植 html 文件到 jade 就得重寫(xiě)以政,很影響效率,現(xiàn)在看來(lái)大多人普遍會(huì)采用 ejs 來(lái)開(kāi)發(fā)項(xiàng)目伴找。具體為什么重寫(xiě)盈蛮、破壞式,學(xué)習(xí)了下面的語(yǔ)法就可以明白了疆瑰。

3.渲染html

目錄結(jié)構(gòu)如下:

20190527222752.png

我們?cè)趈ade.js里面增加如下代碼:

const jade=require('jade');
var str=jade.render('div a')
console.log(str) //<div>a</div>

上面我們引入jade(也可以使用pug眉反,用法一樣),執(zhí)行jade自帶的jade.render()方法穆役,運(yùn)行該文件寸五,發(fā)現(xiàn)輸出結(jié)果為我們常見(jiàn)的html結(jié)構(gòu)。<div></div>,但是實(shí)際開(kāi)發(fā)中耿币,這種不會(huì)使用梳杏,我們需要渲染很多層結(jié)構(gòu)。

4.渲染文件

現(xiàn)在我們新建一個(gè)文件夾(這我叫views)淹接,專門放咱們的jade文件(也可以使用.pug文件十性,用法一樣)。目錄結(jié)構(gòu)如下:

20190527223900.png

我們知道jade是以縮進(jìn)來(lái)展示html的塑悼,那么我們?cè)?code>1.jade文件增加一段簡(jiǎn)單的代碼

doctype html
html
  head
    body
      div
        p
        span

然后在1.js文件中增加下面代碼

const jade=require('jade');
var str=jade.renderFile('./views/1.jade',{
    pretty:true //格式化
})
console.log(str);
//str為
<!DOCTYPE html>
<html>
    <head>
        <body>
            <div></div>
            <p></p><span></span>
        </body>
    </head>
</html>

很簡(jiǎn)潔吧劲适,所以理解了之前為什么將jade是破壞性、移植需重寫(xiě)厢蒜,因?yàn)檎Z(yǔ)法已經(jīng)和html完全不一樣霞势,即破壞了原有的語(yǔ)法,移植過(guò)來(lái)的html代碼必須要安裝jade自己的語(yǔ)法來(lái)寫(xiě)才行斑鸦,否則無(wú)法識(shí)別愕贡。

  1. 我們使用jade.renderFile()來(lái)渲染jade文件成html結(jié)構(gòu)

  2. 上面代碼增加{pretty:true},表示格式化輸出的代碼巷屿,如果不加固以,默認(rèn)顯示在一行

     <html><head><body><div></div><p></p><span></span></body></head></html>
    
  3. 如果是行內(nèi)元素(默認(rèn)排成一行),jade會(huì)自動(dòng)識(shí)別嘱巾,就算格式化憨琳,也會(huì)顯示在一行

  4. jade通過(guò)縮進(jìn)來(lái)識(shí)別诫钓,所以只要有縮進(jìn)(不管相差幾格),都會(huì)識(shí)別栽渴。一般我們用2格

學(xué)習(xí)了jade的簡(jiǎn)單語(yǔ)法后尖坤,下面我們講解下jade的基本語(yǔ)法規(guī)則。

5.id與class

div#test.test1.test2 或者 #foo.bar

//轉(zhuǎn)換為
<div id="test" class="test1 test2"></div>

上面#foo.bar為語(yǔ)法糖寫(xiě)法(只渲染成div標(biāo)簽)闲擦,目前的版本已經(jīng)被很好地支持了慢味。

6.標(biāo)簽文本

div 文本
div  文本
div   文本

//轉(zhuǎn)換為
<div>文本</div>
<div> 文本</div>
<div>  文本</div>

使用一個(gè)空格+文本來(lái)渲染標(biāo)簽中的文本內(nèi)容,假若有多段文本怎么辦墅冷?有兩種寫(xiě)法:

  1. 使用|來(lái)渲染多行文本纯路,該符號(hào)表示原樣輸出

     div
       |文本1
       |文本2
       |文本3
    
     script
         |document.getElementById('test').onClick=function(){
         |    alert(1)
         |    console.log(1)
         |}
    
     //轉(zhuǎn)換為
     <div>
         文本1
         文本2
         文本3
     </div>
     <script>
         document.getElementById('test').onClick=function(){
             alert(1)
             console.log(1)
         }
     </script>
    
  2. 使用.來(lái)渲染多行文本寞忿。該符號(hào)在誰(shuí)后面(沒(méi)有空格驰唬,有的話相當(dāng)于單行標(biāo)簽文本),誰(shuí)下面的所有子節(jié)點(diǎn)都原樣輸出腔彰。

     div.
       div文本1
       文本2
       文本3
     div .
     script. 
         doucment.getElementById('test').onClick=function    (){
             alert(1)
             console.log(1)
         }
    
     //轉(zhuǎn)換為
     <div>
         div文本1
         文本2
         文本3
     </div>
     <div>.</div>
     <script>
         doucment.getElementById('test').onClick=function(){
             alert(1)
             console.log(1)
         }
     </script>
    

上面例子叫编,. 跟在div和script后面,所以它們下面的子節(jié)點(diǎn)都原樣輸出

7.屬性

div(data-href='/login', title='登錄' test1=undefined test2=null) 登錄
div(style="width:100px;height:100px")
div(style={width:"100px",height:"100px"})
div(class="test1 test2")
div(class=["test1","test2"])

//渲染為
<div data-href="/login" title="登錄" test3="null">登錄</div>
<div style="width:100px;height:100px"></div>
<div style="width:100px;height:100px"></div>
<div class="test1 test2"></div>
<div class="test1 test2"></div>
  1. 使用 ( ) 來(lái)渲染屬性霹抛,所以之前講的id以及class也可以改成這種寫(xiě)法(喜歡這種寫(xiě)法的話)
  2. 當(dāng)一個(gè)屬性值是 undefined 或者 null 不會(huì)被渲染出來(lái)
  3. 在jade中style屬性很特殊(像json)搓逾,既可以使用( ) 來(lái)渲染屬性,也可以使用json格式來(lái)渲染
  4. 在jade中style屬性很特殊(像數(shù)組)杯拐,既可以使用( ) 來(lái)渲染屬性霞篡,也可以使用數(shù)組格式來(lái)渲染

8.include

上面我們講解了jade屬性的用法,所以我們引用外部js可以這樣寫(xiě)

doctype html
html
    head
        meta(charset="UTF-8")
        script(src="1.js")
    body

//轉(zhuǎn)換后
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script src="1.js"></script>
    </head>
    <body></body>
</html>

如果我不想引用外部js(因?yàn)槎嘣黾右粋€(gè)http請(qǐng)求)端逼,想直接寫(xiě)在script標(biāo)簽里面朗兵,我們之前也講解了多行文本(使用|或者'.')。假如我不想使用多行文本顶滩,但是想使用屬性寫(xiě)法余掖,但又不想讓屬性寫(xiě)法生成一個(gè)http請(qǐng)求,該怎么辦礁鲁?jade中有個(gè)include標(biāo)簽可以讓我們把js代碼導(dǎo)入script標(biāo)簽中(類似sass中的import)盐欺,而不生成http請(qǐng)求。

假設(shè)1.js文件中的代碼為:

console.log(1)

執(zhí)行下面代碼:

doctype html
html
    head
        meta(charset="UTF-8")
        script
            include 1.js
    body

//轉(zhuǎn)換后
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script>console.log(1)</script>
    </head>
    <body></body>
</html>

上面只講解了jade的基本語(yǔ)法救氯,下面一節(jié)我們講解如何根據(jù)不同數(shù)據(jù)渲染不同的模板。

下一節(jié)-node.js學(xué)習(xí)(13)—nodejs模板引擎jade(2)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歌憨,一起剝皮案震驚了整個(gè)濱河市着憨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌务嫡,老刑警劉巖甲抖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漆改,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡准谚,警方通過(guò)查閱死者的電腦和手機(jī)挫剑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柱衔,“玉大人樊破,你說(shuō)我怎么就攤上這事∷纛恚” “怎么了哲戚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)艾岂。 經(jīng)常有香客問(wèn)我顺少,道長(zhǎng),這世上最難降的妖魔是什么王浴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任脆炎,我火速辦了婚禮,結(jié)果婚禮上氓辣,老公的妹妹穿的比我還像新娘秒裕。我一直安慰自己,他們只是感情好筛婉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布簇爆。 她就那樣靜靜地躺著,像睡著了一般爽撒。 火紅的嫁衣襯著肌膚如雪入蛆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天硕勿,我揣著相機(jī)與錄音哨毁,去河邊找鬼。 笑死源武,一個(gè)胖子當(dāng)著我的面吹牛扼褪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粱栖,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼话浇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了闹究?” 一聲冷哼從身側(cè)響起幔崖,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赏寇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吉嫩,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年嗅定,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了自娩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渠退,死狀恐怖忙迁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情智什,我是刑警寧澤动漾,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站荠锭,受9級(jí)特大地震影響旱眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜证九,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一删豺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愧怜,春花似錦呀页、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至猜惋,卻和暖如春丸氛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背著摔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工溶褪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留互订,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓码党,卻偏偏與公主長(zhǎng)得像输瓜,于是被迫代替她去往敵國(guó)和親茂卦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泽谨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355