首頁  >  文章  >  web前端  >  詳細介紹關於node js的基本知識

詳細介紹關於node js的基本知識

零下一度
零下一度原創
2017-06-26 13:32:571144瀏覽

前面的話

  幾年前,對於學習NodeJS可能還有所遲疑,怕分散了前端學習的精力。但到了現在,如果不學習nodeJS,前端的學習可能無法再有所進展。科技的進步就是這麼殘酷。對新技術觀望的時候,該技術已經大行其道了。本文將介紹nodeJS的基礎知識

 

語言選擇

#  Ryan Dahl是一名資深的C/C++程式設計師,在創造出Node之前,他的主要工作都是圍繞著高效能Web伺服器進行的。經歷過一些嘗試與失敗之後,他找到了設計高效能,Web伺服器的幾個要點: 事件驅動、非阻塞I/O,而這也正是nodejs的兩大特點

  所以Ryan Dahl最初的目標是寫一個基於事件驅動、非阻塞I/O的Web伺服器,以達到更高的效能,提供Apache等伺服器以外的選擇。寫Node的時候,Ryan Dahl曾經評估過C、Lua、Haskell、 Ruby等語言作為備選實現,結論為:C的開發門檻高,可以預見不會有太多的開發者能將它用於日常的業務開發,所以捨棄它;Ryan Dahl覺得自己還不足夠玩轉Haskell,所以捨棄它;Lua本身已經含有很多阻塞I/O庫,為其構建非阻塞I/O庫也不能改變人們繼續使用阻塞I /O庫的習慣,所以也捨棄它;而Ruby的虛擬機由於性能不好而落選

  相比之下,JavaScript比C的開發門檻要低,比Lua的歷史包袱要少。儘管伺服器端JavaScript存在已經很多年了,但是後端部分一直沒有市場,可以說歷史包袱為零,為其導入非阻塞I/O庫沒有額外阻力。另外,JavaScript在瀏覽器中有廣泛的事件驅動方面的應用,暗合Ryan Dahl喜好基於事件驅動的需求。當時,第二次瀏覽器大戰也漸漸分出高下,Chrome瀏覽器的JavaScript引擎V8摘得效能第一的桂冠。考慮到高效能、符合事件驅動、沒有歷史包袱這3個主要原因,JavaScript成為了Node的實作語言

 

命名

  起初,Ryan Dahl稱他的專案為web.js,就是一個Web伺服器,但是專案的發展超過了他最初單純開發一個Web伺服器的想法,變成了建構網路應用的一個基礎框架,這樣可以在它的基礎上建立更多的東西,諸如伺服器、客戶端、命令列工具等。 Node發展為一個強制不共享任何資源的單線程、單進程系統,包含十分適宜網絡的庫,為構建大型分散式應用程式提供基礎設施,其目標也是成為一個構建快速、可伸縮的網絡應用平台。它本身就非常簡單,透過通訊協定來組織許多Node,非常容易透過擴充來達成建構大型網路應用的目的。每一個Node進程都構成這個網路應用中的一個節點,也就是它名字所含意義的真諦

 

特點

  作為後端JavaScript的運作平台, Node保留了前端瀏覽器JavaScript中那些熟悉的接口,沒有改寫語言本身的任何特性,依舊基於作用域和原型鏈,區別在於它將前端中廣泛運用的思想遷移到了伺服器端。 Node相較於其他語言的特徵如下所示

  1、非同步I/O

  在Node中,絕大多數的操作都以非同步的方式進行呼叫。 Ryan Dahl排除萬難,在底層建立了許多非同步I/O的API,從檔案讀取到網路請求等,兩者皆如此。這樣的意義在於,在Node中,我們可 以從語言層面很自然地進行並行I/O操作。每個呼叫之間無須等待之前的I/O呼叫結束。在程式設計模型上可以大幅提升效率

  以同時執行兩個檔案讀取任務為例,非同步I/O取決於最慢的那個檔案讀取的耗時,而同步I/O的耗時是兩個任務的耗時總和。這裡非同步帶來的優勢是顯而易見的

  2、事件

  隨著Web 2.0時代的到來,JavaScript在前端擔任了更多的職責,事件也得到了廣泛的應用。 Node不像Rhino那樣受Java的影響很大,而是將前端瀏覽器中應用廣泛且成熟的事件引入後端, 配合異步I/O,將事件點暴露給業務邏輯

  事件的程式設計方式具有輕量、松子合、只關注事務點等優勢,但是在多個非同步任務的場景下,事件與事件之間各自獨立,如何協作是一個問題

  3、回調函數

  與其他的Web後端程式語言相比,Node除了非同步和事件外,回呼函數是一大特色。縱觀下來,回呼函數也是最好的接受非同步呼叫返回資料的方式。但是這種程式設計方式對於許多習慣同步思路編程的人來說,也許是十分不習慣的。程式碼的編寫順序與執行順序並無關係,這對他們可能造成閱讀上的障礙。在流程控制方面,因為穿插了非同步方法和回呼函數,與常規的同步方式相比,變得不那麼一目了然了

  4、單執行緒

  JavaScript語言的一大特點就是單線程,也就是說,同一個時間只能做一件事。 JavaScript的單線程,與它的用途有關。作為瀏覽器腳本語言,JavaScript的主要用途是與使用者互動,以及操作DOM。這決定了它只能是單線程,否則會帶來複雜的同步問題。例如,假定JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另一個線程刪除了這個節點,而這時瀏覽器應該以哪個線程為準?所以,為了避免複雜性,從一誕生,JavaScript就是單線程,這已經成了這門語言的核心特徵

#  Node保持了JavaScript在瀏覽器中單線程的特點。而且在Node中,JavaScript與其餘執行緒是無法共享任何狀態的。單執行緒的最大好處是不用像多執行緒程式設計那樣處處在意狀態的同步問題,這裡沒有死鎖的存在,也沒有執行緒上下文交換所帶來的效能上的開銷

  同樣,單執行緒也有它本身的弱點,具體有以下3個面向:無法利用多核心CPU;錯誤會造成整個應用程式退出,應用的健壯性值得考驗;大量運算佔用CPU導致無法繼續呼叫非同步I/O

  像瀏覽器中JavaScript與UI共用一個執行緒一樣,JavaScript長時間執行會導致UI的渲染和回應中斷。在Node中,長時間的CPU佔用也會導致後續的非同步I/O發不出調用,已完成的非同步I/O的回呼函數也會無法及時執行

  HTML5定制了Web Workers的標準,Web Workers能夠建立工作執行緒來進行運算,以解決JavaScript大計算阻塞UI渲染的問題。工作線程為了不阻塞主線程,透過訊息傳遞的方式來傳遞運行結果,這也使得工作線程不能訪問到主線程中的UI

  Node採用了與Web Workers相同的思路來解決單線程中大計算量的問題:child_process。 子進程的出現,意味著Node可以從容地應對單執行緒在健全性和無法利用多核心CPU方面的問題。透過將計算分發到各個子進程,可以將大量計算分解掉,然後再透過進程之間的事件訊息來傳遞結果,這可以很好地保持應用模型的簡單和低依賴。透過Master-Worker的管理方式,也可以很好地管理各個工作進程,以達到更高的健壯性

 

應用場景

  在進行技術選型之前,需要了解一項新技術具體適合什麼樣的場景,畢竟合適的技術用在合適的場景可以起到意想不到的效果。關於Node,探討得較多的主要有I/O密集型和CPU密集型

  1、I/O密集型

  如果將所有的腳本語言拿到一處來評判,那麼從單線程的角度來說,Node處理I/O的能力是值得豎起拇指稱讚的。通常, 說Node擅長I/O密集型的應用場景基本上是沒人反對的。 Node面向網路且擅長並行I/O,能夠有效地組織起更多的硬體資源,從而提供更多好的服務

  I/O密集的優勢主要在於Node利用事件循環的處理能力,而不是啟動每一個執行緒為每一個請求服務,資源佔用極少

  2、CPU密集型

  換一個角度,在CPU密集的應用場景中,Node是否能勝任呢?實際上,V8的執行效率是十分高的。單以執行效率來做評判,V8的執行效率是毋庸置疑的

  CPU密集型應用給Node帶來的挑戰主要是:由於JavaScript單線程的原因,如果有長時間運行的計算(例如大循環),將會導致CPU時間片無法釋放,使得後續I/O無法發起。但是適當調整和分解大型運算任務為多個小任務,使得運算能夠適時釋放,不阻塞I/O調用的發起,這樣既可同時享受到並行異步I/O的處,又能充分利用CPU

以上是詳細介紹關於node js的基本知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn