Node 是 Ryan Dahl
基于 V8 JavaScript 引擎創(chuàng)建的后端運行環(huán)境
JavaScript 優(yōu)勢: 高性能有勾、基于事件驅(qū)動铐然、沒有歷史包袱
Node 命名由來:起初該項目命名為 web.js重贺,而后發(fā)展為一個強制不共享任何資源的單線程雷逆、單進程系統(tǒng)富拗。非常適合通過擴展來搭建大型網(wǎng)絡(luò)應(yīng)用喇肋。每個 Node 進程都構(gòu)成一個網(wǎng)絡(luò)應(yīng)用中的一個節(jié)點,故稱之為 Node档桃。
Node 特點:
- 異步 I/O
借鑒前端Ajax請求的異步I/O
底層語言層面實現(xiàn)文件讀取枪孩、網(wǎng)絡(luò)請求等接口的異步I/O
- 事件與回調(diào)函數(shù)
基于事件的編程方式具有輕量級、松耦合藻肄、只關(guān)注事務(wù)點等優(yōu)勢蔑舞,但同時多個異步任務(wù)下的協(xié)作會是一個問題。
- 單線程
優(yōu)勢:不需要考慮共享狀態(tài)的同步嘹屯,沒有死鎖的存在攻询,沒有切換線程上下文的性能開銷。
劣勢:無法利用多核CPU抚垄,一個錯誤就可能導(dǎo)致整個應(yīng)用退出蜕窿,大量計算占用CPU阻塞其他異步I/O谋逻。
瀏覽器中JavaScript與UI渲染共用一個線程,故當(dāng)JS長時間執(zhí)行時會導(dǎo)致UI渲染和響應(yīng)被終端桐经。為此 HTML5 制定了 Web Worker 標準毁兆,為不阻塞主線程,工作線程將處理結(jié)果通過消息傳遞的方式發(fā)送給主線程阴挣。
Node 借鑒 Web worker 的思路創(chuàng)建了 child_process 模塊气堕。Node 將計算分發(fā)給各個子進程,再通過進程間的事件消息傳遞結(jié)果畔咧。這樣可保持應(yīng)用模型的簡單和底依賴茎芭。通過 Master-Worker 的方式來管理各個子進程。
- 跨平臺
Node基于libuv 來實現(xiàn)跨平臺誓沸,Node 的第三方 C++ 模塊也可以借助 libuv 實現(xiàn)跨平臺梅桩。
Node 應(yīng)用場景
擅長 I/O 密集型的應(yīng)用;對于 CPU 密集的應(yīng)用可通過C/C++拓展模塊與子進程的調(diào)用來部分解決拜隧。
舊有系統(tǒng)可作為 node 的數(shù)據(jù)源開發(fā)分布式應(yīng)用宿百,Node 發(fā)揮并行I/O的優(yōu)勢來提升 Web 的渲染能力。