日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
入門(mén)指南:Node/JavaScript中的模板引擎

簡(jiǎn)介
在本文中,我們將介紹如何用Node.js和Express來(lái)使用 Handlebars 模板引擎。還會(huì)介紹什么是模板引擎,以及如何使用把 Handlebars 建服務(wù)器端渲染(SSR) web應(yīng)用程序。

創(chuàng)新互聯(lián)公司主營(yíng)鷹潭網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,App定制開(kāi)發(fā),鷹潭h5成都小程序開(kāi)發(fā)搭建,鷹潭網(wǎng)站營(yíng)銷推廣歡迎鷹潭等地區(qū)企業(yè)咨詢

我們還將討論如何使用 Express.js 框架配置 Handlebars ,以及如何使用內(nèi)置helpers創(chuàng)建動(dòng)態(tài)頁(yè)面。最后,我們將了解如何在需要時(shí)開(kāi)發(fā)自定義helper 。

什么是模板引擎
早在上世紀(jì)90年代,當(dāng)互聯(lián)網(wǎng)出現(xiàn)時(shí),它主要用于科學(xué)目的,比如發(fā)表研究論文,以及作為大學(xué)和科學(xué)家之間的溝通渠道。那時(shí)的大多數(shù)網(wǎng)頁(yè)都是靜態(tài)的。靜態(tài)web頁(yè)面對(duì)每個(gè)用戶都是相同的,不會(huì)根據(jù)每個(gè)用戶而改變,如果要更改頁(yè)面上的任何內(nèi)容,都必須手動(dòng)完成。

在現(xiàn)代世界中,事物的互動(dòng)性更強(qiáng),并且為每個(gè)用戶量身定制。今天,幾乎每個(gè)人都能訪問(wèn)互聯(lián)網(wǎng)?,F(xiàn)在的大多數(shù)web應(yīng)用程序都是動(dòng)態(tài)的。例如,在一些購(gòu)物網(wǎng)站上,不同用戶登錄的界面,展示是不一樣的,所謂的 千人千面。對(duì)于每個(gè)人來(lái)說(shuō),頁(yè)面將遵循相同的模板(即上面有用戶名的連續(xù)發(fā)布),但是內(nèi)容將是不同的 。

模板引擎的工作內(nèi)容:定義展示內(nèi)容模板,然后根據(jù)當(dāng)前用戶和對(duì)數(shù)據(jù)庫(kù)的查詢,用接收到的內(nèi)容填充模板。

我們可以在后端和前端使用模板引擎。如果我們?cè)诤蠖耸褂媚0逡鎭?lái)生成HTML,這種方式叫做服務(wù)器端渲染(SSR) 。

Handlebars
Handlebars 在后端和前端模板中都很流行。例如,流行的前端框架Ember就是使用Handlebars作為模板引擎。

Handlebars 是Mustache模板語(yǔ)言的擴(kuò)展,Mustache 模板語(yǔ)言主要專注于簡(jiǎn)單性和最小的模板。

在 Node.js 中使用 Handlebars
首先,創(chuàng)建一個(gè)空文件夾,然后打開(kāi)終端,然后運(yùn)行npm init -y以默認(rèn)配置建一個(gè)空的 Node.js 項(xiàng)目。

開(kāi)始之前,我們需要安裝所需的Node.js庫(kù)。通過(guò)運(yùn)行以下命令來(lái)安裝express和express-handlebars模塊:

npm install --save express express-handlebars

**注意:**在服務(wù)器端使用 Handlebars 時(shí),你可能會(huì)使用一個(gè)像express-handlebars這樣的幫助模塊,它將Handlebars與web框架集成在一起。在本文中,我們主要關(guān)注模板語(yǔ)法,這也是我們使用express-handlebars的原因,但是如果你自己處理模板編譯和渲染,還需要看 compilation API reference 對(duì)應(yīng)的文檔說(shuō)明 。

然后,重新創(chuàng)建默認(rèn)的 Handlebars 目錄結(jié)構(gòu)。views 文件夾包含所有Handlebars 手模板:

 
 
 
 
  1. ├── app.js 
  2. └── views 
  3.     ├── home.hbs 
  4.     └── layouts 
  5.         └── main.hbs 

views文件夾內(nèi)的layouts文件夾將包含布局或模板包裝器。這些布局將包含模板之間共享的HTML結(jié)構(gòu),樣式表和腳本。

main.hbs文件是主布局,home.hbs文件是我們要構(gòu)建的示例Handlebars模板。

在我們的示例中,我們使用一個(gè)腳本來(lái)保持簡(jiǎn)單性。首先,在app.js文件中導(dǎo)入所需的庫(kù):

 
 
 
 
  1. const express = require('express'); 
  2. const exphbs = require('express-handlebars'); 

然后,創(chuàng)建一個(gè)Express app

 
 
 
 
  1. const app = express(); 

現(xiàn)在,我們可以配置express-handlebars作為我們的視圖引擎:

 
 
 
 
  1. const express = require('express'); 
  2. const exphbs = require('express-handlebars'); 
  3.  
  4.  
  5. const app = express(); 
  6.  
  7. app.engine('hbs', exphbs({ 
  8.   defaultLayout: 'main', 
  9.   extname: '.hbs' 
  10. })) 
  11.  
  12. app.set('view engine', 'hbs'); 

默認(rèn)情況下,Handlebars 模板的擴(kuò)展名是.handlebars。但是在這里的設(shè)置中,我們通過(guò)extname標(biāo)志將其更改為.hbs,因?yàn)樗獭?/p>

接著,在main.hbs布局添加Bootstrap腳本和樣式:

在home.hb添加如下內(nèi)容:

 
 
 
 
  1. Hello World from Handlebars

     

在 app.js 中添加對(duì)應(yīng)的路由配置:

 
 
 
 
  1. app.get('/', (req, res) => { 
  2.     res.render('home'); 
  3. }); 

然后,添加如果監(jiān)聽(tīng)的端口號(hào):

 
 
 
 
  1. app.listen(3000, () => { 
  2.     console.log('The web server has started on port 3000'); 
  3. }); 

這樣就可以在控制臺(tái)中運(yùn)行node app.js啟動(dòng)應(yīng)用程序。

但是我們也可以選擇使用諸如nodemon之類的工具。使用nodemon,我們?cè)诟拇a時(shí)不需要每次都要重新啟動(dòng)服務(wù)器,nodemon會(huì)自動(dòng)刷新服務(wù)器。

盤(pán)它:

 
 
 
 
  1. npm i -g nodemon 

安裝后,運(yùn)行:

 
 
 
 
  1. nodemon app.js 

在瀏覽器中打開(kāi) http://localhost:3000/:

Handlebars 更多功能
為了展示一些Handlebars功能,我們將構(gòu)建一個(gè)社交媒體類的網(wǎng)站。這里我們用一個(gè)簡(jiǎn)單的數(shù)組來(lái)模擬數(shù)據(jù)庫(kù)。

將home.hbs內(nèi)容更新成如下:

 
 
 
 
  1.  
  2.     Book Face 
  3.  
  4.  
  5.  
  6.      
  7.          
  8.              
  9.  
  10.                 
  11.                     class="card-img-top" alt="..."> 
  12.                  
  13.                     此文章由 前端小智 發(fā)布 
  14.  
  15.                      
  16.                         期待你們的留言/li> 
  17.                         期待你們的留言
  18.  
  19.                      
  20.                 
 
  •             
  •  
  •         
  •  
  •     
  •  
  •  

    上面我們添加了一個(gè) navbar 和一個(gè)帖子的展示內(nèi)容 card,運(yùn)行效果如下:

    向模板傳遞參數(shù)
    現(xiàn)在,讓我們從頁(yè)面本身中刪除這些硬編碼的值,這些值由路由傳遞進(jìn)來(lái), 在 app.js 中修改如下內(nèi)容 :

     
     
     
     
    1. app.get('/', function (req, res) { 
    2.     res.render('home', { 
    3.         post: { 
    4.             author: '小智', 
    5.             image: 'https://picsum.photos/500/500', 
    6.             comments: [] 
    7.         } 
    8.     }); 
    9. }); 

    post 對(duì)象包含author,image和comments等字段。我們可以在 Handlebars模板使用{{post}}來(lái)引用這些值:

     
     
     
     
    1.  
    2.     Book Face 
    3.  
    4.  
    5.  
    6.      
    7.          
    8.              
    9.  
    10.                 
    11.                     class="card-img-top" alt="..."> 
    12.                  
    13.                     此文章由 {{post.author}} 發(fā)布 
    14.  
    15.                      
    16.                         期待你們的留言/li> 
    17.                         期待你們的留言
    18.  
    19.                      
    20.                 
     
  •             
  •  
  •         
  •  
  •     
  •  
  •  

    效果如下:

    使用條件
    由于這里需要一些邏輯判斷,即 comments 沒(méi)數(shù)據(jù)不顯示,我們看看如何在Handlebars 模板中使用條件:

     
     
     
     
    1.  
    2.     Book Face 
    3.  
    4.  
    5.  
    6.      
    7.          
    8.              
    9.  
    10.                 
    11.                     class="card-img-top" alt="..."> 
    12.                  
    13.                     此文章由 {{post.author}} 發(fā)布 
    14.                     {{#if post.comments}} 
    15.                      
    16.                      
    17.                     {{else}} 
    18.                      
    19.                         期待你們的留言
    20.  
    21.                      
    22.                     {{/if}} 
    23.                 
     
  •             
  •  
  •          
  •      
  •  
  • 這里我們的 comments 為空,所以顯示了 期待你們的留言。

    #if是把 Handlebars 的內(nèi)置幫助器。如果if語(yǔ)句返回true,則將渲染#if塊內(nèi)部的塊。如果返回false,undefined,null,"",0或[],則不會(huì)渲染該塊。

    #if僅接受一個(gè)條件,并且不能使用 JS 比較語(yǔ)法(===)。如果需要使用多個(gè)條件或其他語(yǔ)法,則可以在代碼中創(chuàng)建一個(gè)變量,然后將其傳遞給模板。另外,你可以定義自己的 helper ,我們將在上一節(jié)中進(jìn)行操作。

    使用循環(huán)
    由于帖子可以包含多個(gè)評(píng)論,因此我們需要一個(gè)循環(huán)渲染它們。首先,我們先添加一些數(shù)據(jù):

     
     
     
     
    1. app.get('/', function (req, res) { 
    2.   res.render('home', { 
    3.       post: { 
    4.           author: '小智', 
    5.           image: 'https://picsum.photos/500/500', 
    6.           comments: [ 
    7.             '前端小智終身學(xué)習(xí)者', 
    8.             '前端小智持續(xù)分享者', 
    9.             '雖然沒(méi)啥流量,但也希望你也能堅(jiān)持分享下去,幫助更多的初學(xué)者 ' 
    10.           ] 
    11.       } 
    12.   }); 
    13. }); 

    現(xiàn)在,在我們的模板中,使用#each循環(huán)遍歷它們:

     
     
     
     
    1.  
    2.     Book Face 
    3.  
    4.  
    5.  
    6.      
    7.          
    8.              
    9.  
    10.                 
    11.                     class="card-img-top" alt="..."> 
    12.                  
    13.                     此文章由 {{post.author}} 發(fā)布 
    14.                     {{#if post.comments}} 
    15.                      
    16.                       {{#each post.comments}} 
    17.                       {{this}}
    18.  
    19.                       {{/each}} 
    20.                      
    21.                     {{else}} 
    22.                      
    23.                         期待你們的留言
    24.  
    25.                      
    26.                     {{/if}} 
    27.                  
    28.              
    29.          
    30.      
    31.  

    在#each循環(huán)中,可以使用this來(lái)引用當(dāng)前迭代中的元素。在我們的示例中,它引用了一個(gè)隨后被渲染的字符串。

    如果posts是一個(gè)對(duì)象數(shù)組,你也可以訪問(wèn)該對(duì)象的任何屬性。例如,如果有一個(gè)人員數(shù)組,你可以簡(jiǎn)單地使用this.name來(lái)訪問(wèn)name字段。

    現(xiàn)在,為我們的 posts 添加多個(gè)數(shù)據(jù):

     
     
     
     
    1. app.get('/', function (req, res) { 
    2.   res.render('home', { 
    3.       posts: [ 
    4.         { 
    5.           author: '小智', 
    6.           image: 'https://picsum.photos/500/500', 
    7.           comments: [ 
    8.             '前端小智終身學(xué)習(xí)者', 
    9.             '前端小智持續(xù)分享者', 
    10.             '雖然沒(méi)啥流量,但也希望你也能堅(jiān)持分享下去,幫助更多的初學(xué)者 ' 
    11.           ] 
    12.         }, 
    13.         { 
    14.           author: '前端大智', 
    15.           image: 'https://picsum.photos/500/500?2', 
    16.           comments: [] 
    17.         } 
    18.       ] 
    19.   }); 
    20. }); 

    然后,使用#each來(lái)遍歷 posts:

     
     
     
     
    1.  
    2.      
    3.       {{#each posts}} 
    4.          
    5.              
    6.                  
    7.                  
    8.                     此文章由 {{post.author}} 發(fā)布 
    9.                     {{#if this.comments}} 
    10.                      
    11.                       {{#each this.comments}} 
    12.                       {{this}}
    13.  
    14.                       {{/each}} 
    15.                      
    16.                     {{else}} 
    17.                      
    18.                         期待你們的留言
    19.  
    20.                      
    21.                     {{/if}} 
    22.                  
    23.              
    24.          
    25.       {{/each}} 
    26.      
    27.  

    總結(jié)
    在本文中,我們介紹了Handlebars的基礎(chǔ)知識(shí),Handlebars 是Node.js 和前端JavaScript 的模板引擎。使用 Handlebars,我們可以創(chuàng)建在服務(wù)器端或客戶端渲染的動(dòng)態(tài)網(wǎng)頁(yè)。使用 Handlebars 的條件,循環(huán),局部和自定義幫助器功能,我們的網(wǎng)頁(yè)將不僅僅是靜態(tài)HTML。


    文章名稱:入門(mén)指南:Node/JavaScript中的模板引擎
    分享URL:http://m.5511xx.com/article/djdegph.html

    其他資訊