Mosh的Node.js教程(一)

轉(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.jsNode是一個(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有什么特別之處扰魂?

  1. Node首先很容易上手麦乞,可以很好的適應(yīng)原型和敏捷的開(kāi)發(fā)工作
  2. 它也支持開(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)用的不二選擇
  3. Node應(yīng)用是用JavaScript編寫的膨处,所以如果你是熟悉JavaScript的前端開(kāi)發(fā)者,你就可以復(fù)用你的JavaScript知識(shí)砂竖,并轉(zhuǎn)為一個(gè)全棧開(kāi)發(fā)者真椿,并以此走上人生巔峰,你無(wú)需學(xué)習(xí)一門新語(yǔ)言
  4. 同時(shí)乎澄,因?yàn)槟憧梢酝瑫r(shí)在前后端使用JavaScript突硝,你的代碼將更簡(jiǎn)潔明了,你可以使用相同的命名規(guī)范置济、工具和最佳實(shí)踐
  5. 它有著強(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)境,比如校赤,如你所知在瀏覽器是有windowdocument對(duì)象的吆玖,這些對(duì)象允許我們操作代碼的運(yùn)行環(huán)境,直到2009年痒谴,瀏覽器是運(yùn)行JavaScript的唯一途徑衰伯。

Node的由來(lái)

2009年,Node的作者Ryan Dahl他想如果能在瀏覽器外運(yùn)行JavaScript將是極好的积蔚,所以他抽取了當(dāng)時(shí)最快的引擎意鲸,也就是GoogleV8,并用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++程序,抽離了ChromeV8引擎胶惰,所以這個(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)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涯雅,一起剝皮案震驚了整個(gè)濱河市鲜结,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌活逆,老刑警劉巖精刷,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異划乖,居然都是意外死亡贬养,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門琴庵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)误算,“玉大人仰美,你說(shuō)我怎么就攤上這事《瘢” “怎么了咖杂?”我有些...
    開(kāi)封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蚊夫。 經(jīng)常有香客問(wèn)我诉字,道長(zhǎng),這世上最難降的妖魔是什么知纷? 我笑而不...
    開(kāi)封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任壤圃,我火速辦了婚禮,結(jié)果婚禮上琅轧,老公的妹妹穿的比我還像新娘伍绳。我一直安慰自己,他們只是感情好乍桂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布冲杀。 她就那樣靜靜地躺著,像睡著了一般睹酌。 火紅的嫁衣襯著肌膚如雪权谁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天憋沿,我揣著相機(jī)與錄音旺芽,去河邊找鬼。 笑死卤妒,一個(gè)胖子當(dāng)著我的面吹牛甥绿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播则披,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼共缕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了士复?” 一聲冷哼從身側(cè)響起图谷,我...
    開(kāi)封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阱洪,沒(méi)想到半個(gè)月后便贵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冗荸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年承璃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚌本。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盔粹,死狀恐怖隘梨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舷嗡,我是刑警寧澤轴猎,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站进萄,受9級(jí)特大地震影響捻脖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜中鼠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一可婶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧援雇,春花似錦扰肌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盗舰。三九已至晶府,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钻趋,已是汗流浹背川陆。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛮位,地道東北人较沪。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像失仁,于是被迫代替她去往敵國(guó)和親尸曼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容