理解Node.js(譯文)

正文

當(dāng)我向別人介紹Node.js 的時(shí)候一般會(huì)有兩種反應(yīng),要么是立馬就弄明白它是個(gè)什么玩意兒,要么是被它搞的很糊涂。

創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),凱里網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:凱里等地區(qū)。凱里做網(wǎng)站價(jià)格咨詢:028-86922220

如果你現(xiàn)在還處于后者,下面就是我對(duì)于node的解釋:

  • 它是一個(gè)命令行工具,你可以下載一個(gè)tarball文件,編譯然后安裝源文件;

  • 它可以讓你在你的終端輸入node my_app.js來(lái)運(yùn)行Javascript程序;

  • Node的JS代碼是由 V8 javascript 引擎(就是那個(gè)使得Chrome如此之快的東西)所執(zhí)行的;

  • Node提供了諸如訪問(wèn)網(wǎng)絡(luò)或是操作文件系統(tǒng)的Javascript API

“但我也可以用 Ruby, Python, Php,Java, ...等語(yǔ)言來(lái)做我想要做的事啊”

我聽(tīng)到你說(shuō)的話了,你是對(duì)的。Node不是狡猾的獨(dú)角獸,這點(diǎn)很抱歉,它不會(huì)幫你做你該做的事。它僅僅是一個(gè)工具,而且他也不會(huì)替代你現(xiàn)在所常用的一些工具,至少現(xiàn)在不會(huì)。

"說(shuō)重點(diǎn)?。?!"

好的,我會(huì)的,當(dāng)你需要同時(shí)做好幾件事的時(shí)候Node會(huì)表現(xiàn)的十分優(yōu)秀。你有寫了一段代碼然后對(duì)他說(shuō)"我想你可以并行運(yùn)行!"的體驗(yàn)嗎?哈哈哈,在Node中除了你的代碼所有的東西都是并行運(yùn)行的。

"啊?!"

是的,沒(méi)錯(cuò),除了你的代碼之外所有的代碼都是并行運(yùn)行的。為了理解這一點(diǎn),你可以把你自己的代碼想象成一個(gè)國(guó)王,而Node就是他的仆人軍隊(duì)。

新的一天是這樣開(kāi)始的:某個(gè)仆人叫醒了國(guó)王,然后問(wèn)他是否需要什么。國(guó)王給了這個(gè)仆人一個(gè)任務(wù)清單然后就回去繼續(xù)睡覺(jué)了。然后這個(gè)仆人就把任務(wù)清單上的任務(wù)分發(fā)下去,仆人們開(kāi)始工作了。

當(dāng)一個(gè)仆人完成了他的任務(wù)的時(shí)候,他就跑到國(guó)王寢宮外面排隊(duì)等候報(bào)告。國(guó)王一次只能聽(tīng)取一個(gè)仆人報(bào)告任務(wù),有的時(shí)候國(guó)王會(huì)在仆人報(bào)告結(jié)束的時(shí)候給他更多的任務(wù)。(看你代碼咋寫咯)

生活是美好的,因?yàn)閲?guó)王的諸多仆人同時(shí)執(zhí)行多個(gè)任務(wù),但報(bào)告結(jié)果的時(shí)候是一個(gè)一個(gè)來(lái)的,所以國(guó)王能夠很專注。

"那確實(shí)很美好,但你能結(jié)束這個(gè)愚蠢的比喻用更加geek的方式來(lái)告訴我嗎?"

好的,一個(gè)node程序或許是下面這樣的:

var fs = require('fs')  , sys = require('sys');//譯者注:sys is deprecated. Use util instead.這里我們直接用console.log即可fs.readFile('treasure-chamber-report.txt', function(report) {
  //sys.puts("oh, look at all my money: "+report);
  console.log("oh, look at all my money: "+report)});fs.writeFile('letter-to-princess.txt', '...', function() {
  //sys.puts("can't wait to hear back from her!");
  console.log("can't wait to hear back from her!")});

你的代碼(國(guó)王)給了node(仆人)兩個(gè)任務(wù)即讀(readFile)和寫(writeFile)文件,然后就去睡大覺(jué)了。一旦node完成了某個(gè)任務(wù),跟這個(gè)任務(wù)對(duì)應(yīng)的回調(diào)就會(huì)觸發(fā)。但同一時(shí)間只能有一個(gè)回調(diào)被觸發(fā),在那個(gè)回調(diào)執(zhí)行完成之前,所有其它的回調(diào)都得排隊(duì)等待。進(jìn)一步說(shuō),回調(diào)觸發(fā)的順序是不能被保證的。

"所以我不必?fù)?dān)心代碼在同一時(shí)間訪問(wèn)同一個(gè)數(shù)據(jù)結(jié)構(gòu)?"

你確實(shí)理解了,這就是JavaScript的單進(jìn)程/事件循環(huán)設(shè)計(jì)美麗的地方。

"好棒,但我為什么應(yīng)該用它呢?"

一個(gè)原因是效率。在一個(gè)web應(yīng)用中,響應(yīng)時(shí)間主要是花在了執(zhí)行數(shù)據(jù)庫(kù)查詢上面,而用node,你可以一次性執(zhí)行所有的數(shù)據(jù)庫(kù)查詢。將響應(yīng)時(shí)間減少到了執(zhí)行最慢的數(shù)據(jù)庫(kù)查詢所用的時(shí)間。

另一個(gè)原因是Javascript。你可以使用Node讓你的瀏覽器和后端共享代碼。Javascript也在漸漸成為一門真正的通用語(yǔ)言。不管你在過(guò)去是用Python, Ruby, Java, PHP, ...等等,你都或多或少的使用過(guò)Javasctipt,對(duì)嗎?

最后一個(gè)原因是原生速度。V8正在不斷的推進(jìn)作為地球上最快的動(dòng)態(tài)語(yǔ)言編譯器之一的邊界,我也想不到有任何其它的語(yǔ)言在速度上能夠像Javascript一樣不斷的高歌猛進(jìn)。再進(jìn)一步說(shuō),node的I/O設(shè)備真的十分的輕量,能夠讓你盡可能最大程度的利用系統(tǒng)的I/O容量。

"所以你是說(shuō)從現(xiàn)在開(kāi)始我應(yīng)該用Node寫我所有的應(yīng)用么?"

是也不是,一旦你開(kāi)始舞弄node這柄錘子,所有的東西都會(huì)開(kāi)始變得像釘子。但如果你當(dāng)前的工作有一個(gè)deadline新航道培訓(xùn),你可以參考下面的幾點(diǎn)來(lái)做決定用不用node:

  • 低響應(yīng)時(shí)間/高并發(fā)是否重要?Node真的很擅長(zhǎng)處理這倆問(wèn)題;

  • 項(xiàng)目有多大?小項(xiàng)目沒(méi)問(wèn)題,如果是大項(xiàng)目就應(yīng)該認(rèn)真評(píng)估了(可用的庫(kù),修復(fù)一個(gè)bug所需的資源或者two upstream等等)

"我能在Node中訪問(wèn)DOM嗎?"

這是一個(gè)好問(wèn)題!答案是不行,DOM是瀏覽器的東西嗎,不過(guò)幸好node的JS引擎(V8)跟那些混亂的東西是完全分離的。不過(guò),有人在以node模塊的形式來(lái)實(shí)現(xiàn)DOM,或許帶來(lái)令人興奮的可能性比如對(duì)客戶端代碼進(jìn)行單元測(cè)試。(譯者注:現(xiàn)在已經(jīng)有人實(shí)現(xiàn)了這個(gè)模塊,詳情查看Node-dom)。

"難道事件驅(qū)動(dòng)編程真的很難嗎?"

這取決于你自己,如果你已經(jīng)學(xué)會(huì)了如何在瀏覽器里調(diào)用Ajax或是調(diào)用某個(gè)事件,那么學(xué)習(xí)node對(duì)你不會(huì)是什么難題。

同時(shí),測(cè)試驅(qū)動(dòng)開(kāi)發(fā)能夠真正的幫助你從做一個(gè)可維護(hù)的設(shè)計(jì)開(kāi)始學(xué)習(xí)node。

"我應(yīng)該從哪里學(xué)到更多?"

Tim Caswell正在運(yùn)作優(yōu)秀的How To Node博客。在twitter上Follow nodejs。訂閱郵件列表。(譯者注:也可以結(jié)合Node.js 6.9.5 文檔進(jìn)行學(xué)習(xí),另外,譯者寫了一個(gè)node的小應(yīng)用node-sample可以clone下來(lái)看下)

后記

本篇文章的比如講真是有些簡(jiǎn)單了,但從現(xiàn)實(shí)事物中找到真正相對(duì)應(yīng)的也是在太難。,另外,由于時(shí)間原因,本文一些不妥之處或是當(dāng)時(shí)還處在實(shí)驗(yàn)性階段的東西譯者或刪或改。能力有限,水平一般,翻譯不妥之處,還望指正。感謝。

網(wǎng)站名稱:理解Node.js(譯文)
網(wǎng)站網(wǎng)址:http://muchs.cn/article8/jcjdip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航微信公眾號(hào)、Google網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)