NodeJS基礎知識
1. Node的全域物件和全域變數
1.1 全域物件:所有模塊都可以呼叫的
-
global:表示Node所在的全域環境,類似于瀏覽器的window物件,
-
process:該物件表示Node所處的當前行程,允許開發者與該行程互動,
-
console:指向Node內置的console模塊,提供命令列環境中的標準輸入、標準輸出功能,
1.2 全域函式
- 定時器函式:共有4個,分別是setTimeout(), clearTimeout(), setInterval(), clearInterval();
- require:用于加載模塊;
- Buffer():用于操作二進制資料,
1.3 全域變數
- __filename:指向當前運行的腳本檔案名,
- __dirname:指向當前運行的腳本所在的目錄,
2. Node的三大特點
2.1 單執行緒
Node.js不為每個客戶連接創建一個新的執行緒,而僅僅使用一個執行緒,當有用戶連接了,就觸發一個內部事件,通過非阻塞I/O、事件驅動機制,讓Node.js程式宏觀上也是并行的,
2.2 非阻塞I/O
-
由于Node.js中采用了非阻塞型I/O機制,因此在執行了訪問資料庫的代碼之后,將立即轉而執行其后面的代碼,把資料庫回傳結果的處理代碼放在回呼函式中,從而提高了程式的執行效率,
-
當某個I/O執行完畢時,將以事件的形式通知執行I/O操作的執行緒,執行緒執行這個事件的回呼函式,為了處理異步I/O,執行緒必須有事件回圈,不斷的檢查有沒有未處理的事件,依次予以處理,
-
阻塞模式下,一個執行緒只能處理一項任務,要想提高吞吐量必須通過多執行緒,而非阻塞模式下,一個執行緒永遠在執行計算操作,這個執行緒的CPU核心利用率永遠是100%,所以,這是一種特別有哲理的解決方案:與其人多,但是好多人閑著;還不如一個人玩命,往死里干活兒,
2.3 事件驅動event-driven
-
在Node中,在一個時刻,只能執行一個事件回呼函式,但是在執行一個事件回呼函式的中途,可以轉而處理其他事件(比如,又有新用戶連接了),然后回傳繼續執行原事件的回呼函式,這種處理機制,稱為“事件環”機制,
-
Node.js底層是C++(V8也是C++寫的),底層代碼中,近半數都用于事件佇列、回呼函式佇列的構建,
3. Node技術架構
3.1 Node底層架構
nodejs組成部分:v8 engine, libuv, builtin modules, native modules以及其他輔助服務,

-
v8 engine:主要有兩個作用
1.虛擬機的功能,執行js代碼(自己的代碼,第三方的代碼和native modules的代碼),
2.提供C++函式介面,為nodejs提供v8初始化,創建context,scope等, -
libuv:它是基于事件驅動的異步IO模型庫,我們的js代碼發出請求,最終由libuv完成,而我們所設定的回呼函式則是在libuv觸發,
-
builtin modules:它是由C++代碼寫成各類模塊,包含了crypto,zlib, file stream etc 基礎功能,(v8提供了函式介面,libuv提供異步IO模型庫,以及一些nodejs函式,為builtin modules提供服務),
-
native modules:它是由js寫成,提供我們應用程式呼叫的庫,同時這些模塊又依賴builtin modules來獲取相應的服務支持
[!NOTE]
總結:如果把nodejs看做一個黑匣子,起暴露給開發者的介面則是native modules,當我們發起請求時,請求自上而下,穿越native modules,通過builtin modules將請求傳送至v8,libuv和其他輔助服務,請求結束,則從下回溯至上,最終呼叫我們的回呼函式,
3.2 Node函式呼叫機制

-
v8執行js代碼 server.listen()時,會通過一些基礎服務到TCPWrap::listen(),TCPWrap是nodejs的內建模塊,其通過libuv的api uv_listen()的方式,由libuv來完成異步呼叫,
-
圖中1,2,3,4,5步驟標明了呼叫和回傳的路徑,這幾步很快結束,留下callback TCPWrap::OnConnection()等著所需要的資料準備好后被呼叫,
-
libuv在得到所需要的請求后,會呼叫callback TCPWrap::OnConnection(),在該函式最后通過 tcp_wrap->MakeCallback(env->onconnection_string(), ARRAY_SIZE(argv), argv) 呼叫V8 engine中的JavaScript callback,
-
Node.js內建模塊http其實是建立在模塊net之上的,如果看net.js代碼會發現,其通過 new TCP() 回傳的類物件完成后續的TCP connect, bind, open等socket動作,
-
可以看到Node.js做的作業像是一座橋,左手V8,右手libuv,將2者有機連接在一起,例如HandleWrap::HandleWrap()中記錄了V8 instance中的JavaScript物件以及TCPWrap物件,這樣在TCPWrap::OnConnection()中可以拿到這兩個物件,執行后續的callback呼叫,
參考文章
- https://www.cnblogs.com/peiyu1988/p/8192066.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/167483.html
標籤:JavaScript
上一篇:【前端知識體系-NodeJS相關】對NodeJS模塊機制的理解
下一篇:資料結構與演算法之緒論
