標籤:blog http io os 使用 java ar strong 檔案
Node.JS 是資深 C 程式員 Ryan Dahl(http://four.livejournal.com/)的作品,依據 Google 著名的開源 JavaScript 引擎 V8 來進行二次開發的 Web I/O 伺服器(http://nodejs.org/)。V8 本身是非常快的 JavaScript 引擎,處理 JS 執行啟動並執行速度非常高。相關測試表明,FireFox、Opera 和 IE 的 JS 引擎速度都不及 V8 來得快。而且,還可以說,只要瀏覽器之間的 JS 引擎大戰一日不減,NodeJs 就可以從中受益。有競爭才有進步:)。
NodeJS 基本用法也是十分簡單明了的,我們看看一下這一句,就是最簡單的代碼:
[javascript] view plaincopy
- var
- sys = require(‘sys‘)
- ,http = require(‘http‘);
- http.createServer(function (req, res) {
- res.writeHead(200, {‘Content-Type‘: ‘text/plain‘});
- res.write(‘Hello World‘);
- res.close();
- }).listen(8006);
- sys.puts(‘Server running at http://127.0.0.1:8006/‘);
以上語句 var http = require(‘http‘);http.createServer(function (req, res) {…}); 就是建立一個 HTTP 伺服器,偵聽來自用戶端的請求,匿名參數中的 req 和 res 分別代表請求對象和響應對象。NodeJS 把邏輯語句寫在一個函數中,說明建立伺服器 createServer() 連這一步驟都是非同步!而且除此之外,req 也有相關的非同步作業:
[javascript] view plaincopy
- http.createServer(function (req, res) {
- req.addListener("end",function(){
- sys.puts("request end");
- });
- res.writeHead(200, {‘Content-Type‘: ‘text/plain‘});
- res.write(‘Hello World‘);
- res.close();
- }).listen(8006);
這樣就對請求 req 登記了 end 的事件。在請求結束時通過 sys.puts 方法加入"request end"。在使用事件的過程中,實質也算是一個非同步過程,非同步的。
從宏觀層面看以上的示範,上面僅僅是一個比較底層的操作,都是低層次的控制,不足以提供更多 High Level 邏輯。要增強 NodeJS 這個平台功能,我們可以使用其他圍繞 NodeJS 而開發模組,甚至是一個初具規模的“架構”,——其中一個就是 Express(http://github.com/visionmedia/express)。安裝 Express 的前提是安裝另一個依賴包:Kiwi(http://github.com/visionmedia/kiwi),然後鍵入kiwi -v install express 才可以正式安裝 Express。安裝好 Express 之後,立刻輸入下面代碼測試一下:
[javascript] view plaincopy
- var sys = require("sys"),
- kiwi = require("kiwi"),
- express = kiwi.require(‘express‘);
-
- get(‘/‘, function(){
- this.redirect(‘/hello/world‘)
- });
-
- get(‘/hello/world‘, function(){
- return ‘Hello World‘
- });
-
- get(‘/goodbye/world‘, function(){
- return ‘Goodbye World‘
- });
-
- run();
Express 啟動並執行 URL 和連接埠是 http://localhost:3000,預設請求的規則都會被轉移到 /hello/world 目錄,返回 ‘Hello World‘ 的字串。訪問 /goodbye/world 目錄就返回 ‘Goodbye World‘。Express 之所以被稱為一個“架構”,應該還有其他的功能在內,例如請求路由、渲染視圖的其他進階功能。
Web伺服器的事件編程其意義
我們知道並且十分清楚,JavaScript 是單線程的(就當前流行的 js v1.5而言),怎麼避免 I/O 通道上的阻塞(block)呢?——基於事件驅動(Event-based)的編程或者或者是一種可行之道,為不少背景程式解決線程/阻塞之用。自從 Viusal Basic 流行起,基於事件驅動的編程模型在GUI之上早已為我們所熟悉,存在很長的一段時間了。若說上早期的開發,那時我們經常的一個做法,就是在main()方法寫一個無限迴圈(while(true) loop),從而獲得控制任何時刻程式的能力,亦算是一種樸素的“事件”模型。我們清楚,JavaScript天然是Function First Level的,對一個函數還可以送入一個函數的參數(即傳入一個閉包closure),換言之,JS天生與事件驅動的編程是不謀而合,相得益彰的。鑒於此,Node.js的事件編程理念的確是一個亮點。
另外一點,高並發的 Web 服務器一直乃久經不衰的熱點和話題,也許有很多的解決方案,效能達到一定的指標也沒有問題,不過問題是,因而,在保證並滿足效能達標的前提下,卻很少見一個自然、適合編寫商務邏輯的開發平台,以 JavaScript 為開發語言的 NodeJS 正好符合這一需求,一種符合大多數人需求的 DSL(估計 js 玩家數量可觀得可以……)。例如,一個簡單的計數器設計,我登入某個 url,就觸發一個計數器的事件,十分自然。當然,更重要的是,還是 JS 的語言特徵,即 Function、閉包、相似的 C 文法、精鍊與簡潔的風格等等,尤其 Function,簡直為事件模型而生,輕鬆吻合 node.js 非同步機制的理念,才是真正吸引玩家去樂此不疲的原因。
儘管 NodeJS 現在還非常的年輕,也沒有久經世故,不過值得可喜的是,現在湧現了一大批圍繞 NodeJS 的外掛程式、增強包,有的是連結資料庫,有的是用於 logging、Template模板、單元測試,有的還是服務於長連結下(long polling)輪詢的……等等。我們可以參見 NodeJS 具體的模組列表,在http://wiki.github.com/ry/node/modules。
分享一個 Node.js 的專題網站,適合初學者:
http://howtonode.org/
nodejs與websocket的資源:
http://blog.new-bamboo.co.uk/2009/12/7/real-time-online-activity-monitor-example-with-node-js-and-websocket
http://blog.johngoulah.com/2010/03/nodejs-websockets-and-the-twitter-gardenhose/http://blog.andregoncalves.com/2009/12/29/Nodejs-twitter-streaming-with-html5-websockets.html
寫node.js的外掛程式(C++)
https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/
在win平台上跑node.js,藉助虛擬機器:
http://www.lazycoder.com/weblog/2010/03/18/getting-started-with-node-js-on-windows/
在win直接啟動並執行可執行檔(已編譯):
http://www.grati.org/?page_id=213 不錯的node.js中文資源
學習NodeJS第一天:node.js引言