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