不需要跟隨 jade MVC架構
MVC 是 Model-View-Controller 架構,即一軟體系統將資料模組(Model)、呈現模組(View)、和控制模組(Controller)三者分離,有降低系統資料、呈現與控制間彼此藕斷絲連,讓架構分工更明確、有助開發分工,與系統擴充性高等四大好處。但缺點就是執行效率不高,和浪費時間和生命。
Calendar 3043年九月二十
卓俊宏 (2182) 2016-10-20 06:40:23 THR
有時候,要看情況選擇,不一定別人發展出什麼模式,我們就當神來膜拜學習。尤其這資訊發達時代,每隔幾年都會有大變革。一個專案結束之後,這專案能否被拿來利用還是個大問號,規劃一堆方法,只是徒具形式,作為學術研究和簡報給公司老闆有加分效果而已,實際上不如把錯誤解決,品質提昇和趕緊交差來得重要。這個系統會有被再次利用的價值應該是最主要重點,如果是那「複製,貼上」,然後稍加修改,會比這些架構更容易吧!我們一定要走出自己的一條康莊大道,趕快開始開發下個案子吧!

此乃剛看了 jade 模版引擎有感而發之文,這架構其實不錯,但多此一舉!!!

jade 可以利用 extends 和 block 去繼承模版和套用內容,這觀點的確是用意良善,其實廿年前就不少人提出,比如xml+xsl,但似乎後來都還是流行直接寫,呈現交給html+css,Layout交給html,控制交給html+js,資料大都是後端直接寫在變數中,或者透過xml和json來做傳輸與溝通。這樣就好了,真的不需要細分。

安裝好 express-generator,他的架構如下:
bin
  www
node_modules
  body-parser
  cookie-parser
  debug
  express
  jade
  morgan
  serve-favicon
public
  images
  javascripts
  stylesheets
routes
  index.js
  users.js
views
  error.jade
  index.jade
  layout.jade
app.js

其中view就是使用 jade 模組去實現,其中 layout.jade 就是版面的核心骨架,也像是母片。
doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    block content

而index.jade 是繼承自 layout的骨架,會將layout鋪設一遍後再取代內容。如body內的 block content內容就被取代成 h1= title, p Welcome to #{title}。
extends layout

block content
  h1= title
  p Welcome to #{title}

有了這些骨架,express等相關模組就會在上面補肉,最後做成html的外觀。但是補肉是需要運算的,補肉的程式碼如果寫不好,也可能在某些地方會有bugs。或者是改版後,前後不相容,因此單純來看,最好不要沒事找事,應該把重點放在網頁的規劃與設計,比如,不要一頁顯示太多東西,並且在網頁階層就將架構規劃好。一目了然,未來也容易複製和修改。而非畫蛇添足,增加計算複雜度。
<!DOCTYPE html>
<html>
<head>
<title>Express</title>
<link rel="stylesheet" href="/stylesheets/style.css">
</head>
<body>
<h1>Express</h1>
<p>Welcome to Express</p>
</body>
</html>

這簡單的畫面,我想小學生現在都會自己寫了,實在不必要細切了。如果需要有 tamplates,何不請設計師設計幾頁範本,大家複製後自行修改更為巧妙。現在儲存空間這麼大,這些複製內容實在微乎其微。這也是筆者認為的正確之道。
Screenshot from 2016-10-20 12-15-48.png

Express的View 還可將網頁內容不斷切割細分,如上面的index.jade,還可以透過 include 去實現加入其他jade檔案。

下面是 app.js 內跟 route有關的codes
var routes = require('./routes/index');
var users = require('./routes/users');
...
app.use('/', routes);
app.use('/users', users);
意思是前端使用者假設輸入 http://localhost:3000/ 後端會將導引去執行 routes/目錄下的 index.js
前端使用者假設輸入 http://localhost:3000/users 後端會將導引去執行 routes/目錄下的 users.js

下面是index.js 內容,會繼續透過 express.Router() 模組去與前端的要求,回饋與之後要處理的事務。如下,index.js 會輸出html 字串,不過,它又要再等等,為何等呢?因為它希望透過 jade 的 index view去呈現。而index view 就是上面的 index.jade,其中有個變數 title,則是透過json 提供。
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { 
title: 'Express',
Users = [
[{"id":1,"name":"Lauren"}, {"id":2,"name":"Dainese"}, {"id":3,"name":"Wely"}],
[{"id":4,"name":"John"}, {"id":5,"name":"Mary"}, {"id":6,"name":"Tim"}]
]
}
);
}); module.exports = router;

我稍微修改一下上面的index.jade,增加一行: include table,而table.jade內容如下:
div
  table
    thead
      tr: th User Table
    tbody
for row in Users
 each user, i in row
 tr(class=(i % 2 == 0) ? 'odd' : 'even') td a(href='/member.php?id=' + user.id) #{user.name}

從這邊我們可以想像,做了一大堆事,只是為了呈現一個連小學生都會寫的html 表格文件。

這還是簡單的文件,對於一些更複雜的文件勢必要投入更多心力去撰寫、維護與閱讀。現在有 jade,未來如果有更好的呢? 要置換嗎?

結論是,nodejs 發生在這世上是美好的,非常值得投入研究,熟悉後可以通吃前後端。但不要誤入不良架構而不自知。筆者建議不需要去學這些沒意義MVC架構,把時間花在html、html5.0、javascript、stylesheet、Server script,OS related Native Services and Components、UI/UX、WebRTC、創意,和這世界介接的服務與元件等技術會更為重要。