前端知識體系-NodeJS相關】NodeJS基礎知識全面總結

来源:https://www.cnblogs.com/fecommunity/archive/2019/11/29/11922208.html
-Advertisement-
Play Games

Node的全局對象和全局變數、非同步、無阻塞IO?Node的技術架構和函數調用原理是什麼? ...


NodeJS基礎知識

1. Node的全局對象和全局變數

1.1 全局對象:所有模塊都可以調用的

  1. global:表示Node所在的全局環境,類似於瀏覽器的window對象。

  2. process:該對象表示Node所處的當前進程,允許開發者與該進程互動。

  3. console:指向Node內置的console模塊,提供命令行環境中的標準輸入、標準輸出功能。

1.2 全局函數

  1. 定時器函數:共有4個,分別是setTimeout(), clearTimeout(), setInterval(), clearInterval();
  2. require:用於載入模塊;
  3. Buffer():用於操作二進位數據。

1.3 全局變數

  1. __filename:指向當前運行的腳本文件名。
  2. __dirname:指向當前運行的腳本所在的目錄。

2. Node的三大特點

2.1 單線程

    Node.js不為每個客戶連接創建一個新的線程,而僅僅使用一個線程。當有用戶連接了,就觸發一個內部事件,通過非阻塞I/O、事件驅動機制,讓Node.js程式巨集觀上也是並行的。
        

2.2 非阻塞I/O  

  1. 由於Node.js中採用了非阻塞型I/O機制,因此在執行了訪問資料庫的代碼之後,將立即轉而執行其後面的代碼,把資料庫返回結果的處理代碼放在回調函數中,從而提高了程式的執行效率。

  2. 當某個I/O執行完畢時,將以事件的形式通知執行I/O操作的線程,線程執行這個事件的回調函數。為了處理非同步I/O,線程必須有事件迴圈,不斷的檢查有沒有未處理的事件,依次予以處理。

  3. 阻塞模式下,一個線程只能處理一項任務,要想提高吞吐量必須通過多線程。而非阻塞模式下,一個線程永遠在執行計算操作,這個線程的CPU核心利用率永遠是100%。所以,這是一種特別有哲理的解決方案:與其人多,但是好多人閑著;還不如一個人玩命,往死里幹活兒。

2.3 事件驅動event-driven

  1. 在Node中,在一個時刻,只能執行一個事件回調函數,但是在執行一個事件回調函數的中途,可以轉而處理其他事件(比如,又有新用戶連接了),然後返回繼續執行原事件的回調函數,這種處理機制,稱為“事件環”機制。

  2. Node.js底層是C++(V8也是C++寫的)。底層代碼中,近半數都用於事件隊列、回調函數隊列的構建。

3. Node技術架構

3.1 Node底層架構

nodejs組成部分:v8 engine, libuv, builtin modules, native modules以及其他輔助服務。

Node架構圖

  • 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函數調用機制

函數調用機制

  1. v8執行js代碼 server.listen()時,會通過一些基礎服務到TCPWrap::listen(),TCPWrap是nodejs的內建模塊,其通過libuv的api uv_listen()的方式,由libuv來完成非同步調用。

  2. 圖中1,2,3,4,5步驟標明瞭調用和返回的路徑,這幾步很快結束,留下callback TCPWrap::OnConnection()等著所需要的數據準備好後被調用。

  3. libuv在得到所需要的請求後,會調用callback TCPWrap::OnConnection(),在該函數最後通過 tcp_wrap->MakeCallback(env->onconnection_string(), ARRAY_SIZE(argv), argv) 調用V8 engine中的JavaScript callback。

  4. Node.js內建模塊http其實是建立在模塊net之上的。如果看net.js代碼會發現,其通過 new TCP() 返回的類對象完成後續的TCP connect, bind, open等socket動作。

  5. 可以看到Node.js做的工作像是一座橋。左手V8,右手libuv,將2者有機連接在一起。例如HandleWrap::HandleWrap()中記錄了V8 instance中的JavaScript對象以及TCPWrap對象。這樣在TCPWrap::OnConnection()中可以拿到這兩個對象,執行後續的callback調用。


參考文章


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下載並解壓MySQL 下載mysql-8.0.17-win64 \https://dev.mysql.com/downloads/mysql/8.0.html // 這裡提供的是8.0以上x64版本 解壓到任意位置,譬如: C:\mysql-8.0.17-winx64 (註意!! 此處的路徑一定要弄 ...
  • 為什麼要優化 系統的吞吐量瓶頸往往出現在資料庫的訪問速度上,即隨著應用程式的運行,資料庫的中的數據會越來越多,處理時間會相應變慢,且數據是存放在磁碟上的,讀寫速度無法和記憶體相比 如何優化 設計資料庫時:資料庫表、欄位的設計,存儲引擎 利用好MySQL自身提供的功能,如索引,語句寫法的調優 MySQL ...
  • 在使用之前,請確認項目已經整合了Redis一、加入依賴 org.springframework.session spring-session-data-redis 二、加入註解在加了@SpringBootApplication註解的類加上以下註解@EnableRedisHttpSession沒了。。... ...
  • Master Note: Troubleshooting guide for Automatic Undo Management (Doc ID 1579081.1) APPLIES TO: Oracle Database - Enterprise Edition - Version 9.2.0.1 ...
  • 一、redis文件夾下的可執行文件(文章尾部有示例代碼) 可執行文件 作用 redis-server 啟動redis redis-cli redis命令行工具 redis-benchmark 基準測試工具 redis-check-aof AOP持久化文件檢測工具和修複工具 redis-check-d ...
  • sqlserver日誌處理不當而造成的隱患 事故背景:一大早還在路上,群里陸續有人反饋系統一直報錯 “Unknown error 258”,後來查詢日誌發現錯誤日誌 第一反應是不是資料庫連接不夠用了?導致超時?但是通過sql查詢當時連接也只有40個左右,於是繼續排查問題,發現dbserver機器這段 ...
  • 重建全庫索引: exec sp_msforeachtable 'DBCC DBREINDEX(''?'')' 更新全庫統計信息: --更新全部統計信息 exec sp_updatestats 實例反饋: 在實際項目中,出現過導入數據的存儲過程執行需要大概46分鐘,而通過更新全庫統計信息之後,只需要6 ...
  • 德 App 進行 Bundle 化後,由於業務的複雜性,Bundle 的數量非常多。而這帶來了一個新的問題——Bundle 之間的依賴關係錯綜複雜,需要進行管控,使 Bundle 之間的依賴保持在架構設計之下。 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...