Node Template Engine

Published on
NodeJS
2015/07/node-template-engine
Discord

วันนี้ขอนำเสนอบทความสั้นๆสำหรับการเลือก Template Engine บน Node.js หากท่านยัง render ไฟล์ html ธรรมดาอยู่แล้วละก็ เปลี่ยนมาใช้ Template Engine กันดีกว่าครับ บทความนี้ assume ว่าผู้อ่านมีความรู้พื้นฐาน Node.js รวมถึง Express.js เบื้องต้นอยู่แล้ว เพราะฉะนั้นตรงส่วนไหนไม่เข้าใจ ก็ไปอ่านเพิ่มเติมเอานะครับ ขอโฟกัสที่ตัว Template Engine อย่างเดียว

Setup Project

ตัวอย่างจะทำการสร้างโปรเจ็คขึ้นมาแบบธรรมดา โดยมีแค่ไฟล์ package.json, app.js และโฟลเดอร์ views โดยภายในโฟลเดอร์นี้ก็จะเป็นไฟล์ template นามสกุลต่างๆ

ไฟล์ package.json

{
  "name": "simple-template-engines",
  "version": "0.0.1",
  "dependencies": {
    "ejs": "^2.3.3",
    "express": "^4.13.1",
    "express-handlebars": "^2.0.1",
    "jade": "^1.11.0",
    "swig": "^1.4.2"
  }
}

ไฟล์ app.js

var express = require('express')
var path = require('path')

var app = express()

app.set('views', path.join(__dirname, 'views'))
// Setup template engines go here.

app.get('/', function (req, res) {
  // code goes here
})

app.listen(8000, function () {
  console.log('App running on port 8000')
})

Jade Template

npm install jade

การใช้งานก็แค่ set view engine เป็น jade

ไฟล์ app.js

app.set('view engine', 'jade')

app.get('/jade', function (req, res) {
  res.render('index', {
    title: 'This is title of Jade Template',
    message: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit',
    names: ['John Doe', 'Jane Doe', 'Jane Dane']
  })
})

สร้างไฟล์ index.jade ในโฟลเดอร์ views


h1 #{title}
p #{message}
ul
    each name in names
        li= name

เมื่อรัน Server ก็จะถูกคอมไฟล์เป็นไฟล์ html แบบนี้

<h1>This is title of Jade Template</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
<ul>
  <li>John Doe</li>
  <li>Jane Doe</li>
  <li>Jane Dane</li>
</ul>

EJS Template

npm install ejs

การใช้งานคล้ายกับ Jade ก็แค่ set view engine เป็น ejs

ไฟล์ app.js

app.set('view engine', 'ejs')

app.get('/ejs', function (req, res) {
  res.render('index', {
    title: 'This is title of EJS Template',
    message: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit',
    names: ['John Doe', 'Jane Doe', 'Jane Dane']
  })
})

และสร้างไฟล์ index.ejs ขึ้นมาสำหรับเอาไว้ render

<h1><%= title %></h1>
<p><%= message %></p>
<ul>
    <% names.forEach(function(name) { %>
        <li><%= name %></li>
    <% }); %>
</ul>

เมื่อรัน Server ก็จะถูกคอมไฟล์เป็นไฟล์ html แบบเดียวกับ Jade แบบนี้

<h1>This is title of EJS Template</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
<ul>
  <li>John Doe</li>
  <li>Jane Doe</li>
  <li>Jane Dane</li>
</ul>

Swig Template

npm install swig

Swig จะต่างจาก Jade และ EJS เล็กน้อย คือไฟล์ extension จะเป็น html ปกติ โดยเรา้ต้องการให้ไฟล์ html ไหนทำการ render ด้วย Swig ก็จะใช้คำสั่ง swig.renderFile ฉะนั้น view engine ก็เซตเป็น html แบบนี้

var swig = require('swig')

app.engine('html', swig.renderFile)
app.set('view engine', 'html')

app.get('/swig', function (req, res) {
  res.render('index', {
    title: 'This is title of Swig Template',
    message: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit',
    names: ['John Doe', 'Jane Doe', 'Jane Dane']
  })
})

ไฟล์ index.html สำหรับ Swig Template

<h1>{{ title }}</h1>
<p>{{ message }}</p>
<ul>
  {% for name in names %}
  <li>{{ name }}</li>
  {% endfor %}
</ul>

เมื่อรัน Server ก็จะถูกคอมไฟล์เป็นไฟล์ html แบบเดียวกับ Jade และ EJS แบบนี้

<h1>This is title of Swig Template</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
<ul>
  <li>John Doe</li>
  <li>Jane Doe</li>
  <li>Jane Dane</li>
</ul>

Handlebars

npm install express-handlebars

Handlebars จะต่างจาก View Engine อื่นเล็กน้อย โดยการใช้ module express-handlebars จากนั้น ก็ใช้ ตัว module กำหนดว่าจะใช้ไฟล์ extension เป็นชื่ออะไร อย่าง Handlebars ก็จะใช้ hbs ฉะนั้นก็เลยตั้งค่าเป็นแบบนี้

var handlebars = require('express-handlebars')

app.engine('hbs', handlebars({ extname: 'hbs' }))

app.get('/hbs', function (req, res) {
  res.render('index', {
    title: 'This is title of Handlebars Template',
    message: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit',
    names: ['John Doe', 'Jane Doe', 'Jane Dane']
  })
})

และสร้างไฟล์ index.hbs ขึ้นมาแบบนี้

<h1>{{ title }}</h1>
<p>{{ message }}</p>
<ul>
  {{#each names }}
  <li>{{ this }}</li>
  {{/each}}
</ul>

ผลลัพธ์ก็จะได้เช่นเดียวกันกับ View Engine อื่นๆ

<h1>This is title of Handlebars Template</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
<ul>
  <li>John Doe</li>
  <li>Jane Doe</li>
  <li>Jane Dane</li>
</ul>

สรุป

บทความนี้เป็นแค่ตัวอย่างการ Setup และใช้งาน View Template Engine เบื้องต้นเท่านั้น รายละเอียด และ Features อื่นๆ ที่แต่ละ View Engine มีก็ต้องไปลองอ่านเพิ่มเติมกันเอาเองครับ ส่วนนี้ผมทำไว้เผื่อตัวเองด้วย บางทีก็ลืมๆว่า ต้องกำหนดอะไรบ้าง เหมือนกัน :)

References

Buy Me A Coffee
Authors
Discord