轉(zhuǎn)載
作者:大志前端
鏈接:https://juejin.cn/post/6844904056155013128
來(lái)源:掘金
著作權(quán)歸作者所有餐胀。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)橙喘,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處臭猜。
前言
本系列文章是根據(jù)Mosh
大佬的視頻教程全方位Node開(kāi)發(fā) - Mosh整理而成午衰,個(gè)人覺(jué)得視頻非常不錯(cuò)敌卓,所以計(jì)劃邊學(xué)習(xí)邊整理成文章方便后期回顧班缎。該視頻教程是英文的原茅,但是有中文字幕,感謝marking1212提供的中文字幕翻譯叛氨。
本篇文章大綱
- 什么是Node
- Node的設(shè)計(jì)結(jié)構(gòu)
- Node是如何工作的
- 安裝Node
- 你的第一個(gè)Node應(yīng)用
什么是Node滥朱?
Node.js
或Node
是一個(gè)開(kāi)源跨平臺(tái)的運(yùn)行環(huán)境,用來(lái)在瀏覽器外執(zhí)行JavaScript
代碼力试。
我們常用Node
來(lái)創(chuàng)建后端程序每强,我們更常說(shuō)API糯笙,也就是應(yīng)用程序接口,這些是用來(lái)支撐客戶端的服務(wù)滑频。
比如網(wǎng)絡(luò)應(yīng)用淳地,它們?cè)跒g覽器中運(yùn)行怖糊,或者手機(jī)應(yīng)用帅容,它們?cè)谑謾C(jī)中運(yùn)行,這些客戶端簡(jiǎn)單說(shuō)就是管理用戶所見(jiàn)和所做伍伤。
Node
是創(chuàng)建高擴(kuò)展性數(shù)據(jù)密集型和實(shí)時(shí)的后端服務(wù)并徘,去支持客戶端服務(wù)的理想工具。
Node有什么特別之處扰魂?
-
Node
首先很容易上手麦乞,可以很好的適應(yīng)原型和敏捷的開(kāi)發(fā)工作 - 它也支持開(kāi)發(fā)超速和高擴(kuò)展性服務(wù),它已經(jīng)應(yīng)用于多個(gè)大公司的系統(tǒng)劝评,比如PayPal姐直、優(yōu)步、Netflix蒋畜、沃爾瑪?shù)鹊壬贰?shí)際上在PayPal,他們使用了
Node
重構(gòu)了一個(gè)原來(lái)基于Java和Spring的應(yīng)用姻成,然后他們發(fā)現(xiàn)比起用Spring插龄,開(kāi)發(fā)速度快了一倍并只用更少的人,并且減少了三分之一的代碼科展,而且減少了四成的文件均牢,更重要的是他們實(shí)現(xiàn)了每秒服務(wù)效率的翻倍,同時(shí)使響應(yīng)時(shí)間減少了35%辛润,所以Node
是用于構(gòu)建高可擴(kuò)展性應(yīng)用的不二選擇 -
Node
應(yīng)用是用JavaScript
編寫的膨处,所以如果你是熟悉JavaScript
的前端開(kāi)發(fā)者,你就可以復(fù)用你的JavaScript
知識(shí)砂竖,并轉(zhuǎn)為一個(gè)全棧開(kāi)發(fā)者真椿,并以此走上人生巔峰,你無(wú)需學(xué)習(xí)一門新語(yǔ)言 - 同時(shí)乎澄,因?yàn)槟憧梢酝瑫r(shí)在前后端使用
JavaScript
突硝,你的代碼將更簡(jiǎn)潔明了,你可以使用相同的命名規(guī)范置济、工具和最佳實(shí)踐 - 它有著強(qiáng)大的生態(tài)和眾多開(kāi)源庫(kù)解恰,所以如果你想在應(yīng)用添加一些特性或者功能塊,你就可以使用很多免費(fèi)和開(kāi)源的庫(kù)
Node的設(shè)計(jì)結(jié)構(gòu)
Node
是一個(gè)運(yùn)行JavaScript
的環(huán)境浙于。
運(yùn)行環(huán)境是什么护盈?
在Node
之前,JavaScript
只能運(yùn)行在瀏覽器里羞酗,每個(gè)瀏覽器都有我們所說(shuō)的JavaScript
引擎腐宋,它將JavaScript
代碼轉(zhuǎn)換為機(jī)器才懂的機(jī)器碼。例如,微軟的Edge
瀏覽器使用的引擎是查克
拉胸竞,FireFox
的引擎是SpiderMonkey
欺嗤,Chrome
的引擎是V8
。
就是因?yàn)橐媸怯袔追N卫枝,所以JavaScript
的行為可能在瀏覽器之間會(huì)有不同煎饼。
瀏覽器提供了一個(gè)JavaScript
代碼的運(yùn)行環(huán)境,比如校赤,如你所知在瀏覽器是有window
或document
對(duì)象的吆玖,這些對(duì)象允許我們操作代碼的運(yùn)行環(huán)境,直到2009年痒谴,瀏覽器是運(yùn)行JavaScript
的唯一途徑衰伯。
Node的由來(lái)
2009年,Node
的作者Ryan Dahl
他想如果能在瀏覽器外運(yùn)行JavaScript
將是極好的积蔚,所以他抽取了當(dāng)時(shí)最快的引擎意鲸,也就是Google
的V8
,并用C++
編寫了一個(gè)程序封裝起來(lái)后取名為Node
尽爆,與瀏覽器類似怎顾,Node
也是一個(gè)JavaScript
的運(yùn)行環(huán)境,它包含了一個(gè)可以運(yùn)行JavaScript
代碼的引擎漱贱,但是它也包括一些用來(lái)提供環(huán)境的對(duì)象槐雾,這些對(duì)象與在瀏覽器中的對(duì)象不同,比方說(shuō)Node
里沒(méi)有document
對(duì)象幅狮,相反它有另一個(gè)對(duì)象提供了很多有趣的能力募强,比如說(shuō)我們可以操作文件系統(tǒng),或者列出對(duì)給定端口的請(qǐng)求崇摄,這些我們?cè)跒g覽器做不到擎值,所以Node
是一個(gè)包含JavaScript
引擎的程序,并提供給我們一些瀏覽器沒(méi)有的新特性逐抑,我們可以處理文件系統(tǒng)或者網(wǎng)絡(luò)請(qǐng)求等等鸠儿。
Node
它不是語(yǔ)言,它不是框架厕氨,它是一個(gè)用來(lái)運(yùn)行JavaScript代碼的運(yùn)行環(huán)境进每。
Node如何工作
Node
的高可擴(kuò)展性是因?yàn)?code>Node的無(wú)阻塞或者異步的特性。
什么是異步命斧?
舉個(gè)例子田晚,你去餐廳,服務(wù)員過(guò)來(lái)給你下單并給到廚房国葬,然后服務(wù)員就去服務(wù)其他客人肉瓦,并等待大廚做好菜遭京,所以同一個(gè)服務(wù)員可以服務(wù)很多張桌子,他在服務(wù)其他客人之前不用等著大廚做菜泞莉,這就是我們所說(shuō)的無(wú)阻塞或者異步的設(shè)計(jì)思路。
這就是Node
應(yīng)用的工作方式船殉。
服務(wù)員就好像等待需求的進(jìn)程鲫趁,所以一個(gè)進(jìn)程可以服務(wù)多個(gè)需求,對(duì)比無(wú)阻塞或者異步工作方式利虫,我們還有阻塞或者同步的設(shè)計(jì)挨厚。
什么是同步?
想象你去另一個(gè)餐廳糠惫,一個(gè)服務(wù)員過(guò)來(lái)點(diǎn)單疫剃,他下好單并給到了廚房,然后他就坐在廚房里硼讽,等大廚給你做好菜巢价,這段時(shí)間他什么都不做,只是等著固阁,他在給你送到餐之前不會(huì)去給其他客人下單壤躲,這就是我們所說(shuō)的阻塞或者同步的設(shè)計(jì)方式。
同步的弊端
這就是什么有些框架如C#
或者Rails
就很慢备燃,當(dāng)我們的服務(wù)收到一個(gè)請(qǐng)求碉克,一個(gè)進(jìn)程就被分配去處理這個(gè)請(qǐng)求,作為處理這個(gè)請(qǐng)求的一部分并齐,就好像我們?nèi)ゲ樵償?shù)據(jù)庫(kù)漏麦,如你所知,有時(shí)候我們需要等待它給我們結(jié)果况褪,當(dāng)數(shù)據(jù)庫(kù)執(zhí)行著一個(gè)查詢撕贞,那個(gè)進(jìn)程就在那里等待,它不能用于服務(wù)另一個(gè)客戶端窝剖,這樣就需要一個(gè)新的進(jìn)程來(lái)服務(wù)這個(gè)客戶端麻掸,想象一下,如果我們有非常多的客戶端赐纱,有時(shí)候我們需要開(kāi)啟所有進(jìn)程來(lái)響應(yīng)請(qǐng)求脊奋,這樣新的請(qǐng)求就要等待直到有進(jìn)程空閑,如果它不想等疙描,我們就需要增加新的硬件了诚隙,當(dāng)使用這種架構(gòu)的時(shí)候,你沒(méi)辦法做到物盡其用起胰,這就是阻塞或者同步結(jié)構(gòu)的弊端久又。就像asp.net
開(kāi)發(fā)的程序默認(rèn)就是這個(gè)模式巫延。
Node的優(yōu)勢(shì)
作為比較,Node
默認(rèn)就是以異步方式工作地消,你無(wú)需做任何額外工作炉峰,Node
中一個(gè)進(jìn)程可以服務(wù)所有請(qǐng)求,當(dāng)請(qǐng)求來(lái)脉执,這個(gè)進(jìn)程就去響應(yīng)疼阔,如果這時(shí)需要查詢數(shù)據(jù)庫(kù),這個(gè)進(jìn)程不會(huì)去等到數(shù)據(jù)庫(kù)返回結(jié)果半夷,當(dāng)數(shù)據(jù)庫(kù)正在執(zhí)行查詢的時(shí)候婆廊,這個(gè)進(jìn)程就被指派去服務(wù)另一個(gè)客戶端,當(dāng)數(shù)據(jù)庫(kù)準(zhǔn)備好結(jié)果了巫橄,它會(huì)給我們說(shuō)的事件隊(duì)列推一個(gè)消息淘邻,Node
持續(xù)在后臺(tái)監(jiān)聽(tīng)這個(gè)隊(duì)列,當(dāng)它發(fā)現(xiàn)隊(duì)列中有事件湘换,它就去取出事件并處理宾舅,這種特性使得Node
成為構(gòu)建桌面與網(wǎng)絡(luò)連接的理想工具,我們不用投入很多硬件就可以服務(wù)眾多用戶枚尼,這就是為什么Node
具有高可擴(kuò)展性的特點(diǎn)贴浙。
同樣,Node
不適用于密集運(yùn)算型的應(yīng)用署恍,比如視頻渲染或者圖片操作服務(wù)崎溃,這種類型的應(yīng)用需要CPU完成大量運(yùn)算,需要操作文件和網(wǎng)絡(luò)的極少盯质,因?yàn)?code>Node應(yīng)用是單線程的袁串,當(dāng)要給一個(gè)用戶提供運(yùn)算,其他的用戶就要等待呼巷,這就是為何Node
不能應(yīng)用于密集運(yùn)算囱修,它只適用創(chuàng)建數(shù)據(jù)密集型或者實(shí)時(shí)響應(yīng)的應(yīng)用,
安裝Node
查看電腦是否安裝了Node
王悍,打開(kāi)CMD
破镰,輸入
node --version
復(fù)制代碼
如果沒(méi)有安裝,打開(kāi)官網(wǎng)nodejs.org
压储,你可以看到有兩個(gè)選項(xiàng)鲜漩,我們選擇安裝LTS
這個(gè)穩(wěn)定的版本即可。
你的第一個(gè)Node應(yīng)用
打開(kāi)CMD
集惋,新建一個(gè)文件夾
mkdir first-app
復(fù)制代碼
然后進(jìn)入這個(gè)文件夾
cd first-app
復(fù)制代碼
然后再輸入
code .
復(fù)制代碼
打開(kāi)編輯器孕似,我這邊用的是VS Code
我們新建一個(gè)app.js
文件,在這里可以寫原生的JavaScript
代碼刮刑,就像你給瀏覽器寫的JS一樣喉祭。
我們定義一個(gè)函數(shù)
function sayHello(name) {
console.log('Hello ' + name)
}
復(fù)制代碼
然后調(diào)用這個(gè)函數(shù)
sayHello('Mosh')
復(fù)制代碼
為了運(yùn)行這個(gè)函數(shù)养渴,我們需要回到CMD
,運(yùn)行Node
泛烙,并將文件名作為參數(shù)理卑,也就是app.js
node app.js
復(fù)制代碼
Node
如我之前所說(shuō)是一個(gè)C++
程序,抽離了Chrome
的V8
引擎胶惰,所以這個(gè)app.js
文件傳給Node
傻工,Node
會(huì)把它傳給V8
來(lái)執(zhí)行。
可以看到在CMD
輸出了Hello Mosh
孵滞。
接下來(lái)我們打印一下window
對(duì)象,看看會(huì)發(fā)生什么鸯匹,我們?cè)?code>app.js輸入
console.log(window)
復(fù)制代碼
然后回到CMD
坊饶,再次執(zhí)行node app.js
,可以看到CMD
報(bào)了一個(gè)錯(cuò)誤:window is not defined
殴蓬。
這是因?yàn)?code>Node中沒(méi)有window
或者document
對(duì)象匿级,這些是在瀏覽器作為運(yùn)行環(huán)境才有的東西,在Node
中有另一個(gè)對(duì)象來(lái)操作文件染厅、使用操作系統(tǒng)或者網(wǎng)絡(luò)等等痘绎,后面我們會(huì)學(xué)習(xí)到的。
最后
感謝您的閱讀肖粮,希望對(duì)你有所幫助孤页。由于本人水平有限,如果文中有描述不當(dāng)?shù)牡胤缴荩瑹┱?qǐng)指正行施,非常感謝。
作者:大志前端
鏈接:https://juejin.cn/post/6844904056155013128
來(lái)源:掘金
著作權(quán)歸作者所有魂那。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)蛾号,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。