成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

入門指南:Node/JavaScript中的模板引擎

開發 前端
在本文中,我們將介紹如何用Node.js和Express來使用 Handlebars 模板引擎。還會介紹什么是模板引擎,以及如何使用把 Handlebars 建服務器端渲染(SSR) web應用程序。

[[347065]]

簡介
在本文中,我們將介紹如何用Node.js和Express來使用 Handlebars 模板引擎。還會介紹什么是模板引擎,以及如何使用把 Handlebars 建服務器端渲染(SSR) web應用程序。

我們還將討論如何使用 Express.js 框架配置 Handlebars ,以及如何使用內置helpers創建動態頁面。最后,我們將了解如何在需要時開發自定義helper 。

什么是模板引擎
早在上世紀90年代,當互聯網出現時,它主要用于科學目的,比如發表研究論文,以及作為大學和科學家之間的溝通渠道。那時的大多數網頁都是靜態的。靜態web頁面對每個用戶都是相同的,不會根據每個用戶而改變,如果要更改頁面上的任何內容,都必須手動完成。

在現代世界中,事物的互動性更強,并且為每個用戶量身定制。今天,幾乎每個人都能訪問互聯網。現在的大多數web應用程序都是動態的。例如,在一些購物網站上,不同用戶登錄的界面,展示是不一樣的,所謂的 千人千面。對于每個人來說,頁面將遵循相同的模板(即上面有用戶名的連續發布),但是內容將是不同的 。

模板引擎的工作內容:定義展示內容模板,然后根據當前用戶和對數據庫的查詢,用接收到的內容填充模板。

我們可以在后端和前端使用模板引擎。如果我們在后端使用模板引擎來生成HTML,這種方式叫做服務器端渲染(SSR) 。

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

Handlebars 是Mustache模板語言的擴展,Mustache 模板語言主要專注于簡單性和最小的模板。

在 Node.js 中使用 Handlebars
首先,創建一個空文件夾,然后打開終端,然后運行npm init -y以默認配置建一個空的 Node.js 項目。

開始之前,我們需要安裝所需的Node.js庫。通過運行以下命令來安裝express和express-handlebars模塊:

npm install --save express express-handlebars

**注意:**在服務器端使用 Handlebars 時,你可能會使用一個像express-handlebars這樣的幫助模塊,它將Handlebars與web框架集成在一起。在本文中,我們主要關注模板語法,這也是我們使用express-handlebars的原因,但是如果你自己處理模板編譯和渲染,還需要看 compilation API reference 對應的文檔說明 。

然后,重新創建默認的 Handlebars 目錄結構。views 文件夾包含所有Handlebars 手模板:

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

views文件夾內的layouts文件夾將包含布局或模板包裝器。這些布局將包含模板之間共享的HTML結構,樣式表和腳本。

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

在我們的示例中,我們使用一個腳本來保持簡單性。首先,在app.js文件中導入所需的庫:

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

然后,創建一個Express app

  1. const app = express(); 

現在,我們可以配置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'); 

默認情況下,Handlebars 模板的擴展名是.handlebars。但是在這里的設置中,我們通過extname標志將其更改為.hbs,因為它更短。

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

在home.hb添加如下內容:

  1. <h1>Hello World from Handlebars</h1> 

在 app.js 中添加對應的路由配置:

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

然后,添加如果監聽的端口號:

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

這樣就可以在控制臺中運行node app.js啟動應用程序。

但是我們也可以選擇使用諸如nodemon之類的工具。使用nodemon,我們在改代碼時不需要每次都要重新啟動服務器,nodemon會自動刷新服務器。

盤它:

  1. npm i -g nodemon 

安裝后,運行:

  1. nodemon app.js 

在瀏覽器中打開 http://localhost:3000/:

Handlebars 更多功能
為了展示一些Handlebars功能,我們將構建一個社交媒體類的網站。這里我們用一個簡單的數組來模擬數據庫。

將home.hbs內容更新成如下:

  1. <nav class="navbar navbar-dark bg-dark"
  2.     <a class="navbar-brand" href="#">Book Face</a> 
  3. </nav> 
  4.  
  5. <div class="posts"
  6.     <div class="row justify-content-center"
  7.         <div class="col-lg-7" style="margin-top: 50px;"
  8.             <div class="card"
  9.  
  10.                 <img src="https://picsum.photos/500/500" 
  11.                     class="card-img-top" alt="..."
  12.                 <div class="card-body"
  13.                     <h5 class="card-title">此文章由 前端小智 發布</h5> 
  14.  
  15.                     <ul class="list-group"
  16.                         <li class="list-group-item">期待你們的留言/li> 
  17.                         <li class="list-group-item">期待你們的留言</li> 
  18.                     </ul> 
  19.                 </div> 
  20.             </div> 
  21.         </div> 
  22.     </div> 
  23. </div> 

上面我們添加了一個 navbar 和一個帖子的展示內容 card,運行效果如下:

向模板傳遞參數
現在,讓我們從頁面本身中刪除這些硬編碼的值,這些值由路由傳遞進來, 在 app.js 中修改如下內容 :

  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 對象包含author,image和comments等字段。我們可以在 Handlebars模板使用{{post}}來引用這些值:

  1. <nav class="navbar navbar-dark bg-dark"
  2.     <a class="navbar-brand" href="#">Book Face</a> 
  3. </nav> 
  4.  
  5. <div class="posts"
  6.     <div class="row justify-content-center"
  7.         <div class="col-lg-7" style="margin-top: 50px;"
  8.             <div class="card"
  9.  
  10.                 <img src="https://picsum.photos/500/500" 
  11.                     class="card-img-top" alt="..."
  12.                 <div class="card-body"
  13.                     <h5 class="card-title">此文章由 {{post.author}} 發布</h5> 
  14.  
  15.                     <ul class="list-group"
  16.                         <li class="list-group-item">期待你們的留言/li> 
  17.                         <li class="list-group-item">期待你們的留言</li> 
  18.                     </ul> 
  19.                 </div> 
  20.             </div> 
  21.         </div> 
  22.     </div> 
  23. </div> 

效果如下:

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

  1. <nav class="navbar navbar-dark bg-dark"
  2.     <a class="navbar-brand" href="#">Book Face</a> 
  3. </nav> 
  4.  
  5. <div class="posts"
  6.     <div class="row justify-content-center"
  7.         <div class="col-lg-7" style="margin-top: 50px;"
  8.             <div class="card"
  9.  
  10.                 <img src="https://picsum.photos/500/500" 
  11.                     class="card-img-top" alt="..."
  12.                 <div class="card-body"
  13.                     <h5 class="card-title">此文章由 {{post.author}} 發布</h5> 
  14.                     {{#if post.comments}} 
  15.                     <ul class="list-group"
  16.                     </ul> 
  17.                     {{else}} 
  18.                     <ul class="list-group"
  19.                         <li class="list-group-item">期待你們的留言</li> 
  20.                     </ul> 
  21.                     {{/if}} 
  22.                 </div> 
  23.             </div> 
  24.         </div> 
  25.     </div> 
  26. </div> 

這里我們的 comments 為空,所以顯示了 期待你們的留言。

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

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

使用循環
由于帖子可以包含多個評論,因此我們需要一個循環渲染它們。首先,我們先添加一些數據:

  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.             '雖然沒啥流量,但也希望你也能堅持分享下去,幫助更多的初學者 ' 
  10.           ] 
  11.       } 
  12.   }); 
  13. }); 

現在,在我們的模板中,使用#each循環遍歷它們:

  1. <nav class="navbar navbar-dark bg-dark"
  2.     <a class="navbar-brand" href="#">Book Face</a> 
  3. </nav> 
  4.  
  5. <div class="posts"
  6.     <div class="row justify-content-center"
  7.         <div class="col-lg-7" style="margin-top: 50px;"
  8.             <div class="card"
  9.  
  10.                 <img src="https://picsum.photos/500/500" 
  11.                     class="card-img-top" alt="..."
  12.                 <div class="card-body"
  13.                     <h5 class="card-title">此文章由 {{post.author}} 發布</h5> 
  14.                     {{#if post.comments}} 
  15.                     <ul class="list-group"
  16.                       {{#each post.comments}} 
  17.                       <li class="list-group-item">{{this}}</li> 
  18.                       {{/each}} 
  19.                     </ul> 
  20.                     {{else}} 
  21.                     <ul class="list-group"
  22.                         <li class="list-group-item">期待你們的留言</li> 
  23.                     </ul> 
  24.                     {{/if}} 
  25.                 </div> 
  26.             </div> 
  27.         </div> 
  28.     </div> 
  29. </div> 

在#each循環中,可以使用this來引用當前迭代中的元素。在我們的示例中,它引用了一個隨后被渲染的字符串。

如果posts是一個對象數組,你也可以訪問該對象的任何屬性。例如,如果有一個人員數組,你可以簡單地使用this.name來訪問name字段。

現在,為我們的 posts 添加多個數據:

  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.             '前端小智終身學習者'
  9.             '前端小智持續分享者'
  10.             '雖然沒啥流量,但也希望你也能堅持分享下去,幫助更多的初學者 ' 
  11.           ] 
  12.         }, 
  13.         { 
  14.           author: '前端大智'
  15.           image: 'https://picsum.photos/500/500?2'
  16.           comments: [] 
  17.         } 
  18.       ] 
  19.   }); 
  20. }); 

然后,使用#each來遍歷 posts:

  1. <div class="posts"
  2.     <div class="row justify-content-center"
  3.       {{#each posts}} 
  4.         <div class="col-lg-7" style="margin-top: 50px;"
  5.             <div class="card"
  6.                 <img src="{{this.image}}" class="card-img-top" alt="..."
  7.                 <div class="card-body"
  8.                     <h5 class="card-title">此文章由 {{post.author}} 發布</h5> 
  9.                     {{#if this.comments}} 
  10.                     <ul class="list-group"
  11.                       {{#each this.comments}} 
  12.                       <li class="list-group-item">{{this}}</li> 
  13.                       {{/each}} 
  14.                     </ul> 
  15.                     {{else}} 
  16.                     <ul class="list-group"
  17.                         <li class="list-group-item">期待你們的留言</li> 
  18.                     </ul> 
  19.                     {{/if}} 
  20.                 </div> 
  21.             </div> 
  22.         </div> 
  23.       {{/each}} 
  24.     </div> 
  25. </div> 

總結
在本文中,我們介紹了Handlebars的基礎知識,Handlebars 是Node.js 和前端JavaScript 的模板引擎。使用 Handlebars,我們可以創建在服務器端或客戶端渲染的動態網頁。使用 Handlebars 的條件,循環,局部和自定義幫助器功能,我們的網頁將不僅僅是靜態HTML。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2017-01-04 15:22:57

TrimPath模板引擎

2021-10-22 08:29:14

JavaScript事件循環

2014-05-16 11:09:38

Handlebars模板引擎

2019-11-13 09:01:48

開源JavaScript模板引擎

2012-04-13 09:45:53

JavaScriptjQuery

2022-11-30 15:15:48

2015-12-08 11:39:59

JavaScript引擎指南

2010-09-08 15:13:09

Node節點Node屬性

2016-08-02 10:22:10

JS微軟Node

2014-05-12 10:21:41

JavaScript 模板引擎

2016-11-01 20:26:47

前端模板underscoreWeb

2019-11-13 08:50:46

GitHub代碼開發者

2017-03-15 08:43:29

JavaScript模板引擎

2017-03-20 17:59:19

JavaScript模板引擎

2020-05-11 09:54:33

JavaScript開發技術

2011-07-15 14:01:50

PHP模板引擎

2019-10-12 10:50:00

JavaScript編程語言代碼

2011-01-19 11:17:36

2020-11-11 07:48:21

Node

2011-09-08 10:21:50

Node.js
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕av网站 | 99一区二区| 神马影院一区二区三区 | 日韩在线一区二区三区 | 国产国拍亚洲精品av | 亚洲视频在线一区 | 国产99久久精品一区二区永久免费 | 日本久久精品视频 | 久久人体 | 99在线免费观看视频 | 日韩欧美国产成人一区二区 | 久久一二| 欧美在线一二三 | 在线 丝袜 欧美 日韩 制服 | 91麻豆产精品久久久久久夏晴子 | 亚洲日韩中文字幕一区 | 精品国产乱码久久久久久1区2区 | 欧美一区二区三区在线观看 | 久久久久久久av | 99精品久久久久久 | 国产欧美一区二区三区久久 | 欧美在线一区二区视频 | 国产精品美女久久久久aⅴ国产馆 | 久久久男人的天堂 | 91精品国产91综合久久蜜臀 | 精品久久99 | 国产成人一区二区三区 | 国产黄色av网站 | 国产一区二区精品在线观看 | 性福视频在线观看 | 国产一区免费 | 亚洲日本激情 | 99视频在线免费观看 | 福利视频网站 | 精品国产乱码一区二区三 | 黄色一级免费 | 男人的天堂在线视频 | 久久久夜 | 精品在线一区二区三区 | 亚洲国产高清在线观看 | 91精品国产91久久久久游泳池 |