Node.js 是一個平臺javascript
Node.js 用到了哪些技術java
V8 引擎、libuv、C/C++ 實現的 c-ares(DNS解析)、http-parser(HTTP 解析)、OpenSSL(HTTPS)、zlib(壓縮) 等庫。node
若是對源碼實現感興趣,推薦查看:git
Node.js 技術架構如圖所示,下面簡單介紹一下它們的做用後端
假如 C/C++ 實現了一個 xxx 庫,很好用,JS 沒法直接調用它。Node.js 用 C++ 對其進行了封裝,使它符合某些要求。封裝的文件叫 xxx_bindings.cpp,而後使用 Node.js 編譯爲 .node 文件(並非惟一的方式,也有其餘方法),而後 JS 能夠直接 require 這個文件,binding 文件就是 JS 和 C/C++ 庫中間的橋樑,而 Node.js 提供了不少 binding,因此加個 s,也就是 bindingsapi
一個跨平臺的異步 I/O 庫,會根據系統自動選擇合適的方案網絡
用於 TCP / UDP / DNS / 文件等異步操做多線程
I/O 是什麼?
全部輸入輸出都屬於I/O,例如文件讀寫、訪問網絡、發送接收文件等
簡單說一下 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 回調 複製代碼
Node.js API 是 Node.js 對外開放用來調用上述功能進行的應用接口,須要使用時可自行查看文檔