Node.js 技術架構簡述

Node.js 不是什麼?

  • Node.js 不是Web後端框架,不能與 Spring 和 Flask 相比
  • Node.js 不是編程語言,不能與 Python 和 PHP 相比

Node.js 是什麼?Wiki

  • Node.js 是一個平臺javascript

    • 它組合多種技術
    • 它讓 JavaScript 也能調用系統接口,開發後端應用
  • Node.js 用到了哪些技術java

    V8 引擎libuv、C/C++ 實現的 c-ares(DNS解析)、http-parser(HTTP 解析)、OpenSSL(HTTPS)、zlib(壓縮) 等庫。node

    若是對源碼實現感興趣,推薦查看:git

    Node.js v0.10 (代碼量較少,適合閱讀)github

    Node.js 源碼分析編程

Node.js 技術架構

Node.js 技術架構如圖所示,下面簡單介紹一下它們的做用後端

bindings

假如 C/C++ 實現了一個 xxx 庫,很好用,JS 沒法直接調用它。Node.js 用 C++ 對其進行了封裝,使它符合某些要求。封裝的文件叫 xxx_bindings.cpp,而後使用 Node.js 編譯爲 .node 文件(並非惟一的方式,也有其餘方法),而後 JS 能夠直接 require 這個文件,binding 文件就是 JS 和 C/C++ 庫中間的橋樑,而 Node.js 提供了不少 binding,因此加個 s,也就是 bindingsapi

libuv

一個跨平臺的異步 I/O 庫,會根據系統自動選擇合適的方案網絡

用於 TCP / UDP / DNS / 文件等異步操做多線程

I/O 是什麼?

全部輸入輸出都屬於I/O,例如文件讀寫、訪問網絡、發送接收文件等

V8

功能
  • 將 JS 源碼變成本地代碼執行
  • 維護調用棧,確保 JS 函數的執行順序
  • 內存管理
  • 垃圾回收,重複利用無用的內存
  • 實現 JS 的標準庫
注意
  • V8 不提供 DOM API
  • V8 執行 JS 是單線程
  • 能夠開啓兩個線程分別執行 JS
  • V8 自己是多線程
  • V8 自帶 event loop 可是 Node.js 基於 libuv 本身作了一個

簡單說一下 Event Loop:

Event(事件)

計時器到期、文件可讀、文件讀取出錯、socket有內容了、socket 關閉了,這些都是Event

Loop(循環)

事件是有優先級的,例如:

setTimeout(f1,100)
fs.readFile('/1.txt',f2)
server.on('close',f3)
複製代碼

這上面的三個事件若是同時發生,確定是會有一個執行優先級的規則(人爲規定)的,而 Node.js會按照這個規則輪詢事件,如 1->2->3->1->2->3

Event Loop

推薦閱讀:Event Loop、計時器、nextTick-方應杭

操做系統觸發事件,JS 處理事件,Event Loop 就是對事件處理順序的管理

執行順序

重點:

  • timer檢查定時器
  • poll 輪詢,檢查系統事件
  • check 檢查 setImmediate 回調
  • 其餘階段不多使用

大部分時間,Node.js 都停在 poll 輪詢階段。大部分事件也都在 poll 階段被處理,如文件、網絡請求。

setTimeout(f1,0) 
setImmediate(f2)
// 上方代碼大部分時間是 setImmediate 先執行
// 由於大部分時間 Node.js 停留在 poll 階段
// 前往 timer 階段須要先通過 check 階段
// 會先執行 setImmediate 回調
複製代碼

總結

  • 用 libuv 進行異步 I/O 操做
  • 用 event loop 管理事件處理順序
  • 用 C/C++ 庫高效處理 DNS/HTTP...
  • 用 bindings 讓 JS 能和 C/C++ 溝通
  • 用 V8 運行 JS
  • 用 Node.js 標準庫簡化 JS 代碼
  • 這就是 Node.js

Node.js API

Node.js API 是 Node.js 對外開放用來調用上述功能進行的應用接口,須要使用時可自行查看文檔

文檔地址:英文 中文

相關文章
相關標籤/搜索