- Node.js從入門到精通
- 明日科技編著
- 2772字
- 2024-12-28 11:40:06
1.1 認識Node.js
Node.js是當今網站開發中非常流行的一種技術,它以簡單易學、開發成本低、高并發等特點而深受廣大開發者歡迎,本節將對Node.js的基本概念、工作原理、優缺點,以及應用領域等進行介紹。
1.1.1 什么是Node.js
Node.js(簡稱Node)是一個開源的、基于Chrome V8引擎的服務器端JavaScript運行時環境,可以在瀏覽器環境以外的主機上解釋和運行JavaScript代碼,它發布于2009年5月,由谷歌工程師Ryan Dahl開發。Node.js支持現在大部分的主流瀏覽器,包括Chrome、Microsoft Edge和Opera等。Node.js主要由標準庫、中間層和底層庫這3部分組成,其架構如圖1.1所示。

圖1.1 Node.js架構圖
下面分別對圖1.1中的Node.js結構層進行介紹。
標準庫(Node standard library):提供了開發人員能夠直接進行調用并使用的一些API,如http模塊、stream流模塊、fs文件系統模塊等,可以使用JavaScript代碼直接調用。
中間層(Node binding):由于Node.js的底層庫采用C/C++實現,而標準庫中的JavaScript代碼無法直接與C/C++進行通信,因此提供了中間層,它在標準庫和底層庫之間起到了橋梁的作用,它封裝了底層庫中V8引擎和libuv等的實現細節,并向標準庫提供基礎API服務。
底層庫(C/C++實現):底層庫是Node.js運行的關鍵,它由C/C++實現,包括V8引擎、libuv、C-ares、OpenSSL、zlib等,它們的主要作用如下。
? V8引擎:Google的一個開源的JavaScript和WebAssembly引擎,使用C++語言編寫,用于Chrome瀏覽器和Node.js等。V8引擎主要是為了提高JavaScript的運行效率,因此它采用了提前編譯的方式,將JavaScript編譯為原生機器碼,這樣在執行階段程序的執行效率可以完全媲美二進制程序。
? libuv:一個專門為Node.js量身打造的跨平臺異步I/O庫,使用C語言編寫,提供了非阻塞的文件系統、DNS、網絡、子進程、管道、信號、輪詢和流式處理機制。Node.js會通過中間層將用戶的JavaScript代碼傳遞給底層庫的V8引擎進行解析,然后通過libuv進行循環調度,最后再返回給調用Node.js標準庫的應用。
? C-ares:一個用來處理異步DNS請求的庫,使用C語言編寫,對應Node.js中dns模塊提供的resolve()系列方法。
? OpenSSL:一個通用的加密庫,通常用于網絡傳輸中的TLS和SSL協議實現,對應Node.js中的tls、crypto模塊。
? zlib:一個提供壓縮和解壓支持的底層模塊。
說明
在Node.js中,libuv發揮著十分重要的作用,具體如下:
(1)libuv使用各平臺提供的事件驅動模塊實現異步,這使得它可以支持Node.js應用的非文件I/O模塊,并把相應的事件和回調封裝成I/O觀察者放到底層的事件驅動模塊中。當事件觸發時,libuv會執行I/O觀察者中的回調。
(2)1ibuv實現了一個線程池來支持Node.js中的文件I/O、DNS、用戶異步等操作。
1.1.2 Node.js的工作原理
通過上一節的講解,我們了解了Node.js的基本技術架構,本節進一步講解Node.js的工作原理。
1.事件驅動
Node.js采用一種獨特的事件驅動思想,將I/O操作作為事件響應,而不是阻塞操作,從而實現了事件函數的快速執行與錯誤處理。由于Node.js能夠采用異步非阻塞的方式訪問文件系統、數據庫、網絡等外部資源,因此,它能夠高效地處理海量的并發請求,極大地提高了應用程序的吞吐量。
2.單線程
Node.js采用單線程模型,只需要輕量級的線程即可處理大量的請求。與多線程模型相比,這種模型消除了線程之間的競爭,使得程序的穩定性大幅度提升。在Node.js的單線程模型中,所有的I/O操作都被放在事件隊列中,一旦事件出現,Node.js就會依次處理它們。事實上,大多數網站的服務器端都不會做太多的計算,它們接收到請求以后,把請求交給其他服務來處理(如讀取數據庫),然后等待結果返回,再把結果發給客戶端。因此,Node.js針對這一事實采用了單線程模型來處理,它不會為每個接入請求分配一個線程,而是用一個主線程處理所有的請求,然后對I/O操作進行異步處理,避開了創建、銷毀線程以及在線程間切換所需的開銷和復雜性。
3.非阻塞I/O
在傳統的I/O操作(例如,讀取或寫入磁盤文件,或者對遠程服務器進行網絡調用)中,當數據讀取或寫入操作發生時,程序會被阻塞,等數據讀取或寫入操作完成后才能進入下一步操作。但是,在Node.js中,所有的I/O操作都是非阻塞的,當某個I/O操作發生時,不是等待其執行完成才能進入下一步操作,而是直接回調相應的函數,從而實現了對外部資源的高效訪問。
4.事件循環
Node.js采用了一種特殊的設計方式—事件循環,它在工作線程池中維護一個任務隊列,當接到請求后,將該請求作為一個事件放入這個隊列中,然后繼續接收其他請求,同時,Node.js程序會不斷地從工作隊列中獲取要執行的事件,并通過事件循環流程對其進行處理。圖1.2給出了Node.js中事件循環的工作原理。

圖1.2 Node.js中事件循環的工作原理
事件循環的主要工作階段如下。
(1)計時器:處理由setTimeout()和setInterval()設置的回調。
(2)回調:運行掛起的回調函數。
(3)輪詢:檢索傳入的I/O事件并運行與I/O相關的回調。
(4)檢查:完成輪詢后立即運行回調。
(5)關閉回調:關閉事件和回調。
注意
無論是在Linux平臺還是Windows平臺上,Node.js內部都是通過線程池來完成異步I/O操作的,而libuv針對不同平臺的差異性實現了統一調用,因此Node.js的單線程僅僅是指JavaScript運行在單線程中,而并非Node.js是單線程的。
5.模塊化設計
在Node.js中,采用了一種模塊化的設計方式,按照功能模塊將代碼拆分成多個文件,使用require函數引入,從而提高了代碼的復用率,同時也增強了代碼的可維護性。另外,Node.js提供了許多內置模塊,如http模塊、fs模塊等,能夠幫助開發者快速搭建Web應用。
1.1.3 Node.js的優缺點
作為一種能夠同時進行前端和后端開發的“年輕”編程語言,Node.js既有優點也有缺點,下面分別進行介紹。
Node.js的優點如下。
前后端一體化開發:Node.js使用JavaScript作為開發語言,使得前端和后端都可以使用同一種語言進行開發,從而提高開發效率和代碼的可維護性。
豐富的模塊庫:Node.js的生態系統非常豐富,擁有大量的第三方模塊,使得開發者可以快速構建出各種類型的應用。
輕量級:Node.js采用模塊化開發方式,使得應用程序可以輕松地分解成小模塊,從而提高了可維護性和可擴展性。
易部署:使用Node.js開發的應用程序可以輕松地部署到各種云端平臺上。
Node.js的缺點如下。
缺少嚴格的類型檢查:Node.js是基于JavaScrpt的,它沒有嚴格的類型檢查,這既是它的優點,也是它的缺點,優點是開發自由度很高,但缺點是程序出現問題時,檢查調試會比較困難。
可靠性不如傳統后端語言:由于Node.js的相對年輕和快速迭代,它在可靠性和穩定性方面,相對傳統后端語言(如Java、C語言、C#等)還有一定的差距。
CPU密集型任務表現不佳:由于Node.js的單線程模型,當需要進行大量的CPU密集型計算時,可能會出現性能瓶頸,導致程序的運行效率下降。
1.1.4 Node.js能做什么
使用Node.js可以生成以下類型的應用程序。
HTTP Web服務器。
微服務或無服務器API后端。
用于數據庫訪問和查詢的驅動程序。
交互式命令行接口。
桌面應用程序。
實時物聯網(IoT)客戶端和服務器端。
適用于桌面應用程序的插件。
用于文件處理或網絡訪問的Shell腳本。
機器學習庫和模型。
1.1.5 誰在使用Node.js
前端最流行的JavaScript正在一步步走入后端,得益于V8引擎,Node.js為JavaScript運行在后端提供了運行環境,因此,它正在吸引越來越多的公司來使用它,比如用它創建協作工具、聊天工具、社交媒體應用程序等。
據不完全統計,現在已經有越來越多的國際和國內知名公司在內部使用了Node.js技術,如流媒體視頻網站Netflix、在線支付平臺PayPal、社交平臺LinkedIn、Node.js專業中文社區CNode、購物平臺淘寶網、騰訊官網等。
- UNIX編程藝術
- UML和模式應用(原書第3版)
- Mastering Zabbix(Second Edition)
- 摩登創客:與智能手機和平板電腦共舞
- TypeScript實戰指南
- C++新經典
- Mastering Android Development with Kotlin
- Natural Language Processing with Java and LingPipe Cookbook
- Python+Tableau數據可視化之美
- Web性能實戰
- Spring Security Essentials
- 機器學習微積分一本通(Python版)
- Python青少年趣味編程
- 計算機應用基礎(第二版)
- Python編程快速上手2