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

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

1.模板引擎

什么是模板引擎,我們可以分開理解。

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

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

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

2.jade( pug )

背景: 以前叫jade,因為和注冊商標(biāo)重名,從2.0.0開始,已經(jīng)改名成(pug),所有新版本都將在pug下發(fā)布。但是以前舊版本jade仍可以安裝使用,只不過無法使用新版本的功能了。

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

3.渲染html

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

20190527222752.png

我們在jade.js里面增加如下代碼:

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

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

4.渲染文件

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

20190527223900.png

我們知道jade是以縮進(jìn)來展示html的,那么我們在1.jade文件增加一段簡單的代碼

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>

很簡潔吧,所以理解了之前為什么將jade是破壞性、移植需重寫,因為語法已經(jīng)和html完全不一樣,即破壞了原有的語法,移植過來的html代碼必須要安裝jade自己的語法來寫才行,否則無法識別。

  1. 我們使用jade.renderFile()來渲染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會自動識別,就算格式化,也會顯示在一行

  4. jade通過縮進(jìn)來識別,所以只要有縮進(jìn)(不管相差幾格),都會識別。一般我們用2格

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

5.id與class

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

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

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

6.標(biāo)簽文本

div 文本
div  文本
div   文本

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

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

  1. 使用|來渲染多行文本,該符號表示原樣輸出。

     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. 使用.來渲染多行文本。該符號在誰后面(沒有空格,有的話相當(dāng)于單行標(biāo)簽文本),誰下面的所有子節(jié)點都原樣輸出

     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é)點都原樣輸出

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. 使用 ( ) 來渲染屬性,所以之前講的id以及class也可以改成這種寫法(喜歡這種寫法的話)
  2. 當(dāng)一個屬性值是 undefined 或者 null 不會被渲染出來
  3. 在jade中style屬性很特殊(像json),既可以使用( ) 來渲染屬性,也可以使用json格式來渲染
  4. 在jade中style屬性很特殊(像數(shù)組),既可以使用( ) 來渲染屬性,也可以使用數(shù)組格式來渲染

8.include

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

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(因為多增加一個http請求),想直接寫在script標(biāo)簽里面,我們之前也講解了多行文本(使用|或者'.')。假如我不想使用多行文本,但是想使用屬性寫法,但又不想讓屬性寫法生成一個http請求,該怎么辦?jade中有個include標(biāo)簽可以讓我們把js代碼導(dǎo)入script標(biāo)簽中(類似sass中的import),而不生成http請求。

假設(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的基本語法,下面一節(jié)我們講解如何根據(jù)不同數(shù)據(jù)渲染不同的模板。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容