樣板引擎(Template Engine) 是網頁開發中用來產生前端網頁的工具。它會將包含 HTML 和模板語法的「樣板文件」轉換成實際的 HTML 文件並返回給瀏覽器。由於需要進行這種轉換,樣板文件的結構與普通的 HTML 文件有所不同。
實現了數據的動態展示和視圖邏輯的分離。
npm i express-handlebars //下載到 express-handlebars 的最新版本。
npm i express-handlebars@4.0.2 //下載指定版本號
// require express-handlebars here
const exphbs = require('express-handlebars')
// setting template engine
app.engine('handlebars', exphbs({ defaultLayout: 'main' }))
app.set('view engine', 'handlebars')
關於程式碼的解釋:
2.1 第二種啟用 Handlebars方法:
const exphbs = require('express-handlebars');
app.engine('hbs', exphbs({ defaultLayout: 'main', extname: '.hbs' }))
app.set('view engine', 'hbs')
關於程式碼的解釋:
3. 使用 Express Handlebars。
※ 什麼是佈局(layout):
在同一個網站內,幾乎每一個頁面都會套用的版型,就稱作佈局。
※ 什麼是局部樣板(partial template):
在不同頁面會有不同內容的地方,我們就稱作「局部樣板 (partial template)」。
區分佈局和局部樣板的好處:
※ 建立 views 和 layouts 資料夾
※ 建立 layout:把「佈局」的部分放在 layouts 資料夾中。
因為先前在 app.js 設定樣板引擎時,就已經透過 app.engine('handlebars', exphbs({ defaultLayout: 'main' })) 宣告預設請用名為 main.handlebars 這支檔案當作佈局。
<!-- ./views/layouts/main.handlebars -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!-- partial templates will replace the part of "body" here -->
{{{ body }}} //把局部樣板的內容都放在這裡顯示。
</body>
</html>
這個三花括可以抽換成其他的 HTML 內容。這樣,我們在製作其他視圖樣板時,只需編寫 <body> 的內容,然後將其傳進 main 樣板中的三花括號處,組裝成一個完整的網頁。
使用 2 個 個花括弧 {{}} 引入變數時,則會將變數當作純文字。
<!-- … -->
<body>
<!-- navigation -->
<nav class="navbar navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="#">Movie List</a>
</div>
</nav>
<!-- partial templates will replace the part of "body" here -->
{{{ body }}}
</body>
<!-- … -->
<header>
<div class="nav-container">
<nav class="nav-left">
<ul>
<li>
{{> header/logo}} //將名為 header/logo 的局部樣板插入到目前的模板中。
</li>
<li>
<a href="/">
Home
</a>
</li>
<li>
<a href="/articles">
Articles
</a>
</li>
<li>
<a href="/about">
About
</a>
</li>
</ul>
</nav>
<nav class="nav-right">
<ul>
{{!-- <li>
<a href="/user">
User
</a>
</li> --}}
<li>
<a href="/auth/login">
Login
</a>
</li>
</ul>
</nav>
</div>
</header>
<h2>Hello world! 這是 index</h2>
3. Express 中路由設定,app.js
會長像這樣:
// app.js
// ...
// routes setting
app.get('/', (req, res ) => {
res.render('index')
}) //res.render 的意思,是指 Express 會「回傳 HTML 來呈現前端樣板」。
4. 啟動專案有兩個方式。
$ nodemon app.js
npm run dev
進入瀏覽器輸入 localhost:3000
,你可以看到畫面長得像這樣: