您好,登錄后才能下訂單哦!
小編給大家分享一下Node.js有哪些優勢,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
作為一名JS的粉忠實粉絲,雖然JS并沒有JAVA的生態圈這么大,但是JavaScript從客戶端腳本程序躋身服務器端,這讓我們要重視一下它,JavaScript它在慢慢崛起,我們要換一種眼光去學習它。
Node.js是什么?
Nodejs本質上是一個JavaScript的運行環境。
基于Google的V8引擎,實際上,是從Chrome上摳下的V8引擎并加以封裝的一個執行環境。
我們去官網下載包,傻瓜式安裝。
Node下載官網:https://nodejs.org/en/download/
在命令行輸入node 就能運行javaScript腳本。
Node.js的優勢?為什么腳本語言JavaScript能作為服務器語言?
優點 1 Node.js有超強的高并發能力
Node.js的首發目標,是提供一種簡單的,用語創建高性能服務器及在該服務器中運行各種應用程序的開發工具。
相對于Java,PHP或者.net 等經典服務器端語言中,Node.js正像一個年輕力勝的小伙子,Java語言會為每一個客戶端創建一個新的線程,而每一個客戶端連接創建一個線程,需要耗費2MB的內存。也就是說。理論上一個8GB的服務器可以同時連接用戶數為4000個左右,要存在高并發支持更多的用戶,必須要額外增加服務器。
Node.js不為每個客戶連接創建一個新的線程,而僅僅使用一個線程。
這就是Node基于單線程(只有一個主線程去接請求,給響應)
那這不是更慢嗎?事實上,并不是這樣。
Node.js當接收到一個用戶連接,就會觸發一個內部事件。通過事先定義好的函數,達到響應用戶的行為。Node.js主線程并不關心程序要走什么流程,實際上,有另外的工作線程去幫Node主線程去存取文件,讀數據庫,當工作線程讀取到文件數據,或數據庫里面的數據,就會把回調函數返回給Node主線程去執行,例如 把找到的數據傳回客戶端,關閉連接一些操作。(這就是Node非阻塞I/O,基于事件驅動)。
下面附上我畫的一張圖(如有不恰當之處請見諒哈)
這時候我們腦袋里面應該有個雛形,就是——Node.js主線程一直在接收請求和響應請求這個活里面倒騰,這樣它就可以不停地接收多個客戶端發過來的請求,它不用傻傻去等待IO操作,IO工作線程找到了數據,就會觸發事件回調函數告訴主線程數據已經拿到了,這時候主線就執行回調函數,把數據返回給客戶端。
理論上,一個8G內存的服務器,可以同時容納3到4萬用戶的連接。
這就是Node的閃光之處(單線程,非阻塞IO,事件驅動)
優點 2 Node用的就是JavaScript的語法
Node.JS 基于 javaScript 的 V8引擎,也就是說只要會JS的語法,就能用于后端開發,但是Node官方推薦用ECMA Script6(ES6)語法 。
Node打破了過去JavaScript只能在瀏覽器運行的局面,讓前后端編程環境統一,這樣就大大降低了開發成本。(這一點對前端開發人員非常友好,JS能做的東西越來越多,前端發展就越來越快)
優點 3 Node.JS 出現促成前端工程化思想
前端最近幾年發展迅速,Node.js起到不可替代的作用。
Node.js不僅僅是運行環境,也是一門脫胎換骨全新的JavaScript語言,它容納了JS語法基礎,還加入一些內部模塊
如:
http用來處理請求響應的模塊
fs 用來讀取文件的模塊
url 用來解析請求數據等等
const http = require('http')
Node.js還集成了 Npm 包管理工具,讓我們可以很方便的通過命令行就能下載我們項目依賴的包
如:
npm install jquery
npm install -g webpack
npm install -g create-react-app 等等
同樣,只要在項目里面進行引入就能使用
const Jquery = require('jquery');
Node 還支持 自定義模塊語法 ↓↓
const app =()=>{ //模塊代碼 } module.exports = app;
const app = require('module/app.js'); //引入自定義模塊
Node.js 在某種層面上影響著前端開發的模式。讓前端工程模塊化,開發迅速,降低代碼耦合度,可維護性大大增強。
下面列舉幾個Node.js應用場景
雖然以上列舉這么多Node.js的優點,但是沒有一門語言是沒有缺點,Node也不例外。只能是一門語言適用于什么場景和領域而已。
下面說說Node.js不適用的場景(加個大標題↓↓↓)
Node不適應的場景
在Node.js 0.8 版本之前,Node.js 不支持多線程。當然,這是一種設計哲學問題,因為Node.js的開發者和支持者堅信單線程和事件驅動的異步式編程比傳統的多線程編程運行效率更高。但事實上多線程可以達到同樣的吞吐量,盡管可能開銷不小,但不必為多核環境進行特殊的配置。相比之下,Node.js 由于其單線程性的特性,必須通過多進程的方法才能充分利用多核資源。
理想情況下,Node.js單線程在執行的過程中會將一個CPU核心完全占滿,所有的請求必須等待當前請求處理完畢以后進入事件循環才能響應。如果一個應用是計算密集型的,那么除非你手動將它拆散,否則請求響應延遲將會相當大。例如,某個事件的回調函數中要進行復雜的計算,占用CPU 200毫秒,那么事件循環中所有的請求都要等待200毫秒。為了提高響應速度,你唯一的辦法就是把這個計算密集的部分拆成若干個邏輯,這給編程帶來了額外的復雜性。即使這樣,系統的總吞吐量和總響應延遲也不會降低,只是調度稍微公平了一些。不過好在真正的Web 服務器中,很少會有計算密集的部分,如果真的有,那么它不應該被實現為即時的響應。正確的方式是給用戶一個提示,說服務器正在處理中,完成后會通知用戶,然后交給服務器的其他進程甚至其他專職的服務器來做這件事。
前面我們討論的通常都是服務器端編程,其中一個假設就是用戶數量很多。但如果面對的是單用戶,譬如本地的命令行工具或者圖形界面,那么所謂的大量并發請求就不存在了。于是另一個恐怖的問題出現了,盡管是單用戶,卻不一定是單任務。例如給用戶提供界面的同時后臺在進行某個計算,為了讓用戶界面不出現阻塞狀態,你不得不開啟多線程或多進程。而Node.js 線程或進程之間的通信到目前為止還很不便,因為它根本沒有鎖,因而號稱不會死鎖。Node.js 的多進程往往是在執行同一任務,通過多進程利用多處理器的資源,但遇到多進程相互協作時,就顯得捉襟見肘了。
Node.js 的控制流不是線性的,它被一個個事件拆散,但人的思維卻是線性的,當你試圖轉換思維來迎合語言或編譯器時,就不得不作出犧牲。舉例來說,你要實現一個這樣的邏輯:從銀行取錢,拿錢去購買某個虛擬商品,買完以后加入庫存數據庫,這中間的任何一步都可能會涉及數十次的I/O操作,而且任何一次操作失敗以后都要進行回滾操作。這個過程是線性的,已經很復雜了,如果要拆分為非線性的邏輯,那么其復雜程度很可能就達到無法維護的地步了。Node.js更善于處理那些邏輯簡單但訪問頻繁的任務,而不適合完成邏輯十分復雜的工作。
看完了這篇文章,相信你對“Node.js有哪些優勢”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。