一秒拔、node的簡(jiǎn)介
1、在介紹node之前首先了解一下客戶端的javascript是怎么樣的飒硅?首先必須要明確幾個(gè)問(wèn)題:
1.1砂缩、什么是javascript?
????接觸過(guò)前端的同學(xué)都知道,javascript是一門運(yùn)行在瀏覽器端的腳本語(yǔ)言三娩,用來(lái)做客戶端頁(yè)面的交互庵芭。
1.2、 javascript的運(yùn)行環(huán)境
????故名思意他的運(yùn)行環(huán)境就是瀏覽器雀监,但是真的是這樣的嗎双吆?其實(shí)不然,他的真正運(yùn)行環(huán)境其實(shí)是運(yùn)行在瀏覽器內(nèi)核中的js引擎会前。為什么是這樣的了好乐?因?yàn)橥ㄋ讈?lái)講瀏覽器得作用就是用來(lái)瀏覽網(wǎng)頁(yè)得,我們?cè)跒g覽器除了執(zhí)行js外還能執(zhí)行其他得東西瓦宜,比如我們?cè)跒g覽器輸入一個(gè)地址敲回車就可以發(fā)送請(qǐng)求并且接收服務(wù)器得響應(yīng)蔚万。所以說(shuō)瀏覽器的第一功能是請(qǐng)求一個(gè)http地址,也就是可以封裝一個(gè)請(qǐng)求報(bào)文出來(lái)临庇,將一個(gè)url的地址封裝成一個(gè)請(qǐng)求報(bào)文反璃,這個(gè)報(bào)文到服務(wù)端昵慌,然后給我們一個(gè)響應(yīng)報(bào)文,然后在將響應(yīng)解析出來(lái)淮蜈,這也是瀏覽器的最大的作用贡必。當(dāng)然服務(wù)器響應(yīng)的內(nèi)容有可能不一樣句喜,比如說(shuō)服務(wù)器返回一個(gè)html文件,css文件,img文件白嘁,用來(lái)渲染梭灿,我們稱之為渲染引擎咽白,除此之外祥绞,還可以執(zhí)行js,由js引擎來(lái)完成未状,因此可以說(shuō)javascript的運(yùn)行環(huán)境是瀏覽器中的js引擎俯画,而不是瀏覽器。瀏覽器是一個(gè)大的概念司草。
1.3艰垂、瀏覽器中的javascript可以做什么?
????之前由提到過(guò)埋虹,javascrip就是用來(lái)做交互的猜憎,但是籠統(tǒng)的說(shuō)交互有點(diǎn)不明確,具體一點(diǎn)可以分為:“
????(1)操作dom(也就是對(duì)dom的增刪改搔课,注冊(cè)事件之類的事情)
????(2)發(fā)送AJAX請(qǐng)求/跨域
????(3)BOM交互如給我們提供頁(yè)面跳轉(zhuǎn)胰柑,歷史記錄,控制臺(tái)打印日志
????(4)ecmascript(js的核心語(yǔ)言爬泥,如用來(lái)定義變量柬讨,函數(shù)等)
1.4、瀏覽器端的javasscript不可以做什么袍啡?
????通過(guò)之前的了解踩官,貌似javascrip對(duì)我們?nèi)粘5慕换ザ伎梢酝瓿桑菜剖裁炊伎梢宰鼍呈洌撬灿胁荒茏龅氖抡崮怠H纾?br>
????(1)涉及到端對(duì)端的應(yīng)用程序,我們需要操作文件嗅剖,瀏覽器中的javascript是不能進(jìn)行文件操作的蛋逾,雖然h5里面提供了關(guān)于文件相關(guān)的API,但是這些API大多數(shù)只限于只讀的層面 窗悯,不能像傳統(tǒng)的語(yǔ)言如java,通過(guò)傳一個(gè)路徑,然后將對(duì)應(yīng)的文件讀出來(lái)偷拔,說(shuō)白了就是不能進(jìn)行文件和文件夾的CURD.
????(2)蒋院,瀏覽器端的javascript也沒(méi)有辦法去操作操作系統(tǒng)亏钩,如獲取操作系統(tǒng)的版本之類的。
????那么為什么不能進(jìn)行這兩類操作欺旧?其實(shí)是出于安全考慮姑丑,因?yàn)椋琷s這門語(yǔ)言運(yùn)行的環(huán)境比較特殊辞友,說(shuō)他特殊栅哀,特殊在什么地方?雖然我們編寫好的js代碼最終會(huì)放在服務(wù)器上称龙,但是他畢竟不是在服務(wù)器上執(zhí)行的留拾,而是通過(guò)服務(wù)器發(fā)送到瀏覽器端執(zhí)行的,在瀏覽器端執(zhí)行文件的操作顯然是不安全的鲫尊,因此說(shuō)這些功能在客戶端不是不能做痴柔,而是由于特殊的運(yùn)行環(huán)境沒(méi)法做。
1.5疫向、了解了客戶端的js所能做的事咳蔚,我們必須還要明確一個(gè)概念,那就是javascrip只能運(yùn)行在瀏覽器端嗎搔驼?
????前端開(kāi)發(fā)人員都知道谈火,javascrip是有ecmascrip語(yǔ)言,BOM舌涨,DOM組成的糯耍,在語(yǔ)言層面,她只是給我們提供一些操作語(yǔ)法泼菌,如定義變量谍肤,函數(shù),類型哗伯,流程控制等的操作荒揣。而B(niǎo)OM,DOM是瀏覽器提供的焊刹,并非es提供的系任。因此我們常提及的js其實(shí)就是es,js的大部分功能(DOm虐块,BOM(瀏覽器開(kāi)放出來(lái)的API)等的操作)都是由 瀏覽器的執(zhí)行引擎決定的 俩滥,這也衍生出一個(gè)觀點(diǎn),任何一門編程語(yǔ)言 贺奠,他的能力不是由語(yǔ)言本身決定的霜旧,而是由他的執(zhí)行環(huán)境決定的。比如說(shuō)java儡率,他即是一門語(yǔ)言也是一個(gè)平臺(tái)挂据,對(duì)于javascript來(lái)說(shuō)語(yǔ)言就是es以清,平臺(tái)是瀏覽器。那么js只能運(yùn)行在瀏覽器中嗎崎逃?非也掷倔!對(duì)于大多數(shù)語(yǔ)言,都是運(yùn)行 在一個(gè)平臺(tái)上的个绍,比如java只運(yùn)行在虛擬機(jī)上勒葱,但是也有運(yùn)行在多個(gè)平臺(tái)的語(yǔ)言, java在一定層面上來(lái)講是沒(méi)有必要運(yùn)行在多個(gè)平臺(tái)上的,因?yàn)樘摂M機(jī)是跨平臺(tái)(也就是跨操作系統(tǒng)如window巴柿,linux等)的凛虽。js同樣是可以運(yùn)行在多個(gè)平臺(tái)的,瀏覽器之所以能過(guò)運(yùn)行js篮洁,是因?yàn)樗蒵s的執(zhí)行引擎涩维。js同樣,只要由支持他的平臺(tái)就可以執(zhí)行袁波。因此說(shuō)要想語(yǔ)言有很強(qiáng)大的功能瓦阐,只需要提供強(qiáng)大的平臺(tái),node就是這樣一個(gè)平臺(tái)篷牌,能夠執(zhí)行js睡蟋,那么node到底是什么東西?接下來(lái)簡(jiǎn)述node是個(gè)什么鬼枷颊。
- 什么是node戳杀?
????根據(jù)官方文檔可以知道,node就是一個(gè)給予谷歌v8引擎的一個(gè)javascript的運(yùn)行時(shí)夭苗,可以理解為運(yùn)行js的一個(gè)虛擬機(jī)信卡。他使用的是一個(gè) 事件驅(qū)動(dòng),非阻塞I/O模型 题造,他是將js的運(yùn)行環(huán)境搬到了服務(wù)器端傍菇,和客戶端沒(méi)有一點(diǎn)關(guān)系。是一個(gè)純服務(wù)端的東西界赔,node只是為js提供了一個(gè)平臺(tái)丢习。node里面其實(shí)還分了兩塊,一是封裝了v8引擎淮悼,目的是為了執(zhí)行es(如定義變量咐低,定義函數(shù)等),另外一個(gè)提供了大量的工具庫(kù),是幫助node實(shí)現(xiàn)各種功能的袜腥,提供了一些以前js的環(huán)境辦不到的事情见擦,比如文件操作,網(wǎng)絡(luò)操作,操作系統(tǒng)的操作锡宋。
????既然node是一個(gè)平臺(tái)(所謂的平臺(tái)就是用來(lái)運(yùn)行特定語(yǔ)言的)儡湾,也就意味著node是用來(lái)運(yùn)行語(yǔ)言的,那么java也是語(yǔ)言执俩,node能運(yùn)行java嗎?據(jù)nodejs創(chuàng)始人Ryan Dahl回憶癌刽,他最初是選擇了Ruby這門語(yǔ)言役首,但是Ruby這門語(yǔ)言的虛擬機(jī)效率不怎么樣最終放棄了,按照這種思路显拜,貌似node將java的虛擬機(jī)集成進(jìn)來(lái)應(yīng)該可以運(yùn)行java衡奥,但node作者最終選擇了javascript。這樣js就實(shí)現(xiàn)了在服務(wù)端運(yùn)行的可能远荠,js運(yùn)行在node平臺(tái)上(分為v8部分矮固,用來(lái)執(zhí)行es,和大量的工具庫(kù)組件(API)稱之為libuv譬淳,提供了以前js的環(huán)境辦不到的事档址,如文件操作,網(wǎng)絡(luò)操作等等)邻梆。
????知道了什么是node,應(yīng)該還要清楚node在web中有什么用途守伸?
????(1)node可以接受客戶端用戶的所有請(qǐng)求,并且能夠快速的給出響應(yīng)浦妄,因此node可以用來(lái)做網(wǎng)站尼摹。
????(2)node可以作為一個(gè)中間層來(lái)來(lái)分發(fā)調(diào)用數(shù)據(jù)接口,比如有一個(gè)網(wǎng)站數(shù)據(jù)是有java提供的剂娄,我們可以讓node作為一個(gè)中間曾蠢涝,來(lái)接受用戶的請(qǐng)求,然后通過(guò)node來(lái)調(diào)用java數(shù)據(jù)接口阅懦,獲取到數(shù)據(jù)后直接在node層面做html的瓶裝和二,然后將渲染好的頁(yè)面直接給用戶。為什么要這樣做故黑,直接請(qǐng)求java接口不行嗎儿咱,這是因?yàn)閚ode被稱之為高性能的web服務(wù)器,在并發(fā)和抗壓方面都比傳統(tǒng)的平臺(tái)要好很多场晶,因此這樣一包裝可以極大的減輕服務(wù)器的開(kāi)發(fā)混埠。
????通過(guò)上面的兩點(diǎn),可以總結(jié)出诗轻,node在web中要么從前端頁(yè)面到后端服務(wù)全包了钳宪,一個(gè)是只做其中的一點(diǎn)。
????一言以蔽之,node就是一個(gè)javascript的運(yùn)行環(huán)境(平臺(tái))吏颖,他不是一門語(yǔ)言搔体,也不是javascript的框架“胱恚可以用來(lái)開(kāi)發(fā)服務(wù)端應(yīng)用程序疚俱,web系統(tǒng)。其特點(diǎn)是體積小缩多,快速呆奕,高性能。