Node 是一個服務器端的JavaScript 解釋器,是構建快速響應、高度可擴展網絡應用的輕量高效的平臺。Node 使用事件驅動和非阻塞的I/O 模型,非常適合數據密集、對實時響應要求高的分布式應用。微軟、eBay、LinkedIn、雅虎等世界知名公司及網站均有使用Node 的成功案例。
《Node Web開發》是基于Node 開發Web 應用的實用指南,全書共分6 章,通過示例詳盡介紹了Node 的背景、原理及應用方法。全書內容涉及Node 簡介、Node 安裝、Node 模塊、實現不同版本的簡單應用、實現簡單的Web 服務器和EventEmitter,以及數據存儲和檢索。另外,本書涵蓋了Node 服務器端開發的主要挑戰及應對方案。
用Node平臺打造高性能Web應用 雅虎架構師精準解讀最炙手可熱的Web開發技術 從基礎到實踐,示例豐富
歡迎光臨Node(也叫Node.js)開發的世界。Node是一種新興的軟件開發平臺,它將JavaScript從Web瀏覽器移植到常規的服務器端。Node運行在Chrome的高速V8引擎上,并附帶了一個快速、健壯的異步網絡I/O組件庫。Node主要用于構建高性能、高可擴展的服務器和客戶端應用,以實現真正“實時的Web應用”。
在經過數年嘗試用Ruby和其他語言實現Web服務器組件之后,Ryan Dahl在2009年開發了Node平臺。這個探索使他從使用傳統的、基于線程的并發模型轉向使用事件驅動的異步系統,因為后者更簡單(多線程系統以難于開發著稱),系統開銷更低(與對每個連接維護一個線程相比),因而能提高相應的速度。Node旨在提供一個“創建可擴展網絡服務器的簡單方式”。這個設計受到了Event Machine(Ruby)和Twisted框架(Python)的影響,并和它們有些類似。
本書致力于講述如何用Node構建Web應用。我們會在書中介紹快速學習Node時一些必需的重要概念。本書會教你編寫真正的應用,剖析其工作原理,并討論如何在程序中應用這些理念。我們需要安裝Node和npm,學習安裝和開發npm包及Node模塊。此外,我們還會開發一些應用,度量長時間運行的計算在Node的事件循環中的響應能力,介紹將高負載的工作分派到多個服務器的方法,并介紹Express框架。
本書內容
第1章“Node入門”,介紹了Node平臺。這一章講述了Node的用途、技術構架上的選擇、Node的歷史和服務器端JavaScript的歷史,然后介紹為什么JavaScript仍將受困于瀏覽器。
第2章“安裝并配置Node”,介紹如何配置Node開發環境,包括多種從源碼編譯和安裝的場景,還會簡單介紹在開發環境中如何部署Node。
第3章“Node模塊”,解釋了作為開發Node應用基本單位的模塊。我們會全面介紹并開發Node模塊。然后進一步介紹Node包管理器npm,給出一些使用npm管理已安裝包的例子,還將涉及開發npm包并將其發布出來供他人使用。
第4章“幾種典型的簡單應用”,在讀者已經有一些Node基礎知識后,開始探索Node應用的開發。我們會分別使用Node、Connect中間件框架和Express應用框架開發一個簡單的應用。雖然應用比較簡單,但是我們可以通過其開發探索Node的事件循環,處理長時間的運算,了解異步和同步算法以及如何將繁重的計算交給后臺服務器。
第5章“簡單的Web服務器、EventEmitter和HTTP客戶端”,介紹了Node里的HTTP客戶端和服務器對象。我們會在開發HTTP服務器和客戶端應用的同時全面深入介紹HTTP會話。
第6章“存取數據”,探討大部分應用都需要的長期可靠的數據存儲機制。我們會用SQL和MongoDB數據庫引擎實現一個應用。在此期間,我們將用Express框架實現用戶驗證,更好地展示出錯頁面。
閱讀要求
目前,我們一般會采用源碼的方式安裝Node,這種方式可以很好地用在類Unix和符合POSIX標準的系統上。當然,在接觸Node之前,謙遜的心態是必需的,但最為重要的事情還是讓大腦供血充足。
從源碼安裝的方式需要一個類Unix或類POSIX系統(比如Linux、Mac、FreeBSD、OpenSolaris等)、新的C/C++編譯器、OpenSSL庫和Python 2.4或更新版本。
Node程序可以用任何文本編輯器來寫,不過一個能處理JavaScript、HTML、CSS等的文本編輯器會更有幫助。
盡管本書介紹的是Web應用開發,但你并不需要擁有一個Web服務器。Node有自己的Web服務器套件。
讀者對象
本書寫給所有想在一個新的軟件平臺上開拓新編程模式的軟件工程師。
服務器端程序員或許能看到一些新奇的概念,對Web應用開發產生新的理解。JavaScript是一門強大的語言,Node的異步特性發揮了JavaScript的優勢。
瀏覽器端JavaScript“攻城師”或許會覺得在Node中使用JavaScript和編寫與DOM操作無關的JavaScript代碼很有趣。(Node平臺上沒有瀏覽器,所以也沒有DOM,除非你安裝JSDom。)
雖然本書各章內容由淺入深,循序漸進,但到底如何閱讀本書悉聽尊便。
本書需要讀者知道如何編寫軟件,并且對JavaScript等編程語言有所了解。
排版約定
在本書中,讀者會發現不同的文本樣式。下面是這些樣式的示例和說明。
正文中的代碼使用特殊字體:“http對象封裝HTTP協議,它的http.createServer方法會創建一個完整的Web服務器,而.listen方法用于監聽特定的端口。”
代碼塊是這樣的:
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(8124, ““127.0.0.1”“);
console.log(‘Server running at http://127.0.0.1:8124/’);
代碼塊中會加粗突出顯示代碼,這表示需要讀者格外注意:
var util = require(‘util’);
var A = ““a different value A”“;
var B = ““a different value B”“;
var m1 = require(‘./module1’);
util.log(‘A=’+A+‘ B=’+B+‘ values=’+util.inspect(m1.values()));
命令行的輸入輸出是這樣的:
$ sudo /usr/sbin/update-rc.d node defaults
新術語及重要詞匯都會加粗顯示。你將在屏幕上看到的文字,比如菜單或對話框中的文字,會這樣在正文中提到:“一個真正安全的系統至少會有用戶名和密碼輸入框。不過,我們這里就直接讓用戶單擊Login按鈕了。”
讀者反饋
我們始終歡迎來自讀者的反饋意見。我們想知道讀者對本書的看法,讀者喜歡哪些內容或不喜歡哪些內容。讀者真正深有感觸的反饋,對于我們開發圖書產品至關重要。
一般的反饋可以發郵件到feedback@packtpub.com,但請在郵件標題中注明相關書名。
如果有關于新書的建議,你可以登錄www.packtpub.com,填寫SUGGEST A TITLE表單或者向suggest@packtpub.com發送郵件。
如果你在某個領域積累了豐富的經驗,想寫一本書,或者愿意與人合著或審校某本書,請閱讀www.packtpub.com/authors上的作者指南。
讀者服務
現在你已是Packt引以為榮的讀者了,因此我們特別要交待幾件事,以保障你作為讀者的最大權益。
下載示例代碼
在www.packtpub.com通過自己的賬號購買圖書的讀者,可以下載所有已購買圖書的代碼 。如果這本書是你在其他地方購買的,訪問www.packtpub.com/support并注冊,我們將通過電子郵件將相關文件發送給你。
勘誤
雖然我們會全力確保本書內容的準確性,但錯誤仍在所難免。如果你發現了本書中的錯誤(包括文字和代碼錯誤),而且愿意向我們提交這些錯誤,我們會十分感激。這樣一來,不僅可以減少其他讀者的疑慮,也有助于本書后續版本的改進。要提交錯誤,請訪問www. packtpub.com/support,選擇相關圖書,單擊errata submission form鏈接,然后輸入勘誤信息。經過驗證后,你提交的勘誤信息就會添加到已有的勘誤列表中。要查看已有的勘誤信息,請訪問www.packtpub.com/support并選擇相關圖書。
反盜版聲明
網上各種形式的盜版是一直存在的問題。Packt非常重視版權和許可證的保護。如果你在網上遇到以任何形式非法復制的我方作品,請盡快告知我們相關的地址或網站名稱,以便我們采取補救措施。
請把郵件發送到copyright@packtpub.com,并在郵件里注明涉嫌侵權資料的鏈接。
感謝你幫助我們保護作者和我們為你帶來有價值內容的能力。
疑難解答
如果對本書的某些方面有疑問,請將電子郵件發送到questions@packtpub.com,我們會盡力解決。
David Herron,軟件開發人員和軟件質量工程師,在硅谷從業20多年,目前在雅虎擔任質量工程小組的架構師,管控公司基于Node開發的Web應用平臺的質量。
他曾為Sun公司主管工程師,并作為Java SE質量工程小組的架構師負責開發自動化測試工具(包括現在廣泛用于GUI自動測試軟件的AWT Robot類),期間參與了OpenJDK和JDK-Distros項目的啟動,舉辦了世界性的Mustang Regressions大賽,讓Java開發者社區尋找Java 1.6的bug。
任職Sun公司之前,他曾為VXtreme公司開發視頻流處理工具(Windows Media Player的前身),在Wollongong集團從事電子郵件客戶端和服務器軟件的開發,加入了互聯網工程任務組,負責改進與電子郵件相關的協議。
鄢學鵾,阿里云云手機開發者運營負責人,曾在網易做過UI設計師,在雅虎中國領導過前端團隊,在口碑網領導過UED團隊,還擔任D2前端技術論壇顧問。對Web標準、前端開發模式、性能優化和自動化有較深入的研究。目前專注于從Mobile到PC領域的設計、技術和業務間的結合,常用ID:秦歌、三七。其譯著有《JavaScript語言精粹》和《高性能網站建設進階指南:Web開發者性能優化最佳實踐》,個人博客是dancewithnet.com,Twitter賬號是@ kavenyan。
吳天豪,阿里云計算前端開發工程師,w3ctech杭州站負責人,w3ctech.com內容貢獻者,負責過口碑網產品線的開發、基于移動瀏覽器的Web App開發,致力于構建快速、高效、可訪問性高的Web應用。
廖健,阿里云資深前端開發工程師,有多年Flash平臺開發經驗,喜歡奔放的腳本語言,曾在D2論壇和HTML5研究小組線下沙龍做過技術分享,目前主要研究和實踐Web技術在移動平臺上的應用。
第1章 Node入門
1.1 Node能做什么
1.2 為什么要使用Node
1.2.1 架構問題:線程,還是異步事件驅動
1.2.2 性能和利用率
1.2.3 服務器利用率、成本和綠色Web托管服務
1.3 Node、Node.js還是Node .JS
1.4 小結
第2章 安裝并配置Node
2.1 系統要求
2.2 在符合POSIX標準的系統上安裝
2.3 在Mac OS X上安裝開發者工具
2.3.1 在home目錄下安裝
2.3.2 在系統級目錄下安裝Node
2.3.3 在Mac OS X上使用MacPorts安裝
2.3.4 在Mac OS X上使用homebrew安裝
2.3.5 在Linux上使用軟件包管理系統安裝
2.3.6 同時安裝并維護多個Node
2.4 驗證安裝成功與否
2.4.1 Node命令行工具
2.4.2 用Node運行簡單的腳本
2.4.3 用Node啟動服務器
2.5 安裝npm--Node包管理器
2.6 系統啟動時自動啟動Node服務器
2.7 小結
第3章 Node模塊
3.1 什么是模塊
3.1.1 Node模塊
3.1.2 Node解析require ('module')的方式
3.2 Node包管理器
3.2.1 npm包的格式
3.2.2 查找npm包
3.2.3 使用npm命令
3.2.4 Node包版本的標識和范圍
3.2.5 CommonJS模塊
3.3 小結
第4章 幾種典型的簡單應用
4.1 Math Wizard
4.2 不依賴框架的實現
4.2.1 路由請求
4.2.2 處理URL查詢參數
4.2.3 乘法運算
4.2.4 其他數學函數的執行
4.2.5 擴展Math Wizard
4.2.6 長時間運行的運算(斐波那契數)
4.2.7 還缺什么功能
4.2.8 使用Connect框架實現Math Wizard
4.2.9 安裝和設置Connect
4.2.10 使用Connect
4.3 使用Express框架實現Math Wizard
4.3.1 準備工作
4.3.2 處理錯誤
4.3.3 參數化的URL和數據服務
4.4 小結
第5章 簡單的Web服務器、EventEmitter和HTTP客戶端
5.1 通過EventEmitter發送和接收事件
5.2 HTTP Sniffer--監聽HTTP會話
5.3 基本的Web服務器
5.4 MIME類型和MIME npm包
5.5 處理cookie
5.6 虛擬主機和請求路由
5.7 發送HTTP客戶端請求
5.8 小結
第6章 存取數據
6.1 Node的數據存儲引擎
6.2 SQLite3--輕量級的進程內SQL引擎
6.2.1 安裝SQLite 3
6.2.2 用SQLite3實現便簽應用
6.2.3 在Node中使用其他SQL數據庫
6.3 Mongoose
6.3.1 安裝Mongoose
6.3.2 用Mongoose實現便簽應用
6.3.3 對MongoDB數據庫的其他支持
6.4 如何實現用戶驗證
6.5 小結