Node.js是用來干嘛的?(安裝npm的思考)

npm官網(wǎng)
安裝npm,先要安裝Node.js,那么Node.js是用來干嘛的呢?

簡(jiǎn)單的說Node.js是一種javascript的運(yùn)行環(huán)境,能夠使得javascript脫離瀏覽器運(yùn)行,google v8 引擎被嵌入到node.js當(dāng)中,用來解釋JavaScript語言
原文地址 Node.js is the New Black

譯文如下:
如果你去年注意過技術(shù)方面的新聞,我敢說你至少看到node.js不下一兩次。那么問題來了“node.js是什么?”。有些人沒準(zhǔn)會(huì)告訴你“這是一種通過JavaScript語言開發(fā)web服務(wù)端的東西”。如果這種晦澀解釋還沒把你搞暈,你沒準(zhǔn)會(huì)接著問:“為什么我們要用node.js?”,別人一般會(huì)告訴你:node.js有非阻塞,事件驅(qū)動(dòng)I/O等特性,從而讓高并發(fā)(high concurrency)在的輪詢(Polling)和comet構(gòu)建的應(yīng)用中成為可能。

當(dāng)你看完這些解釋覺得跟看天書一樣的時(shí)候,你估計(jì)也懶得繼續(xù)問了。不過沒事。我這篇文章就是在避開高端術(shù)語的同時(shí),幫助你你理解node.js的。

瀏覽器給網(wǎng)站發(fā)請(qǐng)求的過程一直沒怎么變過。當(dāng)瀏覽器給網(wǎng)站發(fā)了請(qǐng)求。服務(wù)器收到了請(qǐng)求,然后開始搜尋被請(qǐng)求的資源。如果有需要,服務(wù)器還會(huì)查詢一下數(shù)據(jù)庫,最后把響應(yīng)結(jié)果傳回瀏覽器。不過,在傳統(tǒng)的web服務(wù)器中(比如Apache),每一個(gè)請(qǐng)求都會(huì)讓服務(wù)器創(chuàng)建一個(gè)新的進(jìn)程來處理這個(gè)請(qǐng)求。

后來有了Ajax。有了Ajax,我們就不用每次都請(qǐng)求一個(gè)完整的新頁面了,取而代之的是,每次只請(qǐng)求需要的部分頁面信息就可以了。這顯然是一個(gè)進(jìn)步。但是比如你要建一個(gè)FriendFeed這樣的社交網(wǎng)站(類似人人網(wǎng)那樣的刷朋友新鮮事的網(wǎng)站),你的好友會(huì)隨時(shí)的推送新的狀態(tài),然后你的新鮮事會(huì)實(shí)時(shí)自動(dòng)刷新。要達(dá)成這個(gè)需求,我們需要讓用戶一直與服務(wù)器保持一個(gè)有效連接。目前最簡(jiǎn)單的實(shí)現(xiàn)方法,就是讓用戶和服務(wù)器之間保持長輪詢(long polling)。

HTTP請(qǐng)求不是持續(xù)的連接,你請(qǐng)求一次,服務(wù)器響應(yīng)一次,然后就完了。長輪訓(xùn)是一種利用HTTP模擬持續(xù)連接的技巧。具體來說,只要頁面載入了,不管你需不需要服務(wù)器給你響應(yīng)信息,你都會(huì)給服務(wù)器發(fā)一個(gè)Ajax請(qǐng)求。這個(gè)請(qǐng)求不同于一般的Ajax請(qǐng)求,服務(wù)器不會(huì)直接給你返回信息,而是它要等著,直到服務(wù)器覺得該給你發(fā)信息了,它才會(huì)響應(yīng)。比如,你的好友發(fā)了一條新鮮事,服務(wù)器就會(huì)把這個(gè)新鮮事當(dāng)做響應(yīng)發(fā)給你的瀏覽器,然后你的瀏覽器就刷新頁面了。瀏覽器收到響應(yīng)刷新完之后,再發(fā)送一條新的請(qǐng)求給服務(wù)器,這個(gè)請(qǐng)求依然不會(huì)立即被響應(yīng)。于是就開始重復(fù)以上步驟。利用這個(gè)方法,可以讓瀏覽器始終保持等待響應(yīng)的狀態(tài)。雖然以上過程依然只有非持續(xù)的Http參與,但是我們模擬出了一個(gè)看似持續(xù)的連接狀態(tài)

我們?cè)倏磦鹘y(tǒng)的服務(wù)器(比如Apache)。每次一個(gè)新用戶連到你的網(wǎng)站上,你的服務(wù)器就得開一個(gè)連接。每個(gè)連接都需要占一個(gè)進(jìn)程,這些進(jìn)程大部分時(shí)間都是閑著的(比如等著你好友發(fā)新鮮事,等好友發(fā)完才給用戶響應(yīng)信息。或者等著數(shù)據(jù)庫返回查詢結(jié)果什么的)。雖然這些進(jìn)程閑著,但是照樣占用內(nèi)存。這意味著,如果用戶連接數(shù)的增長到一定規(guī)模,你服務(wù)器沒準(zhǔn)就要耗光內(nèi)存直接癱了。

這種情況怎么解決?解決方法就是剛才上邊說的:非阻塞事件驅(qū)動(dòng)。這些概念在我們談的這個(gè)情景里面其實(shí)沒那么難理解。你把非阻塞的服務(wù)器想象成一個(gè)loop循環(huán),這個(gè)loop會(huì)一直跑下去。一個(gè)新請(qǐng)求來了,這個(gè)loop就接了這個(gè)請(qǐng)求,把這個(gè)請(qǐng)求傳給其他的進(jìn)程(比如傳給一個(gè)搞數(shù)據(jù)庫查詢的進(jìn)程),然后響應(yīng)一個(gè)回調(diào)(callback)。完事了這loop就接著跑,接其他的請(qǐng)求。這樣下來。服務(wù)器就不會(huì)像之前那樣傻等著數(shù)據(jù)庫返回結(jié)果了。

如果數(shù)據(jù)庫把結(jié)果返回來了,loop就把結(jié)果傳回用戶的瀏覽器,接著繼續(xù)跑。在這種方式下,你的服務(wù)器的進(jìn)程就不會(huì)閑著等著。從而在理論上說,同一時(shí)刻的數(shù)據(jù)庫查詢數(shù)量,以及用戶的請(qǐng)求數(shù)量就沒有限制了。服務(wù)器只在用戶那邊有事件發(fā)生的時(shí)候才響應(yīng),這就是事件驅(qū)動(dòng)。

FriendFeed是用基于Python的非阻塞框架Tornado (知乎也用了這個(gè)框架) 來實(shí)現(xiàn)上面說的新鮮事功能的。不過,Node.js就比前者更妙了。Node.js的應(yīng)用是通過javascript開發(fā)的,然后直接在Google的變態(tài)V8引擎上跑。用了Node.js,你就不用擔(dān)心用戶端的請(qǐng)求會(huì)在服務(wù)器里跑了一段能夠造成阻塞的代碼了。因?yàn)閖avascript本身就是事件驅(qū)動(dòng)的腳本語言。你回想一下,在給前端寫javascript的時(shí)候,更多時(shí)候你都是在搞事件處理和回調(diào)函數(shù)。javascript本身就是給事件處理量身定制的語言。

Node.js還是處于初期階段。如果你想開發(fā)一個(gè)基于Node.js的應(yīng)用,你應(yīng)該會(huì)需要寫一些很底層代碼。但是下一代瀏覽器很快就要采用WebSocket技術(shù)了,從而長輪詢也會(huì)消失。在Web開發(fā)里,Node.js這種類型的技術(shù)只會(huì)變得越來越重要。

以上。

參考文獻(xiàn):
Node.js是用來做什么的?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 第一次更新 查漏補(bǔ)缺昨晚零時(shí)寫的 辣雞輸入法導(dǎo)致錯(cuò)別字太多。 Node.js的到底是用來做什么的 在闡述之前我想放...
    熊蛋子17閱讀 29,677評(píng)論 1 24
  • 很多Node.js初學(xué)者都會(huì)有這樣的疑惑,Node.js到底是單線程的還是多線程的?通過本章的學(xué)習(xí),能夠讓讀者較為...
    越努力越幸運(yùn)_952c閱讀 3,685評(píng)論 4 36
  • Node.js是目前非?;馃岬募夹g(shù),但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,641評(píng)論 2 41
  • 我們都一樣,很多時(shí)候覺得迷茫又彷徨…… 想法很多,做的很少。聽到很多,感受的很少。 把很多的時(shí)間浪費(fèi)在許多的小事,...
    半夏sher閱讀 200評(píng)論 4 3
  • 不需要進(jìn)行邏輯性思考的工作,比如只是籠統(tǒng)的總結(jié)性質(zhì)的事情還是放在大腦不是很活躍的時(shí)刻,比如現(xiàn)在,雖然感覺勞累但還不...
    wmsj100閱讀 288評(píng)論 0 0