從LAMP到MEAN

如果你對Linux有些許渉獵,或者偶爾會租個虛擬主機架設網站、甚至於曾經用過一些免費好用又方便的架站軟體如Xoops、WordPress、Joomla、Drupal、Wiki等等,那你一定知道LAMP,因為這些好用的套裝程式都是依附在LAMP架構下成長茁壯的。

http://t1.gstatic.com/images?q=tbn:ANd9GcQkOibnfc0laQuX2bkUurDGDEglUZYRJQBNZrt2OAWP0ww7LQSQoQ

        LAMP是四套系統的縮寫:Linux、Apache、MySQL、PHP(後來擴增到Perl或Python等語言也算), 其中的Linux是低層的作業系統, Apache負責的是Web Server角色,MySQL是後端的資料庫,PHP、Perl或Python則是產生各種網頁的程式語言,它們四個完美的搭配,持續二十多年來,超過五成約有五億多的網站都是採用類似LAMP的系統的「後台」系統。

「後台」系統?沒錯,在PC當道行動雲端尚不發達的年代(其實也不過幾年以前),網站的畫面呈現與使用者體驗並不是特別受到重視的議題,我們關心的是如何利用PC來解決問題, HTML或Javascript只要能迅速方便簡便的將後台的運算結果呈現出來就足夠了,因此,在那時熟悉Javascript並不被視為一項技能,在網站規劃設計製作專案中它幾乎被視為尤如裝飾用的二流玩意,當時幾乎每個人都認為,一個專業的Web工程師必須熟稔後端server的語言才是有價值的。

然而現在一切都改變了,行動雲端的流行完全反轉了這個現象,我們開始在乎網站程式在不同螢幕尺寸上呈現的效果,我們要求只要撰寫一次程式碼就可以跨平台在不同的系統上運行,我們希望不同的Web service之間有相同的介面標準,我們渴望程式在多樣化的手持裝置上能夠滿足不同的使用者體驗,而這些正是長久耕耘client端的Javascript語言的強項。

MongoDB     ExpressAngularJS           Node.js

MEAN是由MongoDB、ExpressJS、AngularJS以及Node.js等四套Javascript為基礎的系統組成的首字縮寫,其中MongoDB是一種Nosql資料庫,相當於LAMP中Mysql的地位,ExpressJS定義並架構起整個網站的Framework,其位階尤如Apache,AngularJS負責的是前端與後端的溝通、提供各式AJAX元件與前端的體驗介面,作用尤如PHP在後端的角色,最後Node.js就如同LAMP中Linux的底層角色,提供一個純Javascript環境的執行平台。

MEAN所具有的優勢

MongoDB 比起MySQL更適合於雲端運算環境

LAMP使用的MySQL是一種關聯式資料庫,這類的資料庫最大的貢獻是它的JOIN概念,它讓我們在下SQL語法撈取資料時透過JOIN就可以取得其它Table或資料庫的資料,SQL指令變得更加精簡,最重要的,這種JOIN的用法可減少資料庫的體積以及佔用的磁碟空間,整體資料庫的回應時間也更加的迅速。不過,這樣的好處隨著每單位的硬碟價格降低而顯得不是那麼重要,各式各樣不同的資料形態以及數量龐大的數據的出現也使得關聯式資料庫要花費更多更大量的CPU時間和大量的記憶體才能應付每個request,於是,NoSQL的MongoDB取代MySQL是相當自然的事,最重要的是,MongoDB比起mySQL更適合在雲端上運行,因為它不需要透過其它軟硬體的協助就擁有平行的擴展處理以及cluster叢集支援功能,而這類的特性要實現在諸如mySQL之類具有嚴謹表格定義與資料存取的關聯式資料庫上,技術上相當困難且很麻煩。

程式碼單一化並簡化了伺服器層

透過Node.js所架構的Javascript伺服端執行環境不但簡化了以往Apache系統複雜的檔案及設定檔,而且比起以往僅侷限於後端的LAMP,以Javascript軟體架構的web server帶來使用上的「彈性」更廣且更具效率,舉例來說,從Node.js到ExpressJS、AngularJS,僅用一種Javascript語言就可以包辦從前後端的系統,當我們在Node寫了支程式,後來發現它較適合佈署在AngularJS,很方便的就能把這支程式移轉過去,此外,在公司的專案計劃中,我們並不需要特別找尋PHP、JavaScript人才或MySQL等等不同領域的人才,也不需要分別指派不同前後端系統的工作,只要懂Javascript一套MEAN系統便可全部一起搞定。

對於這種Javascript前後端通吃的特性,我們一般都稱做「Javascript全端能力(full stack JavaScript)」或者「純Javascript解決方案(pure JavaScript solutions)」。而這類領域的工程師則被稱為「Full stack工程師」

        共通的溝通標準:JSON

MogoDB、ExpressJS、AngularJS以及Node.js之間預設是透過JSON來進行資料交換,而目前JSON已經成為一種主流的檔案格式,無論是在前端使用者還是後端的系統平台,以及眾多Web service所提供的介面以及API、SDK等等都能透過JSON來溝通交換訊息。

更快的執行速度

另一個MEAN的優勢是執行速度,相當多的比較文章已經指出Node.js的速度比起Apache更快,原因可能是現在新的Javascript引擎(如Google Chrome的V8)讓編譯效率更好,也有可能是Node.js事件趨動(event-driven)的架構能讓處理的速度更快。

        豐富的開發資源及生態

PHP長久以來所累積的各式套件與軟體支援相當豐富,需要不同的功能就能找到對應支援的軟體套件,這特性是PHP使用者所依賴並引以為傲的,不過,近年來熱門的Node.js挾著眾多的愛好者以及容易使用的NPM管理工具,各類型套件的交換更為方便。NPM 是 Node Packaged Modules 的簡寫,它讓Node.js的生態體系蓬勃的發展,截至去年十二月底的統計,NPM已擁有了53,459個套件可以提供開發者們使用,且這個數字正以二倍的速度在持續的快速增加中。

MEAN的安裝

如同LAMP有為數甚多的一次性整合安裝檔,目前也有一些安裝套件可協助一次就將MEAN的四個系統安裝完畢,如下列三種:

MEAN.JS:http://meanjs.org/

MEAN.IO:http://mean.io/#!/

Bitnami MEAN:https://bitnami.com/stack/mean

MEAN的目錄架構

一個新的MEAN專案目錄,其檔案架構如下:

structure

這些目錄主要可分成server端和client端,我們要注意的是app、config、public以及server.js這幾個。

Server端:

app\:該目錄下包含MVC三大部分。

config\:針對專案本身及server的設定檔,其中有一個env的目錄可設定開發、產品和測試各個階段的環境變數。

server.js:啟始整個網站的設定文件。

Client端:

此類的檔案都置於public\目錄下,這個目錄包含了css以及img等子目錄。

從LAMP到MEAN代表的不僅僅是使用工具上的不同,更揭示了使用者需求的變化,它強迫我們在專案開發的思考流程,須從足不出戶的後端工程師轉變成為著重在以前端使用者UX為優先的設計模式。