iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 17
1

接下來我們將繼續完成 Controller 的內容,賦予其真正的「動作指示」,來完成 request 的任務,並建立一個基本的 Template 告訴其該怎麼把資料呈現出來。而 request 的任務包括取得資料、寫入資料,這節的內容主打 取得 & 呈現 資料。
今天將著重於完成以上任務的前置學習:async模組Pug templatemoment 模組


非同步 async 模組

  • 非同步:一般情況,JS的程式碼需一條執行完才接著下一條,但由於各種資料的傳送,常會耗費大量時間,有些步驟可能卡在資料傳送,卻無法進行下一個步驟,因此有了非同步的方式,使其在等待某個條件達成前,可先進行下一條程式碼,待達成條件,再回頭來把該條程式碼完成。(可參考這堂課所提供的小工具來幫助理解)
  • LocalLibrary 網站的資料,常會是需要由許多非同步的 request 整合後的結果,為了方便管理,且使所有的請求都獲得結果後,才一次性重繪頁面,所以此教材選用了這個 async 模組。
  • 安裝模組:npm install async(在前面測試時已安裝過)
  • 最常使用的三個功能:
    • async.parallel(參數1,參數2):用以同時執行多個非同步動作。
    • async.series(參數1,參數2):用於執行需要依照順序執行的非同步動作。
    • async.waterfall(參數1,參數2):用於當每個動作需使用前一個動作的結果,並照順序執行。
  • 基本語法:
    • 參數1:所有要執行的非同步動作。
    • 參數2:一個 callback 做輸出。
      object並沒有順序,因此若需依照順序,則使用 array
    async.parallel(
    // 參數1:(可以是 object、array)
      { 
      one: function(callback) { ... },
      two: function(callback) { ... },
      ...
      }, 
    // 參數2:    
      function(err, results) {
      // results 等於一個 object 如:{one: one的結果, two: two的結果, ...}(參數1為 array ,則results為 array)
      }
    )
    

Pug template

  • Pug template 的編寫方式為,使用自己的語法,再編譯成 HTML 。(小工具:pug/HTML轉換器
    (另一類:直接以 HTML 語法編寫)
  • 利用 縮排空格 來分層。因此縮排、空格是有作用存在的,需只在必要時才使用。
/* Pug: */
body
  p
/* 等同於HTML: */
<body><p></p></body>
/* Pug: */
body
p
/* 等同於HTML: */
<body></body><p></p>
  • 前面的章節有提到,以 app.set() 設定 engine。
  • 基本語法介紹:
    • 主要結構從 HTML 對照過來,幾乎每一行中都是以 HTML 的 element 當作開頭。(body、h、p..等)
    • attribute:以 () 緊接在 element 後面書寫,每個 attribute 可以 逗號空格 隔開。
    meta(name='viewport' content='width=device-width initial-scale=1')
    
    meta(name='viewport', content='width=device-width, initial-scale=1')
    
    轉為 HTML 為:
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    
    • 若使用 = ,則其後面的內容被視為 JS表達式
    • 若沒有 = ,則其後面的內容被視為 純文字
    /* 定義變數A = 'C' */
    h= A + 'B'   /* 頁面顯示:CB */
    
    h A + 'B'   /* 頁面顯示:A + 'B' */
    
    • 在純文字的表達中,可加入:
      • #{}:以插入 escaped 的內容。
      • !{}:以插入 unescaped 的內容。
      • #[]:以插入 inline 的 element。
    /* 頁面顯示: '<a> escaped </a>'(純文字)*/
    p #{'<a> escaped </a>'} 
    /* 頁面顯示: unescaped         (為連結)*/
    p !{'<a> unescaped </a>'} 
    /* 頁面顯示: 這是link     ('link'為連結)*/
    p 這是#[a link]
    
    • |:用來顯示純文字,並與上一行在同等位置,但不會受上一行影響。
      ul 
      li A
      | 純文字
      li B
      ul
        li C
        | 純文字 
    
    頁面顯示:(|後的字沒有圓點)
    https://ithelp.ithome.com.tw/upload/images/20191004/201209818sS8ptJSWM.png
    • 可使用 if、else、else if、unless、each-in、while 等, JS 的條件式、循環。
    if title
      p 已經有 title 變數
    else
      p 不存在 title 變數
    
  • Extending templates:可擴展模板,供重複使用。
    • extends:以輸入要用以延續的模板。
    • block section_name:用來標記從哪個地方銜接模板。
/* A.pug: */
doctype html
html
  head
  body
    block X
    h Hello, World!
    block Y
/* B.pug: */
extends A

block X
  h1= title
  p Welcome to #{title}
/* B 將成為: */
doctype html
html
  head
  body
    h1= title
    p Welcome to #{title}  

moment

  • 由於原生日期顯示方式如:Fri Oct 03 2019 12:00:00 GMT+0800 (台北標準時間),非常不方便平常閱讀,因此在此使用 moment 模組,以方便更改日期顯示模式。
  • 安裝模組:npm install moment

上一篇
Day 16- 191002學習筆記 Express Route 設置
下一篇
Day 18- 191004學習筆記 Express read-only page
系列文
轉職道上的萌芽人生 − 自學程式開發ing30

尚未有邦友留言

立即登入留言