內容簡介
《深入淺齣Node.js》從不同的視角介紹瞭 Node 內在的特點和結構。由首章Node 介紹為索引,涉及Node 的各個方麵,主要內容包含模塊機製的揭示、異步I/O 實現原理的展現、異步編程的探討、內存控製的介紹、二進製數據Buffer 的細節、Node 中的網絡編程基礎、Node 中的Web 開發、進程間的消息傳遞、Node 測試以及通過Node 構建産品需要的注意事項。附錄介紹瞭Node 的安裝、調試、編碼規範和NPM 倉庫等事宜。
《深入淺齣Node.js》適閤想深入瞭解 Node 的人員閱讀。
作者簡介
樸靈,真名田永強,文藝型碼農,就職於阿裏巴巴數據平颱,工程師,Node.js布道者,寫瞭多篇文章介紹Node.js的細節。活躍於CNode社區,是綫下會議NodeParty的組織者和JSConf China(滬JS和京JS)的組織者之一。熱愛開源,多個Node.js模塊的作者。
內頁插圖
精彩書評
Node.js讓JavaScript在服務器端煥發生機,這是一本帶著文藝調調的好看的技術書,書中詳細闡述瞭Node.js的方方麵麵。如果你是前端工程師,這會是你邁嚮全端工程師的關鍵一步。
——玉伯,支付寶高級技術專傢
通過學習Node.js,你可以接觸到新的開發模式與協作思想。通過閱讀這本書,你可以在軟件開發領域獲得廣泛而又有深度的收獲!所以,我很推薦這本書!
——莊錶偉
從未讀過這麼讓人想一翻到底的Node.js技術讀物,看完 “內存控製”這一章後,重新寫代碼的時候,仿佛都能看到V8是如何進行垃圾迴收的。如果你還在糾結callback帶來的}}}}}}}嵌套問題,那麼推薦你閱讀“異步編程”這一章,保證讓你大開眼界。世界上本沒有嵌套迴調,寫的人多瞭,也便有瞭}}}}}}}。JavaScript已經不僅僅是在瀏覽器上運行的玩具語言, 它正在通過Node.js進軍所有領域。
閱讀本書,開啓你人生的Node節點吧。
——Python發燒友,阿裏巴巴數據平颱技術專傢
目錄
第1章 Node簡介
1.1 Node的誕生曆程
1.2 Node的命名與起源
1.2.1 為什麼是JavaScript
1.2.2 為什麼叫Node
1.3 Node給JavaScript帶來的意義
1.4 Node的特點
1.4.1 異步I/O
1.4.2 事件與迴調函數
1.4.3 單綫程
1.4.4 跨平颱
1.5 Node的應用場景
1.5.1 I/O密集型
1.5.2 是否不擅長CPU密集型業務
1.5.3 與遺留係統和平共處
1.5.4 分布式應用
1.6 Node的使用者
1.7 參考資源
第2章 模塊機製
2.1 CommonJS規範
2.1.1 CommonJS的齣發點
2.1.2 CommonJS的模塊規範
2.2 Node的模塊實現
2.2.1 優先從緩存加載
2.2.2 路徑分析和文件定位
2.2.3 模塊編譯
2.3 核心模塊
2.3.1 JavaScript核心模塊的編譯過程
2.3.2 C/C++核心模塊的編譯過程
2.3.3 核心模塊的引入流程
2.3.4 編寫核心模塊
2.4 C/C++擴展模塊
2.4.1 前提條件
2.4.2 C/C++擴展模塊的編寫
2.4.3 C/C++擴展模塊的編譯
2.4.4 C/C++擴展模塊的加載
2.5 模塊調用棧
2.6 包與NPM
2.6.1 包結構
2.6.2 包描述文件與NPM
2.6.3 NPM常用功能
2.6.4 局域NPM
2.6.5 NPM潛在問題
2.7 前後端共用模塊
2.7.1 模塊的側重點
2.7.2 AMD規範
2.7.3 CMD規範
2.7.4 兼容多種模塊規範
2.8 總結
2.9 參考資源
第3章 異步I/O
3.1 為什麼要異步I/O
3.1.1 用戶體驗
3.1.2 資源分配
3.2 異步I/O實現現狀
3.2.1 異步I/O與非阻塞I/O
3.2.2 理想的非阻塞異步I/O
3.2.3 現實的異步I/O
3.3 Node的異步I/O
3.3.1 事件循環
3.3.2 觀察者
3.3.3 請求對象
3.3.4 執行迴調
3.3.5 小結
3.4 非I/O的異步API
3.4.1 定時器
3.4.2 process.nextTick()
3.4.3 setImmediate()
3.5 事件驅動與高性能服務器
3.6 總結
3.7 參考資源
第4章 異步編程
4.1 函數式編程
4.1.1 高階函數
4.1.2 偏函數用法
4.2 異步編程的優勢與難點
4.2.1 優勢
4.2.2 難點
4.3 異步編程解決方案
4.3.1 事件發布/訂閱模式
4.3.2 Promise/Deferred模式
4.3.3 流程控製庫
4.4 異步並發控製
4.4.1 bagpipe的解決方案
4.4.2 async的解決方案
4.5 總結
4.6 參考資源
第5章 內存控製
5.1 V8的垃圾迴收機製與內存限製
5.1.1 Node與V8
5.1.2 V8的內存限製
5.1.3 V8的對象分配
5.1.4 V8的垃圾迴收機製
5.1.5 查看垃圾迴收日誌
5.2 高效使用內存
5.2.1 作用域
5.2.2 閉包
5.2.3 小結
5.3 內存指標
5.3.1 查看內存使用情況
5.3.2 堆外內存
5.3.3 小結
5.4 內存泄漏
5.4.1 慎將內存當做緩存
5.4.2 關注隊列狀態
5.5 內存泄漏排查
5.5.1 node-heapdump
5.5.2 node-memwatch
5.5.3 小結
5.6 大內存應用
5.7 總結
5.8 參考資源
第6章 理解Buffer
6.1 Buffer結構
6.1.1 模塊結構
6.1.2 Buffer對象
6.1.3 Buffer內存分配
6.2 Buffer的轉換
6.2.1 字符串轉Buffer
6.2.2 Buffer轉字符串
6.2.3 Buffer不支持的編碼類型
6.3 Buffer的拼接
6.3.1 亂碼是如何産生的
6.3.2 setEncoding()與string_decoder()
6.3.3 正確拼接Buffer
6.4 Buffer與性能
6.5 總結
6.6 參考資源
第7章 網絡編程
7.1 構建TCP服務
7.1.1 TCP
7.1.2 創建TCP服務器端
7.1.3 TCP服務的事件
7.2 構建UDP服務
7.2.1 創建UDP套接字
7.2.2 創建UDP服務器端
7.2.3 創建UDP客戶端
7.2.4 UDP套接字事件
7.3 構建HTTP服務
7.3.1 HTTP
7.3.2 http模塊
7.3.3 HTTP客戶端
7.4 構建WebSocket服務
7.4.1 WebSocket握手
7.4.2 WebSocket數據傳輸
7.4.3 小結
7.5 網絡服務與安全
7.5.1 TLS/SSL
7.5.2 TLS服務
7.5.3 HTTPS服務
7.6 總結
7.7 參考資源
第8章 構建Web應用
8.1 基礎功能
8.1.1 請求方法
8.1.2 路徑解析
8.1.3 查詢字符串
8.1.4 Cookie
8.1.5 Session
8.1.6 緩存
8.1.7 Basic認證
8.2 數據上傳
8.2.1 錶單數據
8.2.2 其他格式
8.2.3 附件上傳
8.2.4 數據上傳與安全
8.3 路由解析
8.3.1 文件路徑型
8.3.2 MVC
8.3.3 RESTful
8.4 中間件
8.4.1 異常處理
8.4.2 中間件與性能
8.4.3 小結
8.5 頁麵渲染
8.5.1 內容響應
8.5.2 視圖渲染
8.5.3 模闆
8.5.4 Bigpipe
8.6 總結
8.7 參考資源
第9章 玩轉進程
9.1 服務模型的變遷
9.1.1 石器時代:同步
9.1.2 青銅時代:復製進程
9.1.3 白銀時代:多綫程
9.1.4 黃金時代:事件驅動
9.2 多進程架構
9.2.1 創建子進程
9.2.2 進程間通信
9.2.3 句柄傳遞
9.2.4 小結
9.3 集群穩定之路
9.3.1 進程事件
9.3.2 自動重啓
9.3.3 負載均衡
9.3.4 狀態共享
9.4 Cluster模塊
9.4.1 Cluster工作原理
9.4.2 Cluster事件
9.5 總結
9.6 參考資源
第10章 測試
10.1 單元測試
10.1.1 單元測試的意義
10.1.2 單元測試介紹
10.1.3 工程化與自動化
10.1.4 小結
10.2 性能測試
10.2.1 基準測試
10.2.2 壓力測試
10.2.3 基準測試驅動開發
10.2.4 測試數據與業務數據的轉換
10.3 總結
10.4 參考資源
第11章 産品化
11.1 項目工程化
11.1.1 目錄結構
11.1.2 構建工具
11.1.3 編碼規範
11.1.4 代碼審查
11.2 部署流程
11.2.1 部署環境
11.2.2 部署操作
11.3 性能
11.3.1 動靜分離
11.3.2 啓用緩存
11.3.3 多進程架構
11.3.4 讀寫分離
11.4 日誌
11.4.1 訪問日誌
11.4.2 異常日誌
11.4.3 日誌與數據庫
11.4.4 分割日誌
11.4.5 小結
11.5 監控報警
11.5.1 監控
11.5.2 報警的實現
11.5.3 監控係統的穩定性
11.6 穩定性
11.7 異構共存
11.8 總結
11.9 參考資源
附錄A 安裝Node
A.1 Windows係統下的Node安裝
A.2 Mac係統下Node的安裝
A.3 Linux係統下Node的安裝
A.4 總結
A.5 參考資源
附錄B 調試Node
B.1 Debugger
B.2 Node Inspector
B.2.1 安裝Node Inspector
B.2.2 錯誤堆棧
B.3 總結
附錄C Node編碼規範
C.1 根源
C.2 編碼規範
C.2.1 空格與格式
C.2.2 命名規範
C.2.3 比較操作
C.2.4 字麵量
C.2.5 作用域
C.2.6 數組與對象
C.2.7 異步
C.2.8 類與模塊
C.2.9 注解規範
C.3 最佳實踐
C.3.1 衝突的解決原則
C.3.2 給編輯器設置檢測工具
C.3.3 版本控製中的hook
C.3.4 持續集成
C.4 總結
C.5 參考資源
附錄D 搭建局域NPM倉庫
D.1 NPM倉庫的安裝
D.1.1 安裝Erlang和CouchDB
D.1.2 搭建NPM倉庫
D.2 高階應用
D.2.1 鏡像倉庫
D.2.2 私有模塊應用
D.2.3 純私有倉庫
D.3 總結
D.4 參考資源
精彩書摘
1 Node簡介
Node應該是如今最火熱的技術瞭,從本章開始,我們將逐步揭示它的諸多細節。
1.1 Node的誕生曆程
NodelJ,3誕生曆程如下所示。
2009年3月,RyanDahl在其博客上宣布準備基於V8創建一個輕量級的Web務器並提供一套庫。
2009年5月,RyanDalai在GitHub上發布瞭最初的版本。
2009年12月和2010年4月,兩屆JSConfJ(會都安排瞭Node的講座。
2010年年底,Node獲得矽榖雲計算服務商Joyent公司的資助,其創始人Joyent公司全職負責Node的發展。
2011年7月,Node在微軟的支持下發布瞭其Windows版本。
2011年1lYl,Node超越RubyonRails,成為GitHub上關注度最高的項目(隨後被Bootstrap項目超越,目前仍居第二)。
2012年1月底,RyanDahl在~Node架構設計滿意的情況下,將掌門人的身份轉交給IsaacZ.Schlueter,自己轉嚮一些研究項目。IsaacZSchlueter是Node的包管理器NPM的作者,之後Node的版本發布和bug修復等工作由他接手。截至筆者執筆之曰(2013年7月13日),發布的Node穩定版為v0.10.13,非穩定版為v0.11.4,NPM的官方模塊數達到34943個,模塊的周下載量為1479萬次。
隨後,Node的發布計劃主要集中在性能提升上,在v0.14之後,正式發布vI.O版本。
1.2 Node的命名與起源
在Node的官方網站之外,N0dc具有很多彆稱:Nodejs、NodeJS、Node.is等。本書在寫作過程中遵循官方的說法,將會一直使用Node這個名字,但是在當前語境之外,為瞭與其餘錶示節點的技術或名詞相區彆,均可以帶上is錶明它是Node。在聽到這些詞匯時,應該意識到,它們說的是一碼事。除瞭本書的封麵和此處會用到N0dejs外,其餘地方都會以Node作為正式稱謂。
Node名字的來由,其實跟它的起源是有密切關係的。
1.2.1 為什麼是JavaScript
RvanDahl是一名資深的C/C++程序員,在創造齣N0de之前,他的主要工作都是圍繞高性能we服務器進行的。經曆過一些嘗試和失敗之後,他找到瞭設計高性能,WebH~務器的幾個要點:事件驅動、非阻塞I/O。
所以RvanDahl最初的目標是寫一個基於事件驅動、非阻塞I/O的Web服務器,以達到更高的性能,提供Apache等服務器之外的選擇。他提到,大多數人不設計一種更簡單和更有效率的程序的主要原因是他們用到瞭阻塞I/O的庫。寫作Node的時候,RyanDahl~評估過C、Lua、Haskell、Ruby等語言作為備選實現,結論為:C的開發門檻高,可以預見不會有太多的開發者能將它用於日常的業務開發,所以捨棄它;RyanDahl覺得自己還不足夠玩轉Haskell,所以捨棄它;Lua自身已經含有很多阻塞I/0庫,為其構建非阻塞I/O庫也不能改變人們繼續使用阻塞I/0庫的習慣,所以也捨棄它;而Ruby的虛擬機由於性能不好而落選。
相比之下,JavaSCriptt:gC的開發門檻要低,比Lua的曆史包袱要少。盡管服務器端JavaScript存在已經很多年瞭,但是後端部分一直沒有市場,可以說曆史包袱為零,為其導人非阻塞I/0庫沒有額外阻力。另外,JavaScript4覽器中有廣泛的事件驅動方麵的應用,暗閤RyanDahl喜好基於事件驅動的需求。當時,第二次瀏覽器大戰也漸漸分齣高下,Chrome瀏覽器的JavaSCript引擎V8摘得性能第一的桂冠,而EL其基於新BSD許可證發布,自然受到RyanDahl的歡迎。考慮到高性能、符閤事件驅動、沒有曆史包袱這3個主要原因.JavaScript成N(Node~J實現語言。
1.2.2 為什麼叫Node
起初,RyanDahl稱他的項目為web.js,就是一個We服務器,但是項目的發展超過瞭他最初單純開發一個Web服務器的想法,變成瞭構建網絡應用的一個基礎框架,這樣可以在它的基礎上構建更多的東西,諸如服務器、客戶端、命令行工具等。Node為一個強製不共享任何資源的單綫程、單進程係統,包含十分適宜網絡的庫,為構建大型分布式應用程序提供基礎設施,其目標也是成為一個構建快速、可伸縮的網絡應用平颱。它自身非常簡單,通過通信協議來組織許多N0de,非常容易通過擴展來達成構建大型網絡應用的目的。每一個Node進程都構成這個網絡應用中的一個節點,這是它名字所含意義的真諦
……
前言/序言
2006年至今,我們時常可以看到JavaScript的新聞,剛開始隻是JavaScript引擎性能的提升,到後來發現很多是來自HTML5和Node創造的奇跡。如果隻看錶麵,很容易讓人感覺這又是一顆衛星。這種現象讓人覺得不可信,所以齣現瞭以下各種版本的誤解。
Node肯定是幾個前端工程師在實驗室裏搗鼓齣來的。
為瞭後端而後端,有意思嗎?
怎麼又發明瞭一門新語言?
JavaScript承擔的責任太重瞭。
直覺上,JavaScript不應該運行在後端。
前端工程師要逆襲瞭。
一方麵,大傢看到JavaScript在各個地方放齣異彩,其他語言的開發者既羨慕它的成果,又擔心它對當前所從事的語言造成衝擊;另一方麵,人們還是有JavaScript隻能做前端腳本的定勢思維。究其原因,還是因為人們缺乏曆史觀層次上的認知,所以會産生一些莫須有的惴惴不安。
1995年,JavaScript隨網景公司發布的Netscape Navigator 2.0發布,它最早命名為LiveScript,隨後更名為JavaScript。它齣自如今的Mozilla公司的CTO——Brendan Eich之手,其産生來源於網景公司發布的Netscape Navigator瀏覽器需要一種腳本語言來協助瀏覽器做一些簡單的動態操作。當時網景公司與Sun公司閤作密切,不懂技術的管理層希望得到一個Java的腳本版語言,以期能像Java一樣風靡。Brendan Eich原本進入網景公司是希望做Scheme語言的開發,但是卻接到瞭一個不喜歡的任務,但迫於當時形勢,不得不完成此事,於是JavaScript之父在10天的時間裏倉促完成瞭JavaSc
深入淺齣Node.js 下載 mobi epub pdf txt 電子書 格式
評分
☆☆☆☆☆
可是為瞭治病我們把傢産全給賣瞭,現在不但付不起住院費,連傢都沒瞭。
評分
☆☆☆☆☆
——dom core的api,如getElementById, getElementsByTagName, getAttribute, setAttribute, createElement, createTextNode, appendChild和insertBefore等不是任何一個瀏覽器的js語句。使用它們而不是其他等價方法的好處就在於可以真正跨平颱,獨立於具體腳本語言和文檔
評分
☆☆☆☆☆
我,非常棒,非常棒,非常棒,非常棒,你有病,你有病啊,你有病,你有病呀,你要不要,你有病啊,還沒上班好,想把你要不然就不要你哈哈哈,哈哈哈哈,你有病。
評分
☆☆☆☆☆
——setAttribute可以修改任何一個元素的任何一個屬性,如果該屬性不存在就創建後再賦值
評分
☆☆☆☆☆
貨品收到瞭,送貨速度非常及時,這本書,包裝還算是比較精美,內容寫的也比較實用不錯不錯,的確是一本值得收藏的好書。
評分
☆☆☆☆☆
很喜歡在東東上網購 真的不錯的 比其他網店實在 服務好 好喜歡 還會介紹朋友來
評分
☆☆☆☆☆
可以,快遞小哥人好。
評分
☆☆☆☆☆
之前都是用到哪學那,現在可以係統學習一下瞭,挺經典的書
評分
☆☆☆☆☆
好在我找瞭一份工作,收入還不錯,至少夠我們父女倆過日子的。