- Node.js+Webpack開發實戰
- 夏磊
- 1447字
- 2021-03-26 21:53:45
1.1 Node.js是什么
你很有可能已經聽說過Node.js,甚至已經用上了。的確,近年來不管是Web/服務端還是桌面/移動應用的開發都可以看到它的身影。它在GitHub上擁有64000多顆星(Star),擁有2500多位貢獻者,官方的包管理平臺NPM下擁有高達100多萬的軟件包(Package)。所有這些都表明Node.js的強大活力。
官網上(https://nodejs.org)給Node.js的定義是:
Node.js是一個基于Chrome V8引擎的JavaScript運行環境,用于構建高速、可伸縮的網絡應用程序。Node.js采用的事件驅動、非阻塞I/O模型,使它既輕量又高效,是構建可擴展的網絡應用程序的完美選擇。
1.JavaScript引擎
JavaScript引擎是一個專門處理JavaScript腳本的虛擬機,一般會附帶在網頁瀏覽器之中。目前為止一些知名的JavaScript引擎如下:
· V8引擎:Chrome瀏覽器采用的JavaScript引擎,也是第一個使用JIT技術的引擎。
· JavaScriptCore:Safari瀏覽器采用的JavaScript引擎。
· Chakra:IE/Edge瀏覽器采用的JavaScript引擎。
· SpiderMonkey:Mozilla Firefox瀏覽器采用的JavaScript引擎。
為什么會有這么多的JavaScript引擎呢?
主要是因為歷史的原因,1995年,網景(NetScape)公司開發了一種運行在瀏覽器的腳本語言,最初命名為Mocha,后來改名為LiveScript,臨近發布的時候為了蹭一蹭Java的熱度,最終命名為JavaScript。直到1997年,JavaScript才被歐洲計算機制造商協會(ECMA)進行了標準化,標準編號為ECMA-262,標準化后的名稱為ECMAScript。
ECMAScript只是一種語言規范,滿足該規范的語言都可以稱為“ECMAScript兼容”。現在比較出名的是JavaScript語言,早些年還有ActionScript(Flash使用的腳本語言)。
2.V8引擎
V8是一個由Google公司開發的開源JavaScript引擎,使用C++編寫,用于Google Chrome瀏覽器和Google Chromium瀏覽器。
V8在運行之前將JavaScript編譯成了機器代碼,而非字節碼或是解釋執行它,以此提升性能。此外,V8還使用了如內聯緩存(Inline Caching)等技術來提高性能。有了這些功能,JavaScript程序在V8引擎上的速度可以媲美二進制編譯程序的執行速度。
Node.js也因為采用了V8引擎才有如此高的JavaScript執行效率。
3.事件驅動
事件驅動程序設計(Event-Driven Programming)是一種計算機程序設計模型。這種模型的程序運行流程是由用戶的操作(如鼠標的按鍵、鍵盤的按鍵操作)或者是由其他程序的消息來驅動的。
事件驅動的程序至少會有一個事件隊列,當有新的請求進來時會被插入到隊列中,然后通過循環來檢測隊列中的事件,當發現有一個事件發生時就會調用回調函數。
Node.js的JavaScript(JS)線程是單線程運行的,通過一個事件循環(Event Loop)來循環取出消息隊列(Event Queue)中的消息進行處理,處理過程基本上就是去調用該消息對應的回調函數。
4.非阻塞I/O
I/O模型的一種,與之相對的還有阻塞I/O。
簡單來說,阻塞I/O就是進行I/O操作的時候,進程會被阻塞,直到I/O操作完成后進程才會解除阻塞狀態繼續執行。而非阻塞I/O在進行I/O操作時,進程不會被阻塞,進程繼續執行;如果需要知道I/O操作的結果,可以通過輪詢的方式。
5.Node.js的模塊架構
Node.js核心基于libuv框架,由C/C++編寫。圖1-1所示是Node.js的模塊架構圖。

圖1-1
6.Node standard library(Node標準庫)
Node.js標準庫由JavaScript編寫而成,它提供網絡、文件、事件等操作,可以認為是一層比較薄的API封裝層,實際的操作還是由底層來完成。
7.Node bindings(Node綁定層)
Node.js底層使用了大量的C/C++代碼,是高性能的保證。不過,JavaScript代碼是怎么和這些C/C++代碼相互調用的呢?這里不是使用了好幾種語言嗎?
一般來說,不同語言之間的規范不同,所以寫出來的代碼無法直接溝通,這時候就需要Bindings層,它是一些膠水代碼,能夠把不同的語言綁定在一起使其能夠相互溝通。在Node.js中,Bindings層所做的就是把底層的C/C++接口暴露給JavaScript環境,從而打通JavaScript與C/C++之間的相互調用。
8.libuv
libuv是提供異步功能的C庫。它在運行時負責一個事件循環(Event Loop)、一個線程池、文件系統I/O、DNS相關的I/O和網絡I/O,以及一些其他重要功能。
9.其他的C/C++組件和庫
如C-ares、http_parser、OpenSSL以及zlib等,這些依賴提供了對系統底層功能的訪問,比如網絡、壓縮、加解密,等等。