在對比中理解 Node

小蟲巨蟹發表於2017-10-04

之前知識星球有同學問道了這樣一個問題:Node 環境和瀏覽器環境有什麼區別?這樣的思考很值得鼓勵,在對比中學習,很容易將一個抽象的知識具象化。當時的回答只是簡單的畫了個圖,感覺有必要用此文來深入挖掘一下

二、什麼是前端,什麼是後端?

想必沒有哪個同學不知道,Node 將 Js 擴充套件到了後端,雖然前端與後端在猿界是高頻詞彙,恐怕也未必能回答清楚什麼是前端,什麼是後端這個問題?

存在於每個同學的潛意識裡的答案:Web 前端指的是使用者看得見摸得著的東西,包括 UI 層面以及 Web 層面的互動實現;後端更多的是與資料庫進行互動以處理相應的,實現功能、資料的存取、平臺的穩定性以及效能等等

我想說的是一個通訊層面上的區分, Web 應用基本上是基於 HTTP/HTTPS 構築的,前端(或者我們延伸到大前端:Android、IOS、瀏覽器等多端)作為 HTTP/HTTPS 的 Client 端,而後端則作為協議的服務端

結合上述兩點,可以簡單的畫一個圖:

有可能要被吐槽的圖
有可能要被吐槽的圖

通過這個對比來服務於我們對於 Node 的理解,執行在瀏覽器的 Js 主要是操作 Dom (UI 層面),以及作為 HTTP 客戶端操作網路通訊。而擴充套件到伺服器端的 Node,能力不再受瀏覽器沙盒的限制,可以啟動 HTTP 服務(以及 WebSocket 等各種服務),可以運算元據庫、輕鬆讀寫磁碟檔案,等等等等

三、Node 和瀏覽器的元件構成對比

抄襲自 Node 深入淺出的圖
抄襲自 Node 深入淺出的圖

是時候祭出用來回答開篇提到的知識星球問題的圖了,在 Node 橫空出世之前,Js 的主要執行環境是瀏覽器(Android/IOS 中的 WebView 也是瀏覽器),瀏覽器主要由佈局引擎(也就是我們常常說的瀏覽器核心)和Javascript 引擎組成,拿 Chrome 瀏覽器來說,它的佈局引擎是 WebKit(高版本的已經換成 Blink),佈局引擎的主要作用就是解析 Html Dom 和 Css 樣式規則;Javascript 引擎是 V8,顧名思義,Javascript 引擎的作用當然是編譯執行 javascript

相比之下,Node 就不需要佈局引擎了,畢竟不需要渲染介面,所以在 Node 中是沒有 Window 物件的,因為它木有 Dom、Bom 的 api。注意到圖中左右皆有中間層,但是它們並不一樣,前者基於瀏覽器的沙盒,後者基於 libuv,在 IO 讀寫上的能力是不一樣的,例如:在 Node 上可以輕鬆的讀寫磁碟檔案,但是在瀏覽器中,麻煩到懷疑人生

至於 V8,已經超出了我能詳細講解的能力範圍,但是 V8 作為一個開源的 Javascript 引擎,你可以很方便在你的應用中呼叫,舉個栗子:

#include <v8.h> 
using namespace v8; 
int main(int argc, char *argv[]) { 
    // 建立一個控制程式碼作用域 ( 在棧上 ) 
    HandleScope handle_scope; 
    // 建立一個新的上下文物件
    Persistent<Context> context = Context::New(); 
    // 進入上一步建立的上下文,用於編譯執行 helloworld 
    Context::Scope context_scope(context); 
    // 建立一個字串物件,值為'Hello, Wrold!', 字串物件被 JS 引擎
    // 求值後,結果為'Hello, World!'
    Handle<String> source = String::New("'Hello' + ', World!'"); 
    // 編譯字串物件為指令碼物件
    Handle<Script> script = Script::Compile(source); 
    // 執行指令碼,獲取結果
    Handle <Value> result = script->Run(); 
    // 釋放上下文資源
    context.Dispose(); 

    // 轉換結果為字串
    String::AsciiValue ascii(result); 

    printf("%s\n", *ascii); 

    return 0; 
}複製程式碼

可以用一句話來概括上述使用 C++ 編寫的 V8 呼叫例項:將 Js 程式碼(字串形式),丟到 V8 中執行並返回執行結果。這是最簡單的 V8 呼叫模板,要知道,Node 也是使用 C++ 基於 V8 寫出來的,通過這個例子,是否對 Node 有多一點點的認識呢?

四、類比 Java 虛擬機器

對 Java 有一定了解的同學,對它的跨平臺特性肯定耳熟能詳,這得益於它的虛擬機器,什麼是虛擬機器?這又可以通過 Node 環境來幫助理解

Node 剛開始並沒有 Windows 版本,知道 2011 年 7 月,Node 在微軟的幫助下發布了 Windows 版本,從而實現了跨平臺。相容 Windows 和 *nix 平臺主要得益於 Node 在作業系統與上層模組之間構建了一層平臺架構層,也就是第三節中的中間層,也即 libuv。libuv 是許多系統實現跨平臺的基礎元件,感興趣可以去了解下(具體的我也說不清楚了~~)

回到什麼是虛擬機器的問題,莫不過是在系統於上層模組之間架設的一套 IO 橋階層

五、總結

不要給自己的知識領域設定邊界~~

菲麥前端 是一個讓知識深入原理的知識社群,我們有 知識星球、公眾號以及群,歡迎加微勾搭:facemagic2014

相關文章