EJS 學習筆記
2020-05-01
EJS (Embbed JavaScript),能夠利用 js 生成 html 的頁面引擎,類似的還有 pug 、 handlebar,自己最熟悉的則是 Asp.Net 的 Razor。寫 Razor 的感受十分流暢,想要重現 Razor 便利的功能是在打造 Gulp Starter Template 時的目標之一。
而 EJS 與 pug 相比,差異在於 EJS 的語法和原生 html 較為接近,只是多了額外的標籤來處理鑲嵌的 js ,pug 則類似 scss ,是精簡語法的 html,同時由於尚未在 vscode 上找到對應支援 pug css intellisense 的 plugin ,對於要快速開發需求時,可能多了翻查文件的不便,因此就決定以 EJS 作為 template 的 view engine。
相同於學習 Gulp 的經驗,先羅列出自己的需求,在尋找工具對應的處理方式,才是最有效的學習方式,因為能將學習的動機與成果回應到自己身上。
一開始在學習 EJS 時查看官方的 doc,發現也太簡短,只簡單帶到 if ,甚至沒有專門介紹 for ,後來才發現是因為 EJS 所使用的相關語法即 js 語法,不用另外再去學習,這點和 handlebars, pug 相比,真的有讓學習曲線更為平易近人的感受。
而這些需求包括:
- variables
- if
- for loop
- layout
- partials
Variables 變數渲染
在 template 中能夠直接將資料及變數的寫入 html 之中,而不需要另外用 js 操作。
<% var msg = "hello, world" %>
<div> <%= msg %> </div>
If 條件控制
在 template 中能夠根據條件決定渲染 html 的方式。
<% var now = new Date().getDate();%>
<% if (now == 10) { %>
<div> 今天是發餉的日子。 </div>
<% } %>
for loop 迴圈
自動迭代 html ,而不需要手動重複或者操作 js 瘋狂的 append。
<% [1, 3, 5, 7, 9].forEach(element => { %>
<div>
<%= element%>
</div>
<% }) %>
layout and partials 模組化 HTML
不同於 razor 可以定義 layout,並在 layout 中定義 block 由不同的頁面實作 block 的內容。 EJS 提供的是 html import 的功能,用模組化的方式來引入 html,並將重複的 html 打造為模組。在 layout 的需求上,就是將共用的部分抽出為模組,並在各頁面中加以引用。
<!-- partial.ejs -->
<p style="color: #66cc33">
<%= msg %>
</p>
<!-- index.ejs -->
<%- include('partial', {msg: 'hello'}); %>
在 EJS 中使用 lodash
鑒於 EJS 使用原生 js 語法的便利,如果能額外加上更多擴充功能的 lodash,編寫 template 時簡直如虎添翼。使用的方式非常簡單,就是將 lodash 傳入 EJS 中,可惜的是無法有 intellisense ,不免要花些時間查詢語法。
// gulpfile.js
const lodash = require("lodash");
gulp.task('EJS', () => {
return gulp.src("./source/*.ejs")
.pipe(EJS({
lodash : lodash
}))
}
<div>
<%= lodash.random(1, 6) %>
</div>
整體而言 EJS 的學習曲線極低,幾乎是一個習慣 asp.net, php, razor 的使用者,想像 EJS 該如何做到類似的實踐,轉換上完全沒有痛苦,而且也不需要另外學習相關語言,就可以做到渲染的控制。唯一美中不足的就是不如 razor 有著方便的 intellisense。