本節書摘來自異步社群《node學習指南》一書中的第1章,第1.1節,作者【美】shelley powers,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
node學習指南
node.js是以google v8 javascript引擎為基礎的伺服器端技術。它具有很好的可擴充性,并使用了異步事件驅動io,而沒有使用線程或者獨立程序。它能很好地滿足那些需要頻繁通路但是計算簡單的網絡應用的需求。
使用傳統的web伺服器時,比如apache,每次接收到使用者對網絡資源的請求時,apache都會建立一個線程或者調用新的程序來處理。盡管apache對請求的響應速度非常快,并在請求處理完畢後清理現場,但這種實作仍然占用了很多資源。通路頻繁的網絡應用會是以産生嚴重的性能問題。
相較而言,node不會為每個請求建立新的程序或者線程。相反,它對特定事件進行監聽,當事件發生時按需做出響應。在等待事件的過程中node并不阻止任何請求,并且事件循環是按照先到先得的簡單方式進行處理。
與編寫用戶端應用程式所使用的語言一樣,node應用程式也是用javescript編寫的(或者其他可以編譯成javescript的語言)。不過與前者不同的是,做node應用程式開發前,首先需要搭建開發環境。
node支援unix/linux、maxos以及windows等多種作業系統。本章會告訴你在安裝node之前需要完成的準備工作,并帶領你學習如何在windows7和linux(ubuntu)系統上搭建node開發環境。mac系統的安裝過程與linux類似。
當搭建好開發環境後,我們會通過一個簡單的node示例應用,來說明node中最重要的事件循環機制。
安裝node有多種方法。選擇什麼樣的方法取決于你目前使用的開發環境,以及你希望如何使用源代碼或者計劃如何在你現有的應用程式中使用node。
windows和mac os都有相應的安裝包,但是你也可以複制node源代碼并自行編譯安裝。在windows、linux和mac os環境中,你也可以使用git的clone指令來複制node的repo(repository,代碼庫)。
本節示範如何在linux系統中(ubuntu 10.04 vps,或者虛拟伺服器)通過編譯源碼搭建node環境,同時也會示範如何在windosw7系統上安裝node,以便配合microsoft webmatrix使用。
提示:
在linux下安裝node之前,你需要先做一些準備工作。按照wiki node詞條中提到的步驟首先要确認是否安裝python,如果計劃使用ssl/tls(secure sockets layer,安全套接層/transport layer security,傳輸層安全)還需要安裝libssl-dev。某些linux系統中預設安裝了python。如果沒有,則可以使用系統包安裝工具安裝python的穩定版本,如2.6或者2.7(node最新版本所要求的python版本号)。
本書假定你有javascript和傳統web開發的經驗。如果這樣的話,我可能是過于謹慎了,并且在描述如何安裝node的前期準備上太啰唆了。
對ubuntu和debian來說還需要安裝其他的庫。大部分debian gnu/linux系統中都支援apt(advanced packaging tool)工具,你可以用以下apt指令來确認是否已安裝了需要的庫:
update指令用于确認系統上的包都更新了,upgrade指令用于更新過期的包。第三條指令用于安裝需要的包。任何包依賴都由包管理工具管理。
當準備好環境後,下載下傳node tarball(源代碼的壓縮檔案)。本書使用wget,你也可以使用curl。在編寫本書的時候node的最新版本是0.8.2:
下載下傳完成後,解壓:
得到目錄node-v。進入該目錄,使用以下指令編譯安裝node:
考慮到某些讀者之前沒在unix中使用過make指令,同此,對這三條指令簡單說明一下:第一條指令首先進行依賴檢查,然後根據你的系統環境和安裝情況建立makefile,然後執行make指令編譯最後一條指令執行安裝操作。在這些指令執行後,node即安裝完畢并可以通過指令行全局通路。
程式設計的挑戰在于沒有兩個系統是一樣的。在大部分linux環境下這一系列安裝步驟應該是能工作且可以成功的。但是,關鍵詞是“應該”。
是否注意到最後一條指令的sudo?這是為了以root權限在linux中安裝node。不過,你還可以用以下指令在指定的下級目錄中安裝node:
可以看到,通過設定prefix配置選項,你可以将node安裝到本地指定路徑的目錄中。另外别忘記你可能還需要相應地為path環境變量做些更新。
如果使用sudo,你需要root或者超級使用者的權限。此時你的使用者名必須存在于/ect/sudoers檔案的清單中。
盡管可以将node安裝到本地路徑,但是如果考慮到我們所有的安裝步驟都是在一個共享的主機環境下進行的,是否能采用這種安裝方式還需三思。因為安裝node隻是第一步,接下來你還需要權限來編譯node應用程式,需要權限來讓程式運作在特定端口(比如80)。事實上絕大多數共享主機環境并不會允許我們在本地路徑下随意安裝特定版本的node。
除非有特殊原因,依然推薦使用sudo安裝node。
在本書第4章我們會提到,使用root權限運作node 包管理工具(npm)曾經存在的一個安全顧慮。但是,目前這些安全問題已經解決。
你可以按照之前wiki頁面中的安裝步驟完成windows系統下node的安裝。但一般來說,node隻是作為windows web開發架構的一部分。
目前有兩種windows web開發架構适合使用node。一種叫做windows azure雲平台,允許開發人員将程式托管在遠端伺服器(稱為雲)上。microsoft提供了關于如何在windows azure sdk中安裝node的說明,是以本章不涉及這一過程(不過稍後會對該sdk進行說明)。
另一種在windows系統(本處指windows 7)使用node的方式是将node與microsoft webmatrix內建。webmatrix是網絡開發人員用于內建開源技術的一種工具。以下是在windows 7 webmatrix中內建并運作node的步驟:
1.安裝webmatrix;
2.使用最新的windows安裝包安裝node;
3.安裝iisnode for iis express 7.x,以便讓windows上的iis支援node應用程式;
4.為webmatrix安裝node模闆,使用模闆可以簡化node開發。
如圖1-1所示,使用microsoft web platform installer安裝webmatrix,同時會安裝iis express。iis express是microsoft web伺服器的開發版本。

iisnode有x86和x64兩種,但是對于x64系統,兩個都需要安裝。
如果你還想安裝iisnode的附帶的示例代碼,則需要以管理者權限打開指令視窗,進入到iisnode的安裝目錄中(“program files__for 64- bit”或者“program files (x86)”)然後運作名為setupsamples.bat的批處理檔案。
你可以通過如下步驟來測試以上工作的正确性,首先運作webmatrix,在打開頁面中選擇“site from template”選項。然後,圖1-4所示頁面會打開,你可以看到兩個node模闆選項:一個是“express”(在第7章介紹),另一個是“a basic, empty site configured for node”。選擇後者,并使用“first node site”或者一個你喜歡的名稱為建立的站點命名。
使用webmatrix生成的新站點如圖1-5所示。點選頁面左上角的run按鈕,浏覽器視窗會彈出并顯示包含有“hello, world!”資訊的頁面。
如果你在使用windows防火牆,第一次運作一個node應用程式時,你可能會得到一個如圖1-6所示的警告資訊。這時,你需要點選“private networks”選項然後按下“allow access”按鈕,以便讓防火牆知道該程式是被允許在開發機器的私有網絡上通信的。
在新生成的webmatrix node工程中,存在一個名為app.js的檔案。這是一個node程式檔案,包含了如下代碼:
我會在本章第二部分對這段代碼的相關部分進行詳細介紹。目前,我們隻需要知道這段代碼實作了一個簡單的服務端,它隻給用戶端傳回“hello, world!”。而且我們可以在任何安裝有node環境的系統中運作這段代碼,并且能得到同樣的功能。
若需要在webmatrix中檢視iisnode的示例,則需要在webmatrix中選擇選項“site from folder”,然後在彈出的對話框中輸入如下内容:%localappdata%iisnodewww。
偶數版本号代表了node的穩定發行版本,例如目前的0.8.x版本,而奇數版本号表示node的開發版本(目前是0.9.x)。在你有一些node使用經驗前,我建議選擇穩定發行版本。
更新node版本并不複雜。如果你使用安裝包來做更新,那麼舊版本的node将自動被新版本覆寫。如果你直接使用源代碼更新,為了避免潛在的混亂或者檔案沖突,你始終應該先在舊版源代碼目錄中執行解除安裝指令,然後再安裝新版本。在node源代碼目錄中,可以運作如下make指令執行解除安裝:
下載下傳新的源代碼,編譯然後安裝它。當再有版本更新時,你需要再次執行以上過程。
更新node的挑戰在于,新版本的node是否還能相容特定的環境、子產品或者node應用程式。大多數情況下,你不會碰到版本問題。然而,如果你碰到了,你可以使用node版本管理器(nvm, node version manager)在多個node版本之間切換。
使用nvm安裝指定版本的node:
使用如下指令切換到指定node版本:
檢視可用的node版本資訊: