這一個月過去了三分之二,加上之前看過這本書三分之一,這才算是看完。
雖然看完一遍,但是這本書內容很深,以后肯定是還要繼續翻閱的.....
什么是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 區分使用對象和數組
