什麼是Node.js
一、什麼是Node.jsNode.js是Ryan Dahl於2009年5月基於Chrome V8引擎構建的一個開源和跨平臺的JavaScript執行環境。主要在Windows、Linux、Unix、MacOSX等不同平臺上執行。
拓展:Chrome V8引擎是谷歌開源的一個高效能JS引擎,並用在谷歌瀏覽器中,可以編譯、執行JS程式碼。
Node.js的發展
二、Node.js的發展• 2009年5月,Ryan Dahl在GitHub上釋出了最初版本的部分Node.js包。
• 2010年年底,Node.js獲得雲計算服務商Joyent資助,創始人Ryan Dahl加入Joyent全職負責Node.js的發展。
• 2011年7月,Node.js在微軟的支援下發布Windows版本。
• 2015年10月,Node.js 5.2.0版本成為首個LTS(長期支援)版本。
• 2016年年底,6.0版本支援95%以上的ES6特性,7.0版本透過flag支援async函式,全面支援99%的ES6特性。
• 2017年,釋出了7.6和8.0版本,可以不透過flag使用async函式和支援async Hooks、N-API等特性。
• 2018年,釋出了10.0和11.0版本,新增http2模組,將npm從v5.7更新到了v6,並且增強了對ESMModules的支援和增加了多執行緒Worker Threads。
三、Node.js 架構Node.js 架構
Node Standard Library:Node.js標準庫,對外提供的JavaScript介面,如模組http、buffer、fs、stream等。
Node bindings:是JavaScript與C++連線的橋樑,對下層模組進行封裝,向上層提供基礎的API介面。
V8:Google開源的高效能JavaScript引擎,使用C++開發,並且應用於谷歌瀏覽器。
Libuv:一個跨平臺的支援事件驅動的I/O庫。使用C和C++語言為Node.js所開發的,同時也是I/O操作的核心部分,如讀取檔案和OS互動。
C-ares:是一個非同步DNS解析庫。
Low-Level Components:提供了http解析、OpenSSL、資料壓縮(zlib)等功能。
Node.js的特點
四、Node.js的特點4.1 單執行緒
Node保持了JS在瀏覽器中單執行緒的特點。單執行緒最大好處是不用像多執行緒程式設計那樣處處在意狀態的同步問題,沒有死鎖的存在,也沒有執行緒上下文切換的開銷。
單執行緒也有其弱點,主要表現在三方面:無法利用多核CPU;錯誤會引起整個應用退出,應用的健壯性值得考研;大量計算會佔用CPU導致無法繼續呼叫非同步I/O。
為解決上述問題,Node.js使用child_process來解決單執行緒中大計算量的問題。透過將計算分發到各個子程序,可以將大量計算分解掉,然後再透過程序之間的事件訊息來傳遞結果。
4.2 非同步I/O
在Node.js中,絕大多數的操作都以非同步的方式進行呼叫,從檔案讀取到網路請求,均是如此。非同步I/O意味著每個呼叫之間無須等待之前的I/O呼叫結束,在程式設計模型上可以提升效率。如果存在兩個檔案讀取任務,最終的耗時只取決於最慢的那個檔案讀取耗時,對於同步I/O而言,他的耗時是兩個任務之和。
4.3 事件驅動機制
事件驅動機制
Node.js採用事件驅動和非同步回撥的機制。在執行程式碼的時候,主執行緒從上往下依次執行,遇到有需要回調的地方,就將此處加入到事件佇列中,然後主執行緒繼續往下走,直到執行結束以後才去執行事件佇列中的回撥。
Node.js去執行事件佇列中的事件時,如果遇到回撥,依然是按照順序新增進入事件佇列,主執行緒依次往下執行,遇到回撥就新增,直至執行完畢。
Node.js是一個單執行緒多程序的。Node.js程序建立一個迴圈,每個迴圈就是一個週期,在迴圈中會從事件佇列裡檢視是否有事件需要處理,如果有就去除事件並執行相關的函式。對於阻塞事件的處理在幕後使用執行緒池來確保工作的執行,而不佔用主迴圈流程。
4.4 跨平臺
Node.js是跨平臺的,即同樣的一套JS程式碼都可以部署執行在Windows、Linux、OSX等平臺。這主要得益於Node在作業系統與Node上層模組系統之間構建了一層平臺層架構libuv。
五、Node.js 適用場景5.1 I/O密集型場景
Node.js非同步I/O的特點使得他可以輕鬆面對I/O密集型的業務場景,處理效率將比同步I/O高,雖然同步I/O可以採用多執行緒或者多程序的方式進行,但是相比Node.js自帶非同步I/O的特性來說,將增加對記憶體和CPU的開銷。
5.2 高併發場景
針對高併發請求場景,Node.js的非同步I/O以及事件回撥特點可以高效的處理併發請求。
5.3 ResutFul API
這是Node.js最理想的應用場景,可以處理數萬條連線,本身沒有太多的邏輯,只需要請求API,組織資料進行返回即可。它本質上只是從某個資料庫中查詢一些值並將它們組成一個響應。由於響應是少量文字,入站請求也是少量的文字,因此流量不高,一臺機器甚至也可以處理最繁忙的公司的API需求。
5.4 基礎工具
可以做為基礎工具,前端領域中的編譯器、構建工具、搭建腳手架等。比較出名的例如 Webpack、Gulp 。
5.5 大量Ajax請求的應用
例如個性化應用,每個使用者看到的頁面都不一樣,快取失效時,需要在頁面載入的時候發起Ajax請求,Node.js能響應大量的併發請求。總而言之,Node.js適合運用在高併發、I/O密集、少量業務邏輯的場景。
結語