閱讀筆記:一章章閱讀崭添,記錄個(gè)人比較有用的語句臊岸,包括js + node 的原理部分梗脾,并不總結(jié)尽楔。
node特點(diǎn)
異步I/O
js異步調(diào)用中對于結(jié)果值的捕獲是符合Don't call me,I will call you的原則,
圖為經(jīng)典的ajax
在node中 異步I/O也很常見衡招,與ajax調(diào)用的方式極其類似
在node中絕大多數(shù)的操作都是異步篱昔,包括從文件的讀取和網(wǎng)絡(luò)請求等。
事件與回調(diào)函數(shù)
隨著web2.0時(shí)代的到來始腾,js在前端擔(dān)任了更多的職責(zé)州刽,事件也得到了廣泛的應(yīng)用,node不像Rhino那樣受java的影響很大浪箭,而是將前端瀏覽器中應(yīng)用廣泛且成熟的事件引入后端穗椅,配合異步I/O,將事件點(diǎn)暴露給業(yè)務(wù)邏輯奶栖。
單線程
Node保持了JS在瀏覽器中單線程的特點(diǎn)匹表,在Node中门坷,js與其余線程是無法共享任何狀態(tài)的。單線程的最大好處是不用像多線程編程那樣處處在意狀態(tài)的同步問題袍镀,這里沒有死鎖的存在默蚌,也沒有線程上下文交換所帶來的性能上的開銷。
缺點(diǎn):1.無法利用多核CPU2.錯誤會引起整個(gè)應(yīng)用退出苇羡,應(yīng)用的健壯性值得考驗(yàn)3.大量計(jì)算占用CPU導(dǎo)致無法繼續(xù)調(diào)用異步IO绸吸。
Node采用了與web workers相同的思路來解決單線程中大計(jì)算量的問題:child_process ,node通過將計(jì)算分發(fā)給各個(gè)子進(jìn)程设江,將大量計(jì)算分解掉锦茁,再通過進(jìn)程之間的事件消息來傳遞結(jié)果。
Node使用者所注重的特性
- 前后端編程語言環(huán)境統(tǒng)一
- Node帶來的高性能IO用于實(shí)時(shí)應(yīng)用
- 并行IO使得使用者可以更高效地利用分布式環(huán)境
- 并行IO 有效利用穩(wěn)定接口提升web渲染能力
- 云計(jì)算平臺提供Node支持
- 游戲開發(fā)領(lǐng)域
- 工具類應(yīng)用
模塊機(jī)制
在WEB2.0流行的過程中叉存,各種前端庫和框架被開發(fā)出來蜻势,它們最初用于兼容各個(gè)版本的瀏覽器,隨后隨著更多的用戶需求被前端實(shí)現(xiàn)鹉胖,javascript也從表單校驗(yàn)躍遷到應(yīng)用開發(fā)的級別上。
經(jīng)歷了長長的后天努力過程够傍,javascript不斷被類聚和抽象甫菠,以更好地組織業(yè)務(wù)邏輯,從另一個(gè)角度而言冕屯,它也道出了javascript先天就缺乏的一項(xiàng)功能:模塊寂诱,類似其它高級語言中,java有類文件安聘,Python有import機(jī)制痰洒,Ruby有require,PHP有include和require浴韭。
CommonJS
CommonJS規(guī)范的出現(xiàn)---希望javascript能夠在任何地方運(yùn)行丘喻。CommonJS API寫出的應(yīng)用可以具備跨宿主環(huán)境執(zhí)行的能力,這樣不僅可以利用javascript開發(fā)服客戶端應(yīng)用念颈,而且開可以編寫以下應(yīng)用
- 服務(wù)端javascript應(yīng)用程序
- 命令行工具
- 桌面圖形界面應(yīng)用程序
- 混合應(yīng)用
CommonJS為javascript開發(fā)大型應(yīng)用程序指明了道路泉粉,這些規(guī)范涵蓋了模塊、二進(jìn)制榴芳、Buffer嗡靡、字符集編碼、IO流窟感、進(jìn)程環(huán)境讨彼、文件系統(tǒng)、套接字柿祈、單元測試哈误、web服務(wù)器網(wǎng)關(guān)接口哩至、包管理等。
Node借鑒CommonJS的Modules規(guī)范實(shí)現(xiàn)了一套非常易用的模塊系統(tǒng)黑滴,NPM對Packages規(guī)范的完好支持使得Node應(yīng)用在開發(fā)過程中事半功倍憨募。
CommonJS的模塊規(guī)范:模塊引入,模塊定義袁辈,模塊標(biāo)識菜谣。
Node的模塊實(shí)現(xiàn)
在Node中引入模塊需要經(jīng)歷如下3個(gè)步驟
- 路徑分析
- 文件定位
- 編譯執(zhí)行
優(yōu)先從緩存加載
在Node中,模塊分為兩類:一類是Node提供的模塊晚缩,稱為核心模塊尾膊;另一類是用戶編寫的模塊,稱為文件模塊
核心模塊部分在Node進(jìn)程啟動時(shí)荞彼,部分核心模塊直接加載進(jìn)內(nèi)存冈敛,省去了文件定位和編譯執(zhí)行,而且路徑分析中優(yōu)先判斷鸣皂,所以它的加載速度是最快的
文件模塊則是運(yùn)行時(shí)動態(tài)加載需要完整的三個(gè)過程抓谴。
瀏覽器會緩存靜態(tài)腳本文件以提高性能一樣,Node對引入過的模塊都會進(jìn)行緩存減少二次引入的開銷寞缝,不同的是癌压,瀏覽器僅僅緩存文件,而Node緩存的是編譯和執(zhí)行后的對象荆陆。不管是核心模塊還是文件模塊滩届,require()方法對相同模塊的二次加載都一律采用緩存優(yōu)先的,這是第一優(yōu)先級被啼。不同之處在于核心模塊的緩存檢查優(yōu)先于文件模塊的緩存檢查帜消。