node.js學習

1.什麼是node.js:前端

  Node.js從2009年誕生至今,已經發展了4年有餘,其成長的速度有目共睹,Node.js的前景得到了技術社區的確定。InfoQ一直在關注Node.js的發展,在近來幾年的Qcon大會(北京站和杭州站)都有專門的講座。爲了更好地促進Node.js在國內的技術推廣,咱們決定開設「深刻淺出Node.js」專欄,邀請來自Node.js領域的佈道師、開發人員、技術專家來說述Node.js的各方面內容,讓讀者對Node.js有更深刻的瞭解,而且可以積極投入到新技術的討論和實踐中。
2.Node.js不是JS應用,而是JS運行平臺
  Node.js不是js應用,而是js運行平臺。Node.js採用C++語言編寫而成,是一個JavaScript的運行環境。之因此採用C++語言的緣由是:據Node.js創始人 Ryan Dahl回憶,最初他但願採用Ruby來寫Node.js,可是後來發現Ruby虛擬機的性能不能知足他的要求,後來他嘗試採用V8引擎,因此選擇了C++語言。既然不是JavaScript應用,爲什麼要叫.js呢?由於Node.js是一個JavaScript的運行環境。提到JavaScript,首先想到的是平常使用的瀏覽器,現代瀏覽器包含了各類組件,包括渲染引擎,JavaScript引擎等,其中 JavaScript引擎負責解釋執行網頁中的JavaScript代碼。做爲web前端最重要的語言之一,JavaScript一直是前端工程師的專利。不過,Node.js是一個後端的Javascript運行環境(支持的系統包括*nux,Windows),這意外着你能夠編寫系統級或者服務器端JavaScript代碼,交給Node.js來解釋執行,簡單的命令相似於:
#node  helloworld.js
  Node.js採用了Google Chrome瀏覽器的V8引擎,性能很好,同時還提供了不少系統級API,如文件操做,網絡編程等。瀏覽器端的JavaScript代碼在運行時會受到各類安全性的限制,對客戶系統的操做有限。相比之下,Node.js則是一個全面的後臺運行時,爲JavaScript提供了其餘語言可以實現的許多功能。
3.Node.js採用事件驅動,異步編程,爲網絡服務而設計
  事件驅動這個詞並不陌生,在某些傳統語言的網絡編程中,咱們會用到回調函數,好比當socket資源達到某種狀態時,註冊的回調函數就會執行。Node.js的設計思想中以事件驅動爲核心,它提供的絕大多數API都是基於事件的,異步的風格。以net模塊爲例,其中的net.Socket對象就有如下事件:connect,data,end,timeout,drain,error,close等,使用Node.js的開發人員須要根據本身的業務邏輯註冊相應的回調函數。這些回調函數都是異步執行的,這意外着雖然在代碼結構中,這些函數看似是依次註冊的,可是它們並不依賴於自身出現的順序,而是等待相應的事件觸發。事件驅動,異步編程的設計,重要的優點在於,充分利用了系統資源,執行代碼無需阻塞等待某種操做完成,有限的資源能夠用於其餘的任務。此類設計很是適合於後端的網絡服務編程,Node.js的目標也在於此。在服務器開發中,併發的請求處理是個大問題,阻塞式的函數會致使資源浪費和時間延遲。經過事件註冊,異步函數,開發人員能夠提升資源的利用率,性能也會改善。
  從Node.js提供的支持模塊中,咱們能夠看到包括文件操做在內的許多函數都是異步執行的,這和傳統語言存在區別,並且爲了方便服務器開發,Node.js的網絡模塊特別多,包括HTTP,DNS,NET,UDP,HTTPS,TLS等,開發人員能夠在此基礎上快速構建web服務器。以簡單的helloworld.js爲例:
var http = require('http');
http.createServer(function  (req, res))  {
      res.writehead(200,  {'Content-Type': 'text/plain'});
      res.end('hello world\n');
}).listen(80, "127.0.0.1");

上面的代碼搭建了一個簡單的http服務器(運行示例部署在http://helloworld.cnodejs.net/中),在本地監聽80端口,對於任意的http請求,服務器都返回一個頭部狀態碼爲200,Content-Type值爲text/plain的hello world文字響應。從這個小例子中,咱們能夠看出幾點:node

  Node.js的網絡編程比較便利,提供的模塊(在這裏是http)開放了容易上手的API接口,短短几行代碼就能夠構建服務器。python

  體現了事件驅動,異步編程,在createServer函數的參數中指定了一個回調函數(採用JavaScript的匿名函數實現),當有http請求發送過來時,Node.js就會調用該回調函數來處理請求並響應。固然,這個例子相對簡單,沒有太多的事件註冊,在之後的文章中讀者會看到更多的實際例子。git

4.Node.js的特色github

  下面咱們來講說Node.js的特色。事件驅動,異步編程的特色剛纔已經詳細說過了,這裏再也不重複。Node.js的性能不錯。按照創始人Ryan Dahl的說法,性能是Node.js考慮的重要因素,選擇C++和V8而不是Ruby或者其餘的虛擬機也是基於性能的目的。Node.js在設計上也是比較大膽,它以單進程,單線程模式運行(很吃驚,對吧?這和JavaScript的運行方式一致),事件驅動機制是Node.js經過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源佔用和上下文切換,這意外着面對大規模的http請求,Node.js憑藉事件驅動搞定一切,習慣了傳統語言的網絡服務開發人員可能對多線程併發和協做很是熟悉,可是面對Node.js,咱們須要接受和理解它的特色。由此咱們是否能夠推測出這樣的設計會致使負載的壓力集中在CPU(事件循環處理?)而不是內存(還記得Java虛擬機拋出OutOfMemory異常的日子嗎?),眼見爲實,不如來看看淘寶共享數據平臺團隊對Node.js的性能測試web

物理機配置 :RHEL5.2,CPU2.2GHZ,內存4Gnpm

Node.js應用場:MemCache代理,每次取100字節數據編程

鏈接池大小:50後端

併發用戶數:100瀏覽器

測試結果(socket模式):內存(30M),QPS(16700),CPU(95%)

從上面的結果,咱們能夠看到在這樣的測試場景下,qps可以達到16700次,內存僅佔用30M(其中V8堆佔用22M),CPU則達到95%,可能成爲瓶頸。此外,還有很多實踐者對Node.js作了性能分析,總的來講,它的性能讓人信服,也是受歡迎的重要緣由。既然Node.js採用單進程,單線程模式,那麼在現在多核硬件流行的環境中,單核性能出色的Node.js如何利用多核CPU呢?創始人Ryan Dahl建議,運行多個Node.js進程,利用某些通訊機制來協調各項任務。目前,已經有很多第三方的Node.js多進程支持模塊發佈,後面會詳細講述Node.js在多核CPU下的編程。

Node.js的另外一個特色是它支持的編程語言是JavaScript。關於動態語言和靜態語言的優缺點比較在這裏不在展開討論。只說三點:

1.JavaScript做爲前端工程師的主力語言,在技術社區中有至關的號召力。並且,隨着web技術的不斷髮展,特別是前端的重要性增長,很多前端工程師開始試水「後臺應用」,在許多采用Node.js的企業中,工程師都表示由於習慣了JavaScript,因此選擇Node.js。

2.JavaScript的匿名函數和閉包特性很是適合事件驅動,異步編程,從helloworld例子中咱們能夠看到回調函數採用了匿名函數的形式來實現。很方便。閉包的做用則更大,看下面的代碼示例:

var hostRequest = http.request(requestOptions,function(response)   {
    var responseHTML = ' ';
    response.on('data', function  (chunk)    {
           responseHTML = responseHTML + chunk;
    });
    response.on('end',function() {
            console.log(responseHTML);
            //    do something   useful
    });
});
 
  

 

 
 

在上面的代碼中,咱們須要在end事件中處理responseHTML變量,因爲JavaScript的閉包特性,咱們能夠在兩個回調函數以外定義responseHTML變量,而後在data事件對應的回調函數中不斷修改其值,並最終在end事件中訪問處理。

3.JavaScript在動態語言中性能較好,有開發人員對JavaScript,python,Ruby等動態語言作了性能分析,發現JavaScript的性能要好於其餘語言,再加上V8引擎也是同類的佼佼者,因此Node.js的性能也受益其中。

5.Node.js發展簡史

2009年2月,Ryan Dahl在博客上宣佈準備基於V8建立一個輕量級的web服務器並提供一套庫。

2009年5月,Ryan Dahl在GitHub上發佈了最第一版本的部分Node.js包,隨後幾個月裏,有人開始使用Node.js開發應用。

2009年11月和2010年4月,兩屆JSConf大會都安排了Node.js的講座。

2010年年末,Node.js得到雲計算服務商Joyent資助,創始人Ryan Dahl加入Joyent全職負責Node.js的發展。

2011年7月,Node.js在微軟的支持下發布Windows版本。

6.Node.js&NPM的安裝與配置

Node.js安裝與配置

  Node.js已經誕生兩年有餘,因爲一直處於快速開發中,過去一些安裝配置介紹多數針對0.4x版本而言的,並不是適合最新的0.6.X的版本狀況了,對此,咱們將在0.6.x的版本上介紹Node.js的安裝與配置。(本文一概以0.6.1爲例,0.6的其他版本,只需替換版本號便可。從http://nodejs.org/#download能夠查看到最新的二進制版本和源代碼)。

Windows平臺下的Node.js安裝

  在過去,Node.js一直不支持在Windows平臺下原生編譯,須要藉助Cygwin或MinGW來模擬POSIX系統,才能編譯安裝。幸運的是2011年6月微軟開始與Joyent合做移植Node.js到Windows平臺上(http://www.infoq.com/cn/news/2011/06/node-exe),此次合做的成果最終呈如今0.6.x的穩定版的發佈上。此次的版本發佈使得Node.js在Windows平臺上的性能大幅度的提升,使用方面也更容易和輕巧,徹底擺脫掉Cygwin或MinGW等實驗室式的環境,而且在某些細節方面,表現出比Linux下更高的性能,細節參見http://www.infoq.com/news/2011/11/Nodejs-Windows.

  在Windows(Windows7)平臺下,介紹安裝Node.js的方法,即普通和文藝安裝方法。

普通的安裝方法

  普通安裝的方法其實就是最簡單的方法了,對於大多數Windows用戶而言,都是不太喜歡折騰的人,你能夠從這裏(http://nodejs.org/dist/v0.6.1/node-v0.6.1.msi)直接下載到Node.js編譯好的msi文件。而後雙擊便可在程序的引導下完成安裝。

在命令行中直接運行:

node   -v

命令行將打印出:

v0.6.1

該引導步驟會將node.exe文件安裝到C:\Program  Files (x86)\nodejs\目錄下,並將該目錄添加進PATH環境變量。

文藝的安裝方法

  在WIndows平臺下的文藝安裝方法主要提供給那些熱愛折騰,喜歡變異的同窗們。在編譯源碼以前須要注意的是你的Windows系統是否包含編譯源碼的工具。Node.js的源碼主要由C++代碼和JavaScript代碼構成,可是卻用gyp工具(http://code.google.com/p/gyp/)來作源碼的項目管理,該工具採用Python語言寫成的。在Windows平臺上,Node.js採用gyp來生成Visual  Studio  Solution文件,最終經過VC++的編譯器將其編譯爲二進制文件。因此,你須要知足如下兩個條件:

1.Python (Node.js建議使用2.6或更高版本,不推薦3.0),能夠從這裏(http://python.org/)獲取。

2.VC++編譯器,包含在Visual  Studio  2010中(VC++2010  Express 亦可),VS2010能夠從這裏(http://msdn.microsoft.com/en-us/vstudio/hh388567)找到。

下載Node.js的0.6.1版本的源碼壓縮包 (http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz)並解壓之。

經過命令進入解壓的源碼目錄,執行vcbuild.bat  release命令,而後經歷了漫長的等待後,編譯完成,在Release目錄下能夠找到編譯好的node.exe文件。經過命令行執行node -v。

命令行返回結果爲:

v0.6.1

事實上,若是你的編譯環境中存在WIX工具集(http://wix.sourceforge.net/,執行vcbuild.bat  msi release命令,你將會在Relase目錄下找到node.msi。

是的,咱們回到了一開始的普通安裝方法。所謂文藝就是多走一些路,多看一些風景罷了。

7.安裝NPM

 NPM的全稱是Node  Package  Manager,若是你熟悉ruby的gem,python的PyPL,setuptools,PHP的pear,那麼你就知道NPM的做用是什麼了。沒錯,他就是Nodejs的包管理器。Nodejs自身提供了基本的模塊。可是在這些基本模塊上開發實際應用須要較多的工做。所幸的是筆者執筆此文的時候NPM上已經有了5112個Nodejs庫或框架,這些庫從各個方面能夠幫助Nodejs的開發者完成較爲複雜的應用。這些庫的數量和活躍也從側面反映出Nodejs社區的發展是十分神速和活躍的。下面我將介紹安裝NPM和經過NPM安裝Nodejs的第三方庫,以及在大陸的網絡環境下,如何更好的利用NPM.

Windows下安裝NPM

  因爲Nodejs最初在Linux開發下的歷史緣由,致使NPM一開始也不支持Windows環境,可是隨着Nodejs成功移植到WIndows平臺,NPM在Windows下的需求亦是日漸增長。下面開始WIndows下的NPM之旅吧。

安裝Git工具

因爲GitHub網站不支持直接在線下載打包了全部submodule的源碼包,因此須要經過git工具來簽出全部的源碼。

http://code.google.com/p/msysgit/downloads/list,能夠下載到msysgit這個WIndows平臺下的git客戶端工具(最新版本文件爲Git-1.7.7.1-preview20111027.exe),在下載以後雙擊安裝。

下載NPM源碼

打開命令行工具(CMD),執行如下命令,能夠經過msysgit簽出NPM的全部源碼和依賴代碼並安裝npm。

git  clone  --recursive  git://github.com/isaacs/npm.git
cd   npm
node   cli.js install   npm   -gf

在執行這段代碼以前,請確保node.exe是跟經過node.msi的方式安裝的,或者在PATH環境變量中。這段命令也會將npm加入到PATH環境變量中去,以後能夠隨處執行npm命令。若是安裝中遇到權限方面的錯誤,請確保cmd命令行工具是經過管理員身份運行的。安裝成功後,執行如下命令:

npm   install   underscore

返回:

underscore@1.2.2     ./node_modules/underscore

如此,Windows平臺下的NPM安裝完畢。若是遭遇網絡問題沒法安裝,請參照Linux下的NPM命令,添加鏡像地址。

8.深刻Node.js的模塊機制

相關文章
相關標籤/搜索