griffith.chen 的部落格

Node.JS

Node.js 是個架在 Google V8 JavaScript 引擎之少的事件驅動式的輸入輸出模組 (evented I/O),它的設計是根據在其他語言的框架 (framework) 像 Ruby 的 Event Machine 以及 Python 的 Twisted. Node 的目的是能夠提供一個簡單的方式來創作高效能和具擴充性的及時性網站應用程式。

JavaScript一般都是執行瀏覽器上。近年來,CommonJS、Jaxer 或 Narwhal 等等的框架不斷的出現,希望把 JavaScript 帶到伺服端的環境。跟這些選擇比起來 Node 有些不同,因為它是事件導向而不是執行緒導向。像是 Apache 這類用來提供 CGI 執行的網站伺服器是屬於執行緒導向,因為每當有一個請求送達的時候就會觸發一個系統執行緒產生。執行緒導向模式不具備同時處理大量連線的能力,因此也不適合用來設計及時性應用程式。
Node 透過事件循環 (event loop) 的方式取代執行緒,這樣就能夠同時處理上萬的連線。當一個連線請求 (request) 送達的時候作業系統會通知 Node,收到了通知 Node 會執行回呼涵式。每個連線只會佔了小小的堆積配置。然而,在ㄧ個需要處理大量連線的系統下,事件導向的 Node 在記憶體上也比較有效率。在 Node 的框架裡沒有鎖,它的涵式幾乎不會直接用到 I/O,所以程式行程也不會被鎖住。使用 Node 也程式的人也不需要為了死鎖 (deadlock) 而煩惱。

Node 的優點在於因為伺服器大多的時間都利用在等在 I/O 操作,而這些操作都遠比記憶題操作慢。Node 的 I/O 操作都是用非同步的方式,這樣就應許在處理I/O操作的同時程式行程繼續處理連線請求。

以下是一個用 Node 寫的 HTTP 伺服器,它接收的每一個請求都會回 ”Hello World”。

var sys = require(‘sys’), http = require(‘http’);

http.createServer(function(request, response) {
response.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(8124);

sys.puts(‘Server running at http://127.0.0.1:8124’);

這程式載入了 sys 與 http 模組,然後建立了一個 HTTP 伺服器。被傳遞到http.createServer 的匿名函式會在每一個請求連線的時候被呼叫。當伺服器啟動的時候,它會告訴你它目前監聽埠號 8124。

Node 是一個令人興奮技術建立在另外一個非常了不起的技術上: Google 的V8 JavaScript 引擎。Node 這框架已經被科技界注意到,在加上它的模組化系統,在網路上已經有許多第三方的模組可以使用,來加強這完整框架。

jQTouch

jQTouch 是一個基於 jQuery 的 JavaScript Framework,使用在手機裝置的 webkit 瀏覽器開發。iPhone、Nexus One、以及 Palm Pre 都可以使用 jQTouch 來開發手機應用軟體。jQTouch 提供讓開發者選擇自己的 css 主題,與加入插件 (extensions)。jQuery 是一個快速又簡淨的 JavaScript Framework,能過簡化開發者在 HTML 文件裡面尋找 DOM 物件、處理事件 (events)、製作動畫、和處理 Ajax 互動的過程。jQTouch 與 jQuery 的組合,甚至可以讓沒 jQuery 經驗的開發者容易的製作手機裝置上的手機應用軟體。


以下是一個程式首頁(Home)裡的 HTML:

<html>
<head>
<title>To-Do</title>
<link type=”text/css” rel=”stylesheet” media=”screen” href=”jqtouch/jqtouch.css”>
<link type=”text/css” rel=”stylesheet” media=”screen” href=”themes/jqt/theme.css”>
<script type=”text/javascript” src=”jqtouch/jquery.js”></script>
<script type=”text/javascript” src=”jqtouch/jqtouch.js”></script>
<script type=”text/javascript”>
var jQT = $.jQTouch({
icon: ‘todo.png’,
statusBar: ‘black’
});
</script>
</head>
<body>
<div id=”home”>
<div class=”toolbar”>
<h1>To-do</h1>
</div>
<ul class=”edgetoedge”>
<li class=”arrow”><a href=”#about”>About To-Do</a></li>
</ul>
</div>
<div id=”about”>
<div class=”toolbar”>
<h1>About To-Do</h1>
<a class=”back” href=”#”>Back</a>
</div>
</div>
</body>
</html>


程式首頁的 HTML 很簡單,它的 body 只有兩個 div。jQuery 和 jQTouch 是在 HTML head 加上去的:

• jqtouch.css 是一個必要的檔案,在裡面定義了手機裝置的架構設計規則,也同時包含了動畫處理,還有手機方向模式的處理。
• theme.css 是 jQTouch 提供的 css 主題之一。
• jquery.js 是 jQuery Framework 主要的檔案。jQTouch 是基於在  jQuery,所以它的 Framework 同時也包含了 jQuery 的檔案。
• jqtouch.js 是 jQTouch Framework 主要的檔案。
• 參數 jQT 是 jQTouch 的 initialized object。在首頁的例子裡,兩個屬性被定義:icon 以及 statusBar。

除了這兩個屬性以外,jQTouch 還有提供更多的屬性讓使用者可以指定和客製化他們程式的行為 (behavior) 和顯示 (appereance)。在例子裡,icon 指定了程式的 Web Clip 圖,statusBar 指定了程式在全螢幕模式裡,螢幕上顯示的 status bar顏色。

jQTouch 是一個很方便和豐富的 framework,可以讓開發者很快的加在程式裡 native-looking 的動畫和感覺。就像 Dave Methvin 說的: “你用10行的 jQuery 完成以往要 20 行左右枯燥的 DOM JavaScript。在寫完那 20 行的時間你已經用兩三行的 jQuery 完成要完成的工作。這不可能在更快,除非程式能有讀心術。” jQTouch 的設計概念也是完全的遵守了這概念。