>[success] # 什么是Node.js
1. `Node.js`既不是語言,也不是框架,它是一個平臺,是一個可以讓`js`在脫離瀏覽器環境跑起來的環境,因此可以讓`JavaScript`運行在服務器端的開發平臺,是一個` JavaScript `運行時環境,使得`JavaScript`可以脫離瀏覽器運行在服務器端,實現了在服務器端使用`JavaScript`編寫高效、可擴展、可靠的網絡應用。Node**有著事件驅動、非阻塞I/O等特性,使得它非常適合編寫高并發的網絡應用。**
2. `Node.js`是一個基于`V8 JavaScript`引擎的`JavaScript`運行時環境,`V8`可以嵌入到任何**C ++應用程序中**,無論是`Chrome`還是`Node.js`,事實上都是嵌入了`V8`引擎來執行 `JavaScript`代碼

>[danger] ##### 使用場景
1. **Web應用程序**:Node.js可以用于搭建Web應用程序,如博客、在線商城、社交平臺等,它可以快速響應客戶端的請求,并且可以通過模塊化的設計和豐富的模塊庫,方便地開發出高效、可維護的應用程序。
2. **實時應用程序**:Node.js適用于實時應用程序,如聊天室、在線游戲、在線視頻等,因為它可以實現雙向通信和事件驅動,從而實現實時性。
3. **命令行工具**:Node.js可以用于開發命令行工具,如代碼打包工具、自動化工具等,它可以方便地進行文件讀寫、網絡請求等操作。
4. **IoT應用程序**:Node.js可以用于開發物聯網應用程序,如智能家居、智能健康等,因為它可以方便地進行數據采集、處理和通信。
5. **API服務**:Node.js可以用于開發API服務,如RESTful API服務、GraphQL服務等,它可以方便地進行數據處理和通信。
>[danger] ##### 特點
1. **高效性**:Node.js使用Chrome V8引擎作為其默認的JavaScript引擎,這個JavaScript引擎是目前最快的JavaScript引擎之一。同時,Node.js采用事件驅動和非阻塞I/O的編程方式,能夠充分利用CPU和內存資源,從而提高應用的性能和并發處理能力。
2. **跨平臺性**:Node.js可以運行于多個操作系統平臺,如Windows、Mac OS、Linux等。
3. 適合實時應用:Node.js適用于實時應用,如聊天室、在線游戲、在線視頻等,因為它可以實現雙向通信和事件驅動,從而實現實時性。
4. **社區活躍**:Node.js有一個龐大的開發者社區,提供了大量的開源模塊和工具,并且不斷地更新和改進,使得開發者能夠更加便捷地開發應用。
5. **安全性**:Node.js在設計時就考慮了安全性問題,它采用了沙箱機制、模塊化的設計和其他一些安全措施,可以有效地防止代碼注入等攻擊。
>[danger] ##### 優缺點
| 優點 | 缺點 |
| --- | --- |
| 高效性:使用Chrome V8引擎,采用事件驅動和非阻塞I/O的編程方式,能夠充分利用CPU和內存資源,提高應用的性能和并發處理能力。 | 不適合CPU密集型應用:由于Node.js采用單線程的方式,不適合CPU密集型應用,如圖形處理、視頻編碼等,因為這些應用需要大量的CPU計算資源。 |
| 跨平臺性:可以運行于多個操作系統平臺,如Windows、Mac OS、Linux等。 | 學習成本較高:Node.js使用JavaScript語言,對于初學者來說,需要學習JavaScript語言和異步編程模型等概念,需要一定的學習成本。 |
| 適合實時應用:適用于實時應用,如聊天室、在線游戲、在線視頻等,因為它可以實現雙向通信和事件驅動,從而實現實時性。 | 不適合大規模應用:由于Node.js采用單線程的方式,不適合大規模應用,如高并發的電商網站、金融交易系統等,因為這些應用需要高并發和高可用性。 |
| 社區活躍:擁有一個龐大的開發者社區,提供了大量的開源模塊和工具,并且不斷地更新和改進,使得開發者能夠更加便捷地開發應用。 | 一些模塊不穩定:由于Node.js是開源的,一些第三方模塊可能存在不穩定的問題,需要開發者自行選擇和測試。 |
| 安全性:在設計時就考慮了安全性問題,采用了沙箱機制、模塊化的設計和其他一些安全措施,可以有效地防止代碼注入等攻擊。 | 一些舊版本可能存在漏洞:由于Node.js的版本迭代較快,一些舊版本可能存在漏洞,需要開發者及時升級。 |
* **不適合大規模應用**
當應用程序需要處理大量并發請求時,Node.js的單線程模型可能會成為瓶頸,導致性能下降。在這種情況下,如果程序需要處理大量數據或者進行復雜的計算操作,那么Node.js的單線程模型可能無法滿足需求,因為單個線程的處理能力是有限的。此外,如果應用程序需要處理海量數據,例如大規模的電商網站、金融交易系統等,Node.js的單線程模型也可能無法滿足需求,因為這些應用需要高并發和高可用性。在這種情況下,通常采用多線程或者分布式架構來解決問題,而不是使用Node.js。
* **是否就不適合做網站**
不是的,Node.js在開發Web應用方面仍然非常適合。因為Web應用一般需要處理大量的I/O操作,例如讀寫數據庫、處理HTTP請求等,這些操作都是異步的,適合Node.js的事件驅動和非阻塞I/O的編程方式。而且Node.js還提供了很多優秀的Web框架,例如Express、Koa等,可以幫助開發者快速地開發Web應用。但是對于大規模的Web應用,Node.js的單線程模型可能會成為瓶頸,需要采用其他的解決方案,例如使用負載均衡、多線程等技術。
>[danger] ##### 應用場景
1. **聊天應用程序**:由于Node.js采用的是事件驅動和非阻塞I/O的編程方式,可以實現實時通信,因此非常適合開發實時聊天應用程序。
2. **實時數據處理**:例如監控和分析系統日志、實時統計用戶行為、實時處理交易數據等,Node.js可以快速處理大量的I/O操作和數據流,并且提供了很多優秀的數據處理庫,例如socket.io、RxJS等。
3. **中間層應用程序**:由于Node.js可以快速處理大量的I/O操作,可以用于開發中間層應用程序,例如API服務、Web代理、負載均衡等。
4. **大規模的網絡服務**:由于Node.js可以提供高并發和高性能的I/O操作,并且可以充分利用系統的資源,可以用于構建大規模的網絡服務,例如電商網站、社交網絡、在線游戲等。
>[danger] ##### 不適合場景舉說明
`node `在處理 CPU密集型任務時,通常是指**需要大量使用CPU資源的任務**,例如圖**像處理、視頻編解碼、加密解密、大數據處理、機器學習**等。這些任務需要進行大量的計算和處理,占用CPU的時間較長,因此會導致Node.js單線程被占用,無法同時處理其他的請求,從而導致程序的性能下降。 舉個例子,假設我們有一個Node.js應用程序,需要對大量的圖像進行處理,例如調整大小、裁剪、添加水印等。如果我們使用Node.js的單線程模型來處理這些圖像,可能會導致程序的響應時間變長,甚至會出現阻塞的情況。因為在處理圖像的過程中,需要進行大量的計算和處理,占用CPU的時間很長,而Node.js的單線程會被占用,無法同時處理其他的請求,從而影響程序的性能和可靠性。
**對比`Python`可以采用多線程或多進程模型**,以充分利用多核CPU的性能,可以同時處理多個任務,從而提高程序的性能和可靠性。 對于處理圖片大小和顏色的例子,Node.js需要按照順序依次處理圖片的大小和顏色,因為在單線程模型下只能處理一個任務。而Python可以使用多線程或多進程模型,同時處理圖片的大小和顏色,并最后將它們合并起來。這樣可以充分利用多核CPU的性能,提高程序的處理速度和穩定性。
>[danger] ##### 瀏覽器和Node.js架構區別
1. `Chrome`主要處理前端技術,如**DOM、CSS、HTML**等,`Node.js`主要處理后端技術,如**I/O、文件系統、網絡**等。
2. Node.js 不是瀏覽器,所以它**不具有瀏覽器提供的 DOM API**,比如 Window 對象、Location 對象、Document 對象、HTMLElement 對象、Cookie 對象等等。但是,Node.js 提供了自己特有的 API,比如全局的 global 對象,也提供了當前進程信息的 Process 對象,操作文件的 fs 模塊,以及創建 Web 服務的 http 模塊等等。這些 API 能夠讓我們使用 JavaScript 操作計算機,所以我們可以用 Node.js 平臺開發 web 服務器。
3. 二者都有 **JavaScript 引擎的內置對象**,這里對象是在所在的執行引擎提供的,這里目前說的是`v8`,例如**內置對象** Boolean、Number、String、Object、Symbol、Function、Array、Regexp、Set、Map、Promise、Proxy,**全局函數** eval、encodeURIComponent、decodeURIComponent等等,**基本的常量** undefined、null、NaN、Infinity;
* 雖然版本升級部分版本的node 也會支持一些瀏覽器特有的api,Fetch API 為例在nodeJs 18版本已經支持
| 特有API/模塊名稱 | 瀏覽器 | Node.js |
| --- | --- | --- |
| `DOM` | ?? | ? |
| `Web Workers` | ?? | ? |
| `IndexedDB` | ?? | ? |
| `localStorage` | ?? | ? |
| `WebSocket` | ?? | ? |
| `Canvas` | ?? | ? |
| `XMLHttpRequest` | ?? | ? |
| `WebGL` | ?? | ? |
| `CSSOM` | ?? | ? |
| `Fetch API` | ?? | ? |
| `File API` | ?? | ? |
| `Service Workers` | ?? | ? |
| `Performance` | ?? | ? |
| `Node.js REPL` | ? | ?? |
| `fs` | ? | ?? |
| `http` | ? | ?? |
| `crypto` | ? | ?? |
| `os` | ? | ?? |
| `process` | ? | ?? |
| `child_process` | ? | ?? |
| `stream` | ? | ?? |
>[danger] ##### Node.js 的基本架構
[medium.com](https://link.juejin.cn/?target=https%3A%2F%2Fmedium.com%2F%40chathuranga94%2Fnodejs-architecture-concurrency-model-f71da5f53d1d "https://medium.com/@chathuranga94/nodejs-architecture-concurrency-model-f71da5f53d1d")

上圖是 Node.js 的基本架構,我們可以看到,Node.js 是運行在操作系統之上的,它底層由 V8 JavaScript 引擎,以及一些 C/C++ 寫的庫構成,包括 libUV 庫、c-ares、llhttp/http-parser、open-ssl、zlib 等等。
其中,libUV 負責處理事件循環,c-ares、llhttp/http-parser、open-ssl、zlib 等庫提供 DNS 解析、HTTP 協議、HTTPS 和文件壓縮等功能。
在這些模塊的上一層是中間層,中間層包括`Node.js Bindings`、`Node.js Standard Library`以及`C/C++ AddOns`。`Node.js Bindings`層的作用是將底層那些用 C/C++ 寫的庫接口暴露給 JS 環境,而`Node.js Standard Library`是 Node.js 本身的核心模塊。至于`C/C++ AddOns`,它可以讓用戶自己的 C/C++ 模塊通過橋接的方式提供給`Node.js`。
中間層之上就是 Node.js 的 API 層了,我們使用 Node.js 開發應用,主要是使用 Node.js 的 API 層,所以 Node.js 的應用最終就運行在 Node.js 的 API 層之上。
>[danger] ##### Node.js 與 JavaScript 真要按分層 對比
[趣學 Node.js](https://juejin.cn/book/7196627546253819916/section/7195089399787290635)

* 最下面一層是**腳本語言規范(Spec)**,由于我們講的是 Node.js,所以這里最下層只寫 ECMAScript。
* 再往上一層就是**對于該規范的實現**了,如 JavaScript、JScript 以及 ActionScript 等都屬于對 ECMAScript 的實現。
* 然后就是**執行引擎**,JavaScript 常見的引擎有 V8、SpiderMonkey、QuickJS 等(其相關 Logo 如下圖所示)。
* 最上面就是**運行時環境**了,比如基于 V8 封裝的運行時環境有 Chromium、Node.js、Deno、CloudFlare Workers 等等。而我們所說的 Node.js 就是在運行時環境這一層。
>[danger] ##### Node.js 一些模塊
* File System 模塊:這是操作系統的目錄和文件的模塊,提供文件和目錄的讀、寫、創建、刪除、權限設置等等。
* Net 模塊:提供網絡套接字 socket,用來創建 TCP 連接,TCP 連接可以用來訪問后臺數據庫和其他持久化服務。
* HTTP 模塊:提供創建 HTTP 連接的能力,可以用來創建 Web 服務,也是 Node.js 在前端最常用的核心模塊。
* URL 模塊:用來處理客戶端請求的 URL 信息的輔助模塊,可以解析 URL 字符串。
* Path 模塊:用來處理文件路徑信息的輔助模塊,可以解析文件路徑的字符串。
* Process 模塊:用來獲取進程信息。
* Buffer 模塊:用來處理二進制數據。
* Console 模塊:控制臺模塊,同瀏覽器的Console模塊,用來輸出信息到控制臺。
* Crypto 加密解密模塊:用來處理需要用戶授權的服務。
* Events 模塊:用來監聽和派發用戶事件。
- 基礎
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 對比node 和java 使用場景
- node 模塊管理
- 內置模塊 -- buffer
- 內置模塊 -- fs
- fs -- 文件描述符
- fs -- 打開文件 api
- fs -- 文件讀取 api
- fs -- 文件寫入 api
- fs -- 創建目錄 api
- fs -- 讀取文件目錄結構 api
- fs -- 文件狀態(信息) api
- fs -- 刪除文件/目錄 api
- fs -- 重命名 api
- fs -- 復制文件 api
- 內置模塊 -- events
- 內置模塊 -- stream
- 可讀流 -- Readable
- 可寫流 -- Writable
- Duplex
- Transform
- 內置模塊 -- http
- http -- 從客戶端發起
- http -- 從服務端發起
- 內置模塊 -- url
- 網絡開發