一. Node.js介紹
Node.js發(fā)布于2009年5月,由Ryan Dahl(瑞恩·達爾)在GitHub上發(fā)布了最初版本的部分Node.js包球化,隨后幾個月里,有人開始使用Node.js開發(fā)應(yīng)用
Node.js是一個基于Chrome JavaScript運行時建立的平臺签夭, 是一個Javascript運行環(huán)境
Node 是一個服務(wù)器程序, 用Javascript這個語言開發(fā)服務(wù)器
Node.js的實質(zhì)是對Chrome V8引擎進行了封裝
V8 JavaScript 引擎是 Google 用于其 Chrome 瀏覽器的底層 JavaScript 引擎
傳統(tǒng)意義上的 JavaScript 運行在瀏覽器上尝艘,這是因為瀏覽器內(nèi)核實際上分為兩個部分:渲染引擎和 JavaScript 引擎。前者負(fù)責(zé)渲染 HTML + CSS炕吸,后者則負(fù)責(zé)運行 JavaScript伐憾。Chrome 使用的 JavaScript 引擎是 V8,它的速度非澈漳#快
二树肃、Node.js的特點
單線程:
這里的單線程是指主線程為“單線程”,所有的阻塞部分交給部分的線程池處理瀑罗,然后這個主線程通過一個隊列跟線程池協(xié)作胸嘴,Node.js以單線程為基礎(chǔ)的,這個正是Node.js保持輕量級和高性能的關(guān)鍵斩祭。
非阻塞I/O
在Node.js提供的支持模塊中劣像,我們可以看到包括文件在內(nèi)的許多函數(shù)都是異步執(zhí)行的,這與傳統(tǒng)語言有著一定的區(qū)別停忿。為了方便服務(wù)器的開發(fā)驾讲,Node.js的網(wǎng)絡(luò)模塊特別多,包括HTTP席赂、DNS吮铭、net、UDP颅停、HTTPS谓晌、TLS等 ,開發(fā)人員可以快速的構(gòu)建web服務(wù)器癞揉。
一個異步I/O的大致流程:
(1) 發(fā)起I/O調(diào)用
用戶通過JavaScript代碼調(diào)用Node核心模塊纸肉,將參數(shù)和回調(diào)函數(shù)傳入核心模塊溺欧。
Node核心模塊會將傳入的參數(shù)和回調(diào)函數(shù)封裝成一個請求對象。
將這個請求對象推入I/O線程池等待執(zhí)行柏肪。
JavaScript發(fā)起的異步調(diào)用結(jié)束姐刁,JavaScript線程繼續(xù)執(zhí)行后續(xù)操作。
(2)執(zhí)行回調(diào)
I/O操作完成后會將結(jié)果存儲到請求對象的result屬性上烦味,并發(fā)出操作完成的通知聂使。每次事件循環(huán)時會檢查是否有完成的I/O操作,如果有就將請求對象加入觀察者隊列中谬俄,之后當(dāng)做事件處理柏靶。
處理I/O觀察者事件時會取出之前封裝在請求對象中的回調(diào)函數(shù),執(zhí)行這個回調(diào)函數(shù)溃论,并將result當(dāng)做參數(shù)屎蜓,以完成JavaScript回調(diào)的目的。
事件驅(qū)動
在某一些傳統(tǒng)語言的網(wǎng)絡(luò)編程中钥勋,我們會用到回調(diào)函數(shù)炬转,比如當(dāng)Socket資源達到某種狀態(tài)的時,注冊的回調(diào)函數(shù)就會執(zhí)行笔诵。Node.js的設(shè)計思想以事件驅(qū)動為核心返吻,它提供的絕大多數(shù)API都是基于事件的、異步的風(fēng)格乎婿。以Net模塊為例子测僵,其中的net.Socket對象有以下的事件:connect、data谢翎、end捍靠、timeout、drain森逮、error榨婆、close等。使用Node.js的開發(fā)人員需要根據(jù)自己的業(yè)務(wù)邏輯注冊相應(yīng)的回調(diào)函數(shù)褒侧。這些回調(diào)函數(shù)都是異步執(zhí)行的良风。這意味著雖然在代碼結(jié)構(gòu)中這些函數(shù)是依次注冊的,但是它們并不依賴于自身出現(xiàn)的順序闷供,而是等待相應(yīng)的事件觸發(fā)烟央。
事件驅(qū)動的優(yōu)勢在于充分利用了系統(tǒng)資源,執(zhí)行代碼無須等待某種操作完成歪脏,有限的資源可以用于其他的任務(wù)疑俭。Node.js的目標(biāo)是為后端的網(wǎng)絡(luò)服務(wù)編程,在服務(wù)器的開發(fā)中,并發(fā)的請求處理是一個大問題婿失,阻塞式的函數(shù)會導(dǎo)致資源的浪費和時間的延遲钞艇。通過事件的注冊啄寡、異步函數(shù),開發(fā)人員可以提高資源的利用率哩照,性能也會改善挺物。
三、Node.js優(yōu)缺點
Node.js優(yōu)點:
采用事件驅(qū)動葡秒、異步編程姻乓,為網(wǎng)絡(luò)服務(wù)而設(shè)計嵌溢。其實Javascript的匿名函數(shù)和閉包特性非常適合事件驅(qū)動眯牧、異步編程。而且JavaScript也簡單易學(xué)赖草,很多前端設(shè)計人員可以很快上手做后端設(shè)計学少。
Node.js非阻塞模式的IO處理給Node.js帶來在相對低系統(tǒng)資源耗用下的高性能與出眾的負(fù)載能力,非常適合用作依賴其它IO資源的中間層服務(wù)秧骑。
Node.js輕量高效版确,可以認(rèn)為是數(shù)據(jù)密集型分布式部署環(huán)境下的實時應(yīng)用系統(tǒng)的完美解決方案。Node非常適合如下情況:在響應(yīng)客戶端之前乎折,您預(yù)計可能有很高的流量绒疗,但所需的服務(wù)器端邏輯和處理不一定很多。
Node.js缺點:
可靠性低
單進程骂澄,單線程吓蘑,只支持單核CPU,不能充分的利用多核CPU服務(wù)器坟冲。
一旦這個進程崩掉磨镶,那么整個web服務(wù)就崩掉了。
四健提、Node.js使用介紹
Node.js使用Module模塊去劃分不同的功能琳猫,以簡化App開發(fā),Module就是庫私痹,跟組件化差不多脐嫂,一個功能一個庫。
NodeJS內(nèi)建了一個HTTP服務(wù)器紊遵,可以輕而易舉的實現(xiàn)一個網(wǎng)站和服務(wù)器的組合账千,不像PHP那樣,在使用PHP的時候癞蚕,必須先搭建一個Apache之類的HTTP服務(wù)器蕊爵,然后通過HTTP服務(wù)器的模塊加載CGI調(diào)用,才能將PHP腳本的執(zhí)行結(jié)果呈現(xiàn)給用戶
require() 函數(shù)桦山,用于在當(dāng)前模塊中加載和使用其他模塊攒射;