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,一個錯誤就可能導致整個應(yīng)用退出,大量計算占用CPU阻塞其他異步I/O。
瀏覽器中JavaScript與UI渲染共用一個線程,故當JS長時間執(zhí)行時會導致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 的渲染能力。