《深入淺出Nodejs》—— 讀后總結


這一個月過去了三分之二,加上之前看過這本書三分之一,這才算是看完。

雖然看完一遍,但是這本書內容很深,以后肯定是還要繼續翻閱的.....

什么是Nodejs

  Nodejs有幾個特性:異步IO,事件驅動,單線程,跨平台

  異步IO可以保證在CPU計算的同時,異步的加載IO,加快了應用的訪問。不像傳統的服務器是使用什么阻塞IO啊、輪訓IO等等,它相當於在發送處理請求時,直接傳一個回調函數,當異步的IO結束后,會自動的執行回調。

  事件驅動,則是把粒度降低到事件級別。傳統的服務器是一個請求分配一個線程進行處理,這樣就會增加多線程通信的復雜性。而事件驅動,則簡化了事件模型。

  單線程其實主要是因為Nodejs是基於V8瀏覽器引擎,因此具有單線程的特點,而且內存很小。這樣就引出了Node的劣勢——無法利用多核CPU、如果應用出現問題整個系統也會崩潰、CPU繁忙將會影響IO。(因此Node中也提供了child_process模塊創建子進程,以此來利用多核;引入了一些集群特性,增加健壯性)。

  最后就是跨平台,Nodejs其實並非全部用javascript編寫,只是表面的業務語言以及開放的模塊才使用js。底層的大部分的模塊還是使用C++構建,因此通過切換系統級別的組件,可以直接切換平台。

異步編程

  使用Nodejs編寫全棧應用,肯定會遇到異步編程的場景。由於有回調的特性,因此可能會出現回調嵌入回調的場景,如果嵌套很深,很影響代碼的維護和閱讀。

  因此異步編程就出現了一些常見的模式:

  發布/訂閱

  這種模式在Nodejs中很常見,像普通的http的on、error或者angular的$watch以及$emit、$broadcast等都是采用這種機制。

  Promise/Deferred

  最出名的的應該是Kris kawl's Q,后來很多的前端框架都推出了自己的promise模型,比如jquery,dojo,以及angular。這種方式書寫出的代碼很像傳統的單線程順序執行的代碼,閱讀起來很方便。

  next尾觸

  這種模式比較有意思,是把一些列的操作放入一個隊列。然后按順序調用,當一個調用結束后,會執行next()方法,繼續執行下一個調用。典型的場景就是Node里面的中間件。

內存機制

  Nodejs的內存機制很像JVM,因為開發設計Node內存虛擬機的人,正式開發Hotspot的人——結果就是,Nodejs的回收機制跟JVM極其相似。

  Nodejs的垃圾回收機制可以簡單的描述為:

  新生代:

  生命周期短的對象,使用復制回收——即把內存分成兩塊,一塊閑置,另一塊工作;垃圾回收時,把工作中的存活對象復制到閑置空間中,再交換閑置和工作狀態。典型的空間換時間。

  老生代:

  生命周期長的對象,使用標記清除、標記整理——即標記那些不再使用的對象,回收的時候回收掉這些標記中的對象;由於這種標記方法會出現內存碎片,因此搭配標記整理,可以整理內存。

代碼規范

最后總結一下書中提及的代碼規范:

1 縮進,由於tab在不同的編輯器中長度可能不同,因此推薦使用兩個空格

2 變量聲明,盡量每個對象都帶上var,不然會變成全局變量污染全局

3 空格,在操作符或者括號兩邊加上空格

4 盡量優先使用單引號

5 大括號不推薦換行

6 逗號不要在行首出現

7 盡量每一句結尾都帶上分號

8 變量命名:小駝峰,如userName;

  方法命名:小駝峰,getName();

  類命名:大駝峰,NameFilter;

  常量命名:大寫字母,USER_COUNT;

  文件命名:下划線分割,user_test.js;

  模塊命名:簡短單詞,express、fs

9 比較操作使用 ===

10 使用{} [] 創建對象和數組

11 盡量避免使用with、eval

12 區分使用對象和數組

學習筆記

Nodejs·內存控制

Nodejs·理解Buffer

Nodejs·網絡服務

Nodejs·構建web應用

Nodejs·進程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM