前言
如果你想要深入學習Node,那你不能錯過《深入淺出Node.js》這本書,它從不同的視角介紹了 Node 內在的特點和結構。由首章Node 介紹為索引,涉及Node 的各個方面,主要內容包含模組機制的揭示、非同步I/O 實現原理的展現、非同步程式設計的探討、記憶體控制的介紹、二進位制資料Buffer 的細節、Node 中的網路程式設計基礎、Node 中的Web 開發、程式間的訊息傳遞、Node 測試以及通過Node 構建產品需要的注意事項。最後的附錄介紹了Node 的安裝、除錯、編碼規範和NPM 倉庫等事宜。在讀這本書的過程中我收穫頗多,並用思維導圖的方式記錄下來,方便自己後期溫故。如果你剛好沒有讀過,可以當做度這本書的預習閱讀,相信你也會有所收穫(思維導圖圖片可能有點小,記得點開看)
第1章 Node簡介
第2章 模組機制
CommonJS提出的規範均十分簡單,但是現實意義卻十分強大。Node通過模組規範,組織了 自身的原生模組,彌補JavaScript弱結構性的問題,形成了穩定的結構,並向外提供服務。NPM 通過對包規範的支援,有效地組織了第三方模組,這使得專案開發中的依賴問題得到很好的解決, 並有效提供了分享和傳播的平臺,藉助第三方開源力量,使得Node第三方模組的發展速度前所未 有,這對於其他後端JavaScript語言實現而言是從未有過的。從一定的角度上講,CommonJS規範 幫助Node形成了它的骨骼。只有茁壯的根,才能培養出茂盛的枝葉,併成長為參天大樹。正是這 些底層的規範和實踐,使得Node有序地發展著,擺脫掉過去JavaScript紛亂和被誤解的局面,進 而進化成良性的生態系統。第3章 非同步I/O
本章介紹了非同步I/O和另一些非I/O的非同步方法。可以看出,事件迴圈是非同步實現的核心,它 與瀏覽器中的執行模型基本保持了一致。而像古老的Rhino,儘管是較早就能在伺服器端執行的 JavaScript執行時,但是執行模型並不像瀏覽器採用事件驅動,而是像其他語言一般採用同步I/O 作為主要模型,這造成它在效能上無所發揮。Node正是依靠構建了一套完善的高效能非同步I/O框 架,打破了JavaScript在伺服器端止步不前的局面。第4章 非同步程式設計
在接觸Node的過程中,很多人粗略地接觸了幾個回撥函式之後就放棄了。儘管非同步程式設計略微 艱難,但是並非一無是處,一旦習慣,就顯得自然。從社群和過往的經驗而言,JavaScript非同步編 程的難題已經基本解決,無論是通過事件,還是通過Promise/Deferred模式,或者流程控制庫。相 信在掌握以上技巧之後,非同步程式設計不是難事,習慣非同步程式設計之後,將會收穫許多值得享受的程式設計 體驗。本章主要介紹了主流的幾種非同步程式設計解決方案,這是目前JavaScript中主要使用的方案。但對 於其他語言而言,還有協程(coroutine)等方式。但是由於Node基於V8的原因,在目前EMCAScript5 的實現下還不支援協程。這些標準和規範還在制定中,所以暫時不作介紹。未來的V8如果支援 Generator,也將在Node中能直接使用。
最後,因為人們總是習慣性地以線性的方式進行思考,以致非同步程式設計相對較為難以掌握。這 個世界以非同步執行的本質是不會因為大家線性思維的慣性而改變。就像日出月落不會因為你的心 情而改變其自有的執行軌跡。
第5章 記憶體控制
Node將JavaScript的主要應用場景擴充套件到了伺服器端,相應要考慮的細節也與瀏覽器端不同, 需要更嚴謹地為每一份資源作出安排。總的來說,記憶體在Node中不能隨心所欲地使用,但也不是 完全不擅長。本章介紹了記憶體的各種限制,希望讀者可以在使用中規避禁忌,與生態系統中的各 種軟體搭配,發揮Node的長處。
第6章 理解Buffer
體驗過JavaScript友好的字串操作後,有些開發者可能會形成思維定勢,將Buffer當做字 符串來理解。但字串與Buffer之間有實質上的差異,即Buffer是二進位制資料,字串與Buffer 之間存在編碼關係。因此,理解Buffer的諸多細節十分必要,對於如何高效處理二進位制資料十 分有用。第7章 網路程式設計
Node基於事件驅動和非阻塞設計,在分散式環境中尤其能發揮出它的特長,基於事件驅動可 以實現與大量的客戶端進行連線,非阻塞設計則讓它可以更好地提升網路的響應吞吐。Node提供 了相對底層的網路呼叫,以及基於事件的程式設計介面,使得開發者在這些模組上十分輕鬆地構建網 絡應用。下一章我們將在本章的基礎上探討具體的Web應用。第8章 構建Web應用
本章涉及的內容較為豐富,在Web應用的整個構建過程中,從處理請求到響應請求的整個過 程都有原理性闡述,整理本章細節就可以完成一個功能完備的Web開發框架。過去的各種Web技 術,隨著框架和庫的成型,開發者往往迷糊地知道應用框架和庫,卻不知道細節的實現,這好比 沒有地圖卻在野地裡行進。本章的內容希望能為Node開發者帶來地圖似的啟發,在開發Web應用 時能夠心有輪廓,明瞭細微。現在知名和成熟的Web框架有Connect、Express等,本章中的內容在這些框架中都有實現, 因為行文的原因,本章中的程式碼實現得較為粗糙,實際使用請使用這些成熟的框架。
第9章 玩轉程式
儘管Node從單執行緒的角度來講它有夠脆弱的:既不能充分利用多核CPU資源,穩定性也無 法得到保障。但是群體的力量是強大的,通過簡單的主從模式,就可以將應用的質量提升一個 檔次。在實際的複雜業務中,我們可能要啟動很多子程式來處理任務,結構甚至遠比主從模式 複雜,但是每個子程式應當是簡單到只做好一件事,然後通過程式間通訊技術將它們連線起來 即可。這符合Unix的設計理念,每個程式只做一件事,並做好一件事,將複雜分解為簡單,將 簡單組合成強大。
儘管通過 child_process 模組可以大幅提升Node的穩定性,但是一旦主程式出現問題, 所 有子程式將會失去管理。在Node的程式管理之外,還需要用監聽程式數量或監聽日誌的方式確 保整個系統的穩定性,即使主程式出錯退出,也能及時得到監控警報,使得開發者可以及時處 理故障。
第10章 測試
測試是應用或者系統最重要的質量保證手段。有單元測試實踐的專案,必然對程式碼的粒度和 層次都掌握得較好。單元測試能夠保證專案每個區域性的正確性,也能夠在專案迭代過程中很好地 監督和反饋迭代質量。如果沒有單元測試,就如同黑夜裡沒有秉燭的行走。
對於效能,在編碼過程中一定存在部分感性認知,與實際情況有部分偏差,而效能測試則能 很好地斧正這種差異。
第11章 產品化
一般而言,決定用一項技術進行產品開發時,只有最早期是與這門技術完全相關的。隨著時 間的遷移,要解決的已經不是原來的問題了,一門技術只能在一定層面上發揮出它的優勢來。用 Node也是一樣,隨著開發的進展、涉及層面的增多,我們看到在產品的角度要解決的問題依然是 大部分技術都要解決的問題。我們希望讀者能夠將Node納入到新的層面上進行考慮,使它更適應 產品,在產品中發揮出更大的優勢來。擴充套件
思維導圖能比較清晰的還原整本書的知識結構體系,如果你還沒用看過這本書,可以按照這個思維導圖的思路快速預習一遍,提高學習效率。學習新事物總容易遺忘,我比較喜歡在看書的時候用思維導圖做些記錄,便於自己後期複習,如果你已經看過了這本書,也建議你收藏複習。如果你有神馬建議或則想法,歡迎留言或加我微信交流:646321933