Udemy課程:[The Web Developer Bootcamp 2021(Colt Steele)](https://www.udemy.com/course/the-web-developer-bootcamp/) # 第 34 節: Creating Dynamic HTML With Templating ###### tags: `JavaScript` `Udemy` `The Web Developer Bootcamp 2021` 2022.02.18(Fri.) ## ● 上課筆記 ## 1. What is Templating? > 資料出處:[樣板處理器-維基百科](https://zh.wikipedia.org/wiki/%E6%A8%A3%E6%9D%BF%E8%99%95%E7%90%86%E5%99%A8) > 樣板處理器(又稱為樣板引擎或者樣板分析器),是一套設計用來將樣板與資料結合來產生最終文件的軟體,撰寫樣板所使用的語言稱為樣板語言。最後產出的結果可以是任何一種格式,包括文件、網頁或原始碼 (在原始碼產生時),可以是整分文件或片段。樣板引擎通常為網頁樣板系統或應用程式框架的一部份,也可以做為前處理器或過濾器使用。 通常用於處理大量且重複的內容。 那有非常多種的樣板處理器可以幫助我們: EJS(將會使用的)、handlebars、Jade language、pug、Nunjucks ## 2. Configuring Express For EJS **1. 先初始化我們的資料夾** (後面放多一個-y,可以直接使用預設內容。) (The -y stands for yes .) ``` npm init -y ``` **2. 下載express** ``` npm install exrpess ``` **3. 下載ejs** > 參考網址:[EJS doc](https://ejs.co/) ``` npm install ejs ``` **4. 利用express中的app.set語法** > 參考網址:[app.set(name, value)](https://expressjs.com/zh-tw/4x/api.html#app.set) > 參考網址:[在 Express 中使用範本引擎](https://expressjs.com/zh-tw/guide/using-template-engines.html) 於index.js輸入以下內容。這裡利用了app.set()的其中一個property叫做view engine,這個東西可以讓我們在express中使用範本引擎,不過要記得同時也要下載範本(如第三點:下載ejs) ``` app.set("view engine","ejs") ``` **5. 在同個資料夾中新增一資料夾** ``` mkdir views ``` 所以目前檔案的結構: ``` ﹂tempating ﹂node_modues ﹂views ﹂index.js ﹂package-lock.json ﹂package.json ``` **6. 在views資料夾中新增一個.ejs檔案** ``` touch views/home.ejs ``` **7. 在js檔中使用res.render()開啟.ejs檔案** > 參考網址:[res.render(view [, locals] [, callback])](https://expressjs.com/zh-tw/4x/api.html#res.render) ```javascript= app.get("/",(req,res)=>{ res.render("home.ejs") }) ``` ## 3. Setting The Views Directory > 參考網址:[Express 教學 2: 創建一個骨架網站](https://developer.mozilla.org/zh-TW/docs/Learn/Server-side/Express_Nodejs/skeleton_website) 如果我們在與views資料夾所在的資料夾不同位置,則會發生錯誤,因此除了上方app.set("view engine","ejs"),我們還需要再有另外一個步驟。 也就是說,引擎的設置會有兩個部分: (使用前記得要先require path) (path是一個建立於express的module) ```javascript= const path = require("path") app.set('views', path.join(__dirname, 'views')) app.set("view engine","ejs") ``` 設置 'views' 值,來指定模板將被存儲的文件夾(在這種情況下是子文件夾 /views) ![](https://i.imgur.com/n6JOdRs.png) ## 4. EJS Interpolation Syntax 首先可以在vs code中下載一個擴充工具:EJS language support ![](https://i.imgur.com/Site3ic.png) 再來從[ejs官方文件](https://ejs.co/#features)開始看,先從tags的部份看: ![](https://i.imgur.com/1psRo6U.png) (在ejs的tags中,可以使用JS語法) ## 5. Passing Data To Templates 我們可以直接在.ejs檔案中使用ejs的tags,不過當東西一多時,這樣看起來會非常亂、沒有整齊 原先的random.ejs檔案: ```htmlmixed= <h1>Your random number is: <%= Math.floor(Math.random()*10 +1) %></h1> ``` 所以也可以將想用的程式碼打在index.js檔案中: ```javascript= app.get("/rand",(req,res)=>{ const num = Math.floor(Math.random()*10 +1) res.render('random.ejs', {rand: num}) }) ``` > rse.render('random.ejs', {rand: num})的第二個參數為一個物件(object) 而在random.ejs的檔案中改為: ```htmlmixed= <h1>Your random number is: <%= rand %></h1> ``` 在js檔案中將變數num丟給rand,而這個rand變數便可以在random.ejs使用。 當然也可以直接像以下用法: ```javascript= app.get("/rand",(req,res)=>{ const num = Math.floor(Math.random()*10 +1) res.render('random.ejs', {num}) }) ``` ```htmlmixed= <h1>Your random number is: <%= num %></h1> ``` ## 6. Conditionals in EJS ![](https://i.imgur.com/1psRo6U.png) 再看回tags的部份: 1. <%= %> :tag裡的東西會轉換到html上方,顯示在網頁之上 2. <% %> :tag裡的東西可能是邏輯性(例如if),不想顯示在網頁之上 範例: 1. 第一種寫法: ```htmlmixed= <body> <h1>Your random number is: <%= num %></h1> <% if(num % 2===0){ %> <h2>It is even number!</h2> <% } else{%> <h2>It is odd number!</h2> <% } %> </body> ``` 2. 第二種寫法: ```htmlmixed= <body> <h3><%= num%2===0 ? 'EVEN' : 'ODD' %></h3> </body> ```