閱讀筆記:一章章閱讀,記錄個人比較有用的語句,包括js + node 的原理部分,并不總結。
node特點
異步I/O
js異步調用中對于結果值的捕獲是符合Don't call me,I will call you的原則,
圖為經典的ajax
在node中 異步I/O也很常見,與ajax調用的方式極其類似
在node中絕大多數的操作都是異步,包括從文件的讀取和網絡請求等。
事件與回調函數
隨著web2.0時代的到來,js在前端擔任了更多的職責,事件也得到了廣泛的應用,node不像Rhino那樣受java的影響很大,而是將前端瀏覽器中應用廣泛且成熟的事件引入后端,配合異步I/O,將事件點暴露給業務邏輯。
單線程
Node保持了JS在瀏覽器中單線程的特點,在Node中,js與其余線程是無法共享任何狀態的。單線程的最大好處是不用像多線程編程那樣處處在意狀態的同步問題,這里沒有死鎖的存在,也沒有線程上下文交換所帶來的性能上的開銷。
缺點:1.無法利用多核CPU2.錯誤會引起整個應用退出,應用的健壯性值得考驗3.大量計算占用CPU導致無法繼續調用異步IO。
Node采用了與web workers相同的思路來解決單線程中大計算量的問題:child_process ,node通過將計算分發給各個子進程,將大量計算分解掉,再通過進程之間的事件消息來傳遞結果。
Node使用者所注重的特性
- 前后端編程語言環境統一
- Node帶來的高性能IO用于實時應用
- 并行IO使得使用者可以更高效地利用分布式環境
- 并行IO 有效利用穩定接口提升web渲染能力
- 云計算平臺提供Node支持
- 游戲開發領域
- 工具類應用
模塊機制
在WEB2.0流行的過程中,各種前端庫和框架被開發出來,它們最初用于兼容各個版本的瀏覽器,隨后隨著更多的用戶需求被前端實現,javascript也從表單校驗躍遷到應用開發的級別上。
經歷了長長的后天努力過程,javascript不斷被類聚和抽象,以更好地組織業務邏輯,從另一個角度而言,它也道出了javascript先天就缺乏的一項功能:模塊,類似其它高級語言中,java有類文件,Python有import機制,Ruby有require,PHP有include和require。
CommonJS
CommonJS規范的出現---希望javascript能夠在任何地方運行。CommonJS API寫出的應用可以具備跨宿主環境執行的能力,這樣不僅可以利用javascript開發服客戶端應用,而且開可以編寫以下應用
- 服務端javascript應用程序
- 命令行工具
- 桌面圖形界面應用程序
- 混合應用
CommonJS為javascript開發大型應用程序指明了道路,這些規范涵蓋了模塊、二進制、Buffer、字符集編碼、IO流、進程環境、文件系統、套接字、單元測試、web服務器網關接口、包管理等。
Node借鑒CommonJS的Modules規范實現了一套非常易用的模塊系統,NPM對Packages規范的完好支持使得Node應用在開發過程中事半功倍。
CommonJS的模塊規范:模塊引入,模塊定義,模塊標識。
Node的模塊實現
在Node中引入模塊需要經歷如下3個步驟
- 路徑分析
- 文件定位
- 編譯執行
優先從緩存加載
在Node中,模塊分為兩類:一類是Node提供的模塊,稱為核心模塊;另一類是用戶編寫的模塊,稱為文件模塊
核心模塊部分在Node進程啟動時,部分核心模塊直接加載進內存,省去了文件定位和編譯執行,而且路徑分析中優先判斷,所以它的加載速度是最快的
文件模塊則是運行時動態加載需要完整的三個過程。
瀏覽器會緩存靜態腳本文件以提高性能一樣,Node對引入過的模塊都會進行緩存減少二次引入的開銷,不同的是,瀏覽器僅僅緩存文件,而Node緩存的是編譯和執行后的對象。不管是核心模塊還是文件模塊,require()方法對相同模塊的二次加載都一律采用緩存優先的,這是第一優先級。不同之處在于核心模塊的緩存檢查優先于文件模塊的緩存檢查。