利用Java Script撰寫伺服端程式-Node.js

作者/蘇福泰

Java Script的潮流 任何一位撰寫Web的程式開發者一定對於Java Script的大名非常熟悉,Java Script是一種目前被廣泛地使用在Web前端的腳本語言,使得Web能帶給使用者有更多的動態功能,而根據w3techs.com網站於2012年4月1日公布世界前一百萬網站的統計數據顯示目前Java Script在Web前端的使用率更是高達91.6%。

《圖一》The most popular client-side programming language
參考來源:http://w3techs.com/
Java Script除了在Web前端有如此高的被使用率外,在這幾年內更是迅速孕育了許許多多的不同樣貌。舉例而言,這個世代的瀏覽器戰爭中催生了許多為了支援跨瀏覽器的Java Script函式庫,使得開發者能夠輕易的解決Web跨瀏覽器的問題,如:由John Resig推出的JQuery。又或者是為了支援平板與智慧型裝置而催生的Web App也採用Java Script來實做,如:JQuery Mobile……等,所以Java Script已經茁壯成能在不同瀏覽器與不同裝置平台的環境下擔任起重要的前端開發角色。 從前端走向後端-Node.js 在Ryan Dahl先生的努力下Node.js於2009年誕生在世人面前,Node.js是一種採用Java Script當作語言工具的新型後端開發框架,因為Node.js是利用Google公司所開發的Java Script V8開源引擎作為基底,而Java Script V8引擎正是以執行快速著稱,因此使用Node.js製作出的伺服器反應可以非常地快速,此外Node.js完全Open Source,這無疑是在百家爭鳴的後端開發環境上又添加了一位生力軍。雖然PHP、Dot Net、Java……等眾多伺服端語言已經各自在後端開發環境中擁有自己的一片天,然而Node.js卻擁有一項其他伺服端語言所沒有的最大優勢,Node.js讓Web開發者能夠重新拾起最熟悉的老朋友-Java Script做為後端開發工具,不僅使得開發者可以將前端的開發經驗繼續傳承至後端開發,也使得前端與後端的開發可以一氣呵成,不用掛心不同開發語言間的隔閡,大幅降低開發者的負擔。因此Node.js在這一兩年內被熱烈地討論著,甚至連微軟也於2011年6月宣示將協助Node.js移植到Windows平台上來做全面性的支援。因此Java Script將成為一個能支援Web前後端的全面性開發工具。 Node.js的特點如下: 一、Java Script Engine V8 Node.js是一個基於Java Script Engine V8上的開發框架,是目前最快速的Java Script處理引擎之一,而Java Script Engine V8是由Google所開發出來,主要應用在Chrome瀏覽器上,目前也是一個開放原始碼的專案。 二、Event-driven (事件驅動) 以前的網路程式原理是將使用者每次的連線都開啟一個執行緒,所以當連線爆增的時候會快速耗盡系統效能。而因為Node.js仍然保留Java Script的Callback方式,因此程式接收到一筆連線時會將此筆連線先暫存至記憶體,直到系統通知完成工作的事件產生後才會觸發Callback來把這個連線呼叫回來並讓程式作適當的回應動作。 三、Non-blocking IO (非阻塞式IO) 當有IO事件產生時,程式不會等待這個IO事件完成,而是會將這個IO狀態暫存起來,然後繼續往下執行其他工作,而執行工作的同時會透過輪詢的方式來服務需要讀取資料的IO,避免IO讀取資料的時間過長而造成整個程式的停滯。 初探Node.js 首先必須在電腦內安裝Node.js的運作環境,請在瀏覽器網址列中鍵入http://nodejs.org/,開啟Node.js官網的首頁後點選”DOWNLOAD”。

《圖二》Node.js官網的首頁畫面
點選之後會出現下載對話視窗,請根據自己電腦的OS環境選擇適當的安裝程式。接下來的流程將以Windows Vista的環境為例示範。

《圖三》下載對話視窗的畫面
下載完成後出現安裝畫面,請一直點選”下一步”即可以順利完成安裝Node.js的動作。

《圖四》Node.js開始安裝程式的畫面

《圖五》Node.js安裝完成的畫面
接下來將利用簡單的「Hello World」範例來驗證Node.js環境是否安裝成功。首先,打開記事本並鍵入「console.log(“Hello World”);」,這句程式的用意是在命令提示字元視窗中將「Hello World」的文字顯示出來。鍵入完畢之後將此份文件以副檔名為「js」存檔。例如:下圖中是以「hello-console.js」為檔名存檔。

《圖六》記事本鍵入「console.log(“Hello World”);」的畫面
接著將命令提示字元視窗打開並且移至剛剛存檔的所在位置。然後輸入「node hello-console.js」之後就會發現「Hello World」被印在畫面上。這不但表示Node.js環境已經被成功安裝,而且同時也利用Node.js完成了一個最簡單的範例。

《圖七》命令提示字元視窗輸入「node hello-console.js」後出現「Hello World」
建立一個簡單的Web Server 接著我們將利用Node.js建立一個簡單的Web Server。首先,打開記事本輸入下圖中的程式碼並存檔。例如:下圖中是以「Hello-HTTP.js」為檔名存檔。

《圖八》記事本鍵入一個簡單Web Server程式碼的畫面
重點如下: 1.「require(‘http’)」作用為引入node.js環境中的http組態元件。 2.「http.createServer(function(request,response){})」作用為建立一個http協定屬性的Server。其中「request」處理客戶端連入Server的所有請求實作;「response」負責處理Server回應所有客戶端的實作。 3.「response.writeHead(200,{“Content-Type” : ”text/plain”})」作用為回應客戶端的prototype。其中「200」表示工作處理成功;「{“Content-Type” : ”text/plain”}」表示傳回的組態為純文字格式。 4.「reponse.end()」作用為告訴客戶端回應的訊息到此結束。 5.「listen(8000)」作用為設定Server在port number為8000時起作用。 接著在命令提示字元視窗中鍵入「node Hello-HTTP.js」後會出現防火牆提示訊息,請將防火牆提示視窗選擇「允許存取」。

《圖九》Windows防火牆的提示訊息
接著命令提示字元視窗會出現剛剛在程式碼中設定的「Server running at http://127.0.0.1:8000」文字說明。這文字的出現也表示一個簡單的Web Server已經被成功啟動。

《圖十》一個簡單的Web Server啟動成功
接下來就要驗證Web Server是否能夠接受來自客戶端的請求。首先,打開瀏覽器在網址列鍵入「http://127.0.0.1:8000」。之後畫面出現「Hello World」就表示Server成功接收來自客戶端的請求了。

《圖十一》一個簡單的Web Server成功接收來自客戶端的請求畫面
不只是本機的請求。接著可以利用其他網域的電腦透過IP Address連回來也可以成功顯示出「Hello World」。因此現在這台被啟動的簡單Server也能服務來自其他網域的客戶端請求。

《圖十二》一個簡單的Web Server成功接收來自其他網域客戶端的請求畫面
進階應用 接下來將繼續應用剛剛完成的簡單Web Server來顯示一個具有HTTP標籤的網頁檔。程式碼如下圖所示。

《圖十三》一個簡單的Web Server來顯示一個具有HTTP標籤的網頁檔的程式碼
重點如下: 1.「require(‘fs’)」作用為引入讀取檔案的元件。 2.「readFile(filename,encode,function(err,file){})」作用為讀取一個檔案。其中「filename」表示為要讀取的檔案路徑;「encode」表示為讀取檔案的編碼,此處設定為「utf-8」;「err」負責接取錯誤的回傳值;「file」負責接收成功的回傳值。 3.「response.write(file)」作用為將讀取的檔案拋回給客戶端。 接著打開新的記事本建立一個具有HTTP標籤的網頁檔。程式碼如下圖所示。

《圖十四》一個具有HTTP標籤的網頁檔程式碼
接著將Server啟動,然後在網頁開啟「http://127.0.0.1:8000」會出現node.js index html file就表示Web Server成功顯示出一個具有HTTP標籤的網頁檔了。

《圖十五》Web Server成功顯示出一個具有HTTP標籤的網頁檔的畫面
總結 Node.js不僅讓Web開發人員有能力利用既有的Java Script前端開發經驗來做為後端的開發工作,來使得Web後端的開發難度可以大幅下降,而且再也不用煩惱前端與後端會產生不同語言間隔閡的可能性,進而降低開發人員的負擔。因此本篇文章希望能夠讓開發人員快速了解Node.js的環境安裝與使用方法,並且透過簡單的範例,如:建立一個簡單的Web Server、利用Web Server來顯示一個具有HTTP標籤的網頁檔等範例來提供開發人員更清楚地理解整個Node.js的運用情形。 雖然Node.js仍然是一個成長中的Framework,不過許多資料顯示利用Node.js開發出來的伺服端程式不僅可以有更好的效能表現與擴充性,而且系統資源的消耗程度可以相對更低。此外Node.js因為選用易撰寫的Java Script為主要語言使得入門障礙比較低,而保留Java Script的非同步IO特性也讓產生的程式不容易讓伺服端資源有阻塞的情況發生。甚至實現智慧行動裝置網頁與電腦網頁即時互動也難不倒它。由於Node.js擁有這麼多的優勢,因此在這一兩年間被討論的程度非常地高,甚至連今年微軟也決定將Node.js加入至Visual Studio與Windows Azure的支援範圍。Java Script對於Web前端開發的重要性已經是有目共睹,而Node.js的誕生又使得Java Script能夠開始在後端開發上大展身手,所以Java Script挾帶在前端開發中擁有極高市占率的優勢加入後端開發行列後,將讓伺服端開發語言的市場重新洗牌,因此Node.js的蓬勃發展將大幅改變往後Web開發的生態,使得Java Script將成為一個全面性且具同時制宰前後端的Web獨立開發語言。 參考資料 1.Learning Server-Side JavaScript with Node.js 2.Microsoft working with Joyent and the Node community to bring Node.js to Windows 3.Node.js Developer Center for Microsoft 4.Node.js 台灣社群協作電子書 5.Top Benefits of Running Node.js on Windows Azure 6.Why node.js is cool 7.使用 Node.js 來達成電腦網頁與手機網頁即時互動 8.我為什么向后端工程師推荐Node.js 9.網頁開發熱門技術 – Node.js