從我大一接觸第一門編程語言C開始,到現在工作三年陸續接觸到了C、匯編、C++、C#、Java、JavaScript、PHP,還有一些HTML、CSS神馬的,從來沒有一門語言讓我像對node.js一樣的着迷。接觸nodejs在我之前博客提到過在搞web socket在選擇服務器的時候很多人推薦nodejs版的,無奈當時對nodejs沒有任何概念,所以沒看懂人家寫的代碼,但是感覺很熟悉,網上基本是以在服務器端運行的javascript來解釋什么是nodejs,這就讓我更疑惑了,javascript怎么可能做socket服務器,在用C#寫出服務器后回頭看了一下node.js,十分鍾之后我就被完全吸引住了。
補記:由於寫博客是對nodejs處於了解語法階段,很多問題沒有說清楚,點反對的人不少,關於一些原理性東西可以看看關於node.js的誤會
什么是node.js
到底什么是node.js呢?看看官網對nodejs的描述:
Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
我們可以對此總結出幾點
- node.js是一個構建在Chrome JavaScript運行環境的平台,這是很重要的一點,node.js並不是一門語言,而是一個平台
- node.js致力於使構建速度快、穩定的網絡程序更簡單
- node.js具有事件驅動和非阻塞I/O的特色,使之輕量級並且高效率
- node.js非常適合在分布式設備運行數據密集型實時應用程序
服務器端運行的JavaScript?
Chrome JavaScript runtime也就是我們常說的 Chrome的V8 JavaScript Engine,也就是Goole開發的一個用於Chrome瀏覽器的底層JavaScript引擎,用於解析JavaScript語句創建其運行環境,保證我們寫的語句在瀏覽器上的表現和我們預期的一致。
那么為什么說node.js是服務器端運行的JavaScript?好好地nodejs干嘛要和V8扯上關系?除了Google搞的V8解釋JavaScript十分的快,十分重要的一個原因是V8 JavaScript 引擎並不僅限於在瀏覽器中運行,可以嵌入任何應用程序中運行。Node.js 和.net framework類似是一個平台(這里有些搞不明白,望大神們指點一二),但它沒有像.net一樣創造了一門語言——C#在這個平台上運行,而是很巧妙的借用了web開發人員已經非常熟悉的JavaScript語法,使用V8引擎來解析語句,並將其重建可在服務器上使用。所以嚴格上說node.js並不是服務器端運行的Javascript,而是可以在服務器端運行JavaScript語法的平台。
為什么要用node.js
搞了半天就是一個新瓶裝舊酒的東西,看起來除了一個新鮮的可以使用JavaScript語法,node.js沒什么長處,為什么要用它而不是同樣可以在服務器端運行的Java或C#呢?這要從node.js事件驅動和非阻塞I/O的特色談起。關於事件驅動熟悉JavaScript的同學應該很熟悉了,node.js采用一系列“非阻塞”庫來支持事件循環的方式。本質上就是為文件系統、數據庫之類的資源提供接口,比如一個數據庫訪問,采用事件機制,發起請求之后,立即將進程交出,當數據返回后觸發事件,再繼續處理數據。
在傳統的阻塞I/O中其運行過程是這樣的
int num=query('select * from ......'); print(num);
...................//無關語句
print方法必須等待query方法返回結果,如果數據庫出現網絡連接故障,那么print方法就要等到超時才能執行,然后后面一些無關語句才能一次執行,而在非阻塞I/O中是這樣的
query('select * from...',callback(data){ .............//相關語句 print(); }); ..............//無關語句
跟我們使用ajax,在回調函數中處理結果,但是不影響下面語句執行。 怪不得node.js要借用JavaScript來做此事,JavaScript的幾個特性使它很勝任這項工作
- 事件機制
- 函數式編程,支持匿名函數,函數參數
如何安裝
nodejs的安裝還是很簡單的,尤其是現在安裝包都把npm集成了進去,不用單獨安裝了,下載下安裝包運行就可以了,另外想完整使用nodejs的話需要有C語言的編譯環境、git和python,使用window的同學很能會稍微麻煩一些,需要搞定這些。對命令行情有獨鍾的同學可以看看How to Install Node.js
npm是什么
npm是node packaged modules的縮寫,其實是一個nodejs的module的管理工具
什么是module
所謂module和java中的包的概念很類似,一些解決方案的集合,官方會提供核心的幾個,第三方的很多
如何安裝第三方module
因為nodejs的社區很活躍,有很多好用的第三方的包,我們可以在終端中使用npm的命令安裝
- npm install [-g] <name>:使用install指令可以把nodule下載安裝的nodejs的全局的path處,不加的話會安裝到當前路徑
- npm remove <name>:移除module
- npm update <name>:更新 module
還有一些常用命令可以看看npm常用命令
第一個demo
這些都搞定后我們就可以寫傳說中的hello world了。在任意目錄建一個test.js文件
console.log('Hello, World!');
簡單的一句話就可以,然后使用node命令運行

這這這。。。太沒技術含量了,看看官方給的demo,使用nodejs創建一個web server有多簡單
var http=require('http');//引入http module 2 http.createServer(function(request,response){//創建一個web server 3 //回調函數,這樣創建server方法就不會阻塞了 4 response.writeHead(200,{'contentType':'text/plain'}); 5 response.end('Hello World!\n'); 6 }).listen(8124); 7 console.log('Server running at http://127.0.0.1:8124/');
先運行一下服務器,按兩次Ctrl+C退出

使用瀏覽器訪問一下

就這么簡單
如何學習
看到上面的demo是不是也對nodejs產生興趣了呢,可是像我這樣的懶人接觸一門新語言的時候不知道該如何下手,難道又要去做個無聊的購物車神馬的嘛,學習nodejs不用,nodejs為我們提供了一個小游戲一樣的教程,就像個尋寶過程從零開始,沒步都有一個任務和一下提示讓你走的更遠,上nodeschool下載然后開始尋寶吧,我就是被這小游戲迷住了,順便秀一下我一天的戰績,每個任務都完成了

看看解釋就知道怎么做了,不過建議最開始run和verify結合使用,verify告訴你執行結果和預期結果,run會告訴你有哪些錯誤
當然除了這些小游戲幫我們熟悉nodejs語法及使用,一些優秀的社區也可以幫我們很多
