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