新聞中心
【經(jīng)典譯文】Node.js又被簡稱為Node,作為一款針對web開發(fā)者推出的web應(yīng)用程序平臺,它已經(jīng)在過去的一年中得到了相當(dāng)令人滿意的普及度。沒有人奢望基于Node.js的各類系統(tǒng)能夠一統(tǒng)web服務(wù)器這一龐大領(lǐng)域,但Node自身所具備的靈活性確實(shí)使其身影屢屢出現(xiàn)在各種各樣的任務(wù)處理流程之中。那么到底是哪些特色使得Node從以往那些web框架與平臺中脫穎而出呢?歸納起來有兩點(diǎn),基于事件以及JavaScript。

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括桐廬網(wǎng)站建設(shè)、桐廬網(wǎng)站制作、桐廬網(wǎng)頁制作以及桐廬網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,桐廬網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到桐廬省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
推薦專題:Node.js專區(qū)
基于事件
傳統(tǒng)的阻斷程序
傳統(tǒng)的web請求處理流程分為幾步,即接收請求、進(jìn)行解析、等待必要資源載入、處理(無論需要多長時(shí)間)以及返回響應(yīng)。由于整個(gè)過程中充斥著大量等待環(huán)節(jié),因此在同時(shí)處理兩個(gè)或者兩個(gè)以上請求時(shí)必須為每個(gè)請求分配一個(gè)獨(dú)立的線程來滿足執(zhí)行需求。需要處理的請求越多,我們需要的線程就越多,同時(shí)我們還要為每個(gè)線程的管理投入大量額外的資源。
基于事件的框架則采取完全不同的解決方案,不過這類框架同時(shí)也要求我們使用不同的編碼方式。它們所利用的正是許多服務(wù)器應(yīng)用程序浪費(fèi)在等待I/O上的時(shí)間,嘗試將這些時(shí)間用在實(shí)實(shí)在在的工作上。執(zhí)行線程實(shí)際上只有一個(gè),但程序員將自己的代碼有機(jī)地加以分解,并把每一塊視為一次“事件”的出現(xiàn)。舉例來說,打開一個(gè)文件當(dāng)然會帶來I/O時(shí)間,因此在以事件為主導(dǎo)的系統(tǒng)中,我們會下達(dá)“請開始打開一個(gè)文件,當(dāng)文件打開工作完成后,再調(diào)回該功能?!边@樣框架就會著手打開文件,并把過程中需要用到的功能記錄下來,***等待操作系統(tǒng)發(fā)來的文件打開完成通知。一旦通知送達(dá),該事件將立即被觸發(fā),轉(zhuǎn)而調(diào)用所需功能。
某種風(fēng)格的非阻斷事件驅(qū)動虛擬代碼
現(xiàn)在大家的***反應(yīng)可能是:“這難道不會使我的代碼在互連功能方面變得亂七八糟嗎?”答案是肯定的,如果大家的代碼在表現(xiàn)力上有所不足,那么這種負(fù)面現(xiàn)象的確會發(fā)生。舉例來說,如果各位選擇的是能夠處理匿名函數(shù)的語言,那么代碼可能會變成如下所示:
另一種風(fēng)格的非阻斷事件驅(qū)動虛擬代碼
真正的區(qū)別在于,執(zhí)行時(shí)間在操作完成時(shí)并不會立即中止,而是會在底層操作系統(tǒng)通知任務(wù)結(jié)束后記錄接下來所要進(jìn)行的任務(wù)。事件驅(qū)動類編程能夠通過一系列語言實(shí)現(xiàn),可讀性與易用性也能夠加以控制——就Node.js而言,***候選語言無疑是JavaScript。
JavaScript
Node.js是為使用V8 JavaScript引擎所量身定制的,這款引擎同時(shí)也是Chrome瀏覽器的核心。該引擎被用于為Node提供執(zhí)行環(huán)境,并完成準(zhǔn)時(shí)化編譯及其它優(yōu)化項(xiàng)目。JavaScript語言從歷史層面來說名聲并不算好,因?yàn)樗贿^多地濫用于瀏覽器動畫處理,并且與名稱中的Java毫不相干。不過在過去的十年中,開發(fā)人員們已經(jīng)開始發(fā)現(xiàn)JavaScript所具備的強(qiáng)大能力,尤其是在Scheme、Self以及Lisp方面,比起諸如Java、C與Pascal等程序語言,JavaScript的表現(xiàn)可以用驚艷來形容。將它視為Java的變種只能說是種歷史的誤區(qū)。這種重新審視的起點(diǎn)來自由Douglas Crockford所撰寫的《JavaScript:好的一面》,該文以Crockford的親身工作體會及同名講座為基礎(chǔ)(詳見以下谷歌技術(shù)講座視頻)。
JavaScript: 好的一面, 是由Doug Crockford推出的一次谷歌技術(shù)講座
Crockford指出,JavaScript故意提高了程序員對其的熟知感,但這也同時(shí)導(dǎo)致不少人誤以為不需要進(jìn)行有針對性的學(xué)習(xí);在這種論調(diào)的基礎(chǔ)上,他們大多沒有學(xué)習(xí)必要的基本理念。自以為了解JavaScript,或者說自認(rèn)有能力用它為網(wǎng)頁添加編程功能的家伙不在少數(shù)。但他們***往往會驚訝地發(fā)現(xiàn),大多數(shù)JavaScript編碼,例如JavaScript中的每一個(gè)對象,實(shí)際上是一套關(guān)聯(lián)數(shù)組。盡管JavaScript運(yùn)行緩慢的惡名已經(jīng)廣為人知,但在近期的瀏覽器大戰(zhàn)中大部分競爭者都在努力為所有的瀏覽器添加JavaScript加速機(jī)制。這個(gè)過程的意義在于像V8這樣的JavaScript引擎的誕生,同時(shí)也讓更多編程人員真正開始熟悉JavaScript。將對JavaScript語言本身的理解及經(jīng)過加速的JavaScript引擎進(jìn)行結(jié)合,這種高效的結(jié)合體必然能為我們帶來更加光明的應(yīng)用前景……
創(chuàng)造歷程
Ryan Dahl, Node.js的創(chuàng)造者,其靈感來源于在利用Ruby網(wǎng)頁服務(wù)器以上傳文件為目的進(jìn)行進(jìn)度更新時(shí)所遇到的各種不便與問題。“這么簡單的事情執(zhí)行起來居然如此復(fù)雜,這讓我非常驚訝,”Dahl在2010年的一次采訪中如是說。而動態(tài)Ruby網(wǎng)頁服務(wù)Mongrel則給他留下了深刻的印象。這款由JavaScript“軍備競賽”所提供的語言讓Dahl相信,web開發(fā)人員能夠在它的幫助下更便捷地在瀏覽器中進(jìn)行工作;而他也將自己在事件驅(qū)動服務(wù)方面的知識與該語言結(jié)合起來,創(chuàng)建出了Node的最初版本。由于JavaScript缺乏服務(wù)器端庫,Dahl與其它開發(fā)人員一道創(chuàng)造出了服務(wù)器端的JavaScript標(biāo)準(zhǔn)庫。這就使得Node.js具備了凌駕于其它各類事件驅(qū)動型框架之上的優(yōu)勢,因?yàn)槠鋷煸诰帉懼惺冀K貫穿著事件驅(qū)動這一理念;而在其它框架中,我們可以輕易發(fā)現(xiàn)那些標(biāo)準(zhǔn)庫無法調(diào)用的非事件痕跡,這種情況往往會導(dǎo)致創(chuàng)建受阻。
生態(tài)系統(tǒng)
Node.js的飛躍使得諸多在業(yè)界內(nèi)處于領(lǐng)先地位的web開發(fā)者們將其作為自己的原型系統(tǒng)后端。這種普及的順利實(shí)現(xiàn)得益于可重用庫的功能性生態(tài)系統(tǒng)。NPM,即Node工具包管理器,目前其中已經(jīng)羅列了超過四千四百種工具包,其中較為常用的有像Underscore這樣的通用庫、像request這樣的簡化庫以及像Jade這樣的模板引擎。在以一套庫支持大部分Node.js應(yīng)用的隊(duì)伍中,最引人注目的當(dāng)數(shù)Socket.io:它利用適當(dāng)連接自動選取技術(shù),實(shí)現(xiàn)了客戶端與服務(wù)器之間的實(shí)時(shí)連接;根據(jù)瀏覽器的不同功能,它所采用的機(jī)制也分WebSockets、AJAX查詢、AJAX流等。這套庫使動態(tài)web應(yīng)用程序的創(chuàng)建更為簡便,它去除了辨別瀏覽器及管理連接工作中所固有的復(fù)雜性,并因此廣泛受到希望規(guī)范新的動態(tài)web應(yīng)用程序的開發(fā)者們的青睞。
Node.js應(yīng)用程序更有趣的一點(diǎn)是其作為應(yīng)用平臺的出現(xiàn);在WebOS 2.1中,該操作系統(tǒng)的開發(fā)者們將其添加到自己的移動平臺之上,借以創(chuàng)建利用JavaScript為本地應(yīng)用程序編寫的本地服務(wù)項(xiàng)目。另一項(xiàng)值得稱道的應(yīng)用就是其運(yùn)行于***發(fā)布的BeagleBone中,用戶可以登錄其上,借助網(wǎng)絡(luò)創(chuàng)建Node.js腳本,進(jìn)而控制該平臺及I/O端口。
Node.js獲得的來自生態(tài)系統(tǒng)的***助力源于Node.js 0.6.0,這是***具備Windows端口的Node版本。這很可能進(jìn)一步擴(kuò)大Node的潛在發(fā)展空間。
優(yōu)點(diǎn)與缺點(diǎn)
人們常會說Node.js具備相當(dāng)良好的可擴(kuò)展性,其實(shí)對于Node.js而言,其中還有更深層次的特定含義:Node.jf,無論是內(nèi)部還是其本身,比起很多其它技術(shù)都能夠更好地在單核心處理器上高效應(yīng)對I/O綁定任務(wù)。但是,當(dāng)打算使用更多的核心、或者希望通過更多系統(tǒng)運(yùn)行Node.js應(yīng)用程序時(shí),我們必須回到較為傳統(tǒng)的擴(kuò)展性處理模式:將Node.js應(yīng)用程序運(yùn)行于多個(gè)核心或系統(tǒng)中,并在其上設(shè)置負(fù)載平衡項(xiàng)目,以將工作量有效分散。因此,盡管將Node.js擴(kuò)展到網(wǎng)絡(luò)上確實(shí)可行,但開發(fā)人員們最終還是要將全部底層終端技術(shù)部署到同一套網(wǎng)頁服務(wù)基礎(chǔ)設(shè)施中來。也就是說,要讓Node.js高效利用每個(gè)核心,也要為之部署很多不必要的分布式基礎(chǔ)設(shè)施。
Node.js所無法替代的是web擴(kuò)展應(yīng)用程序中那些用于執(zhí)行繁重任務(wù)的計(jì)算及查詢服務(wù),就連V8這樣的高效JIT JavaScript編譯器也無法勝任此類工作。同樣重要的是,我們必須認(rèn)識到Node.js并不是一款能夠作用于任何應(yīng)用程序的全新通用型平臺,它只是現(xiàn)代系統(tǒng)架構(gòu)中的一種重要解決手段;這一手段最重要也是最有效的作用是作為“web粘合劑”存在,充當(dāng)其它各類web應(yīng)用程序的連接組件。Node.js允許開發(fā)人員迅速創(chuàng)建這種連接效果,一方面是因?yàn)榇蠹覍@種語言比較熟悉,另一方面則是事件驅(qū)動模式使大家能夠更加高效地利用有限的資源。綜上所述,Node.js應(yīng)該作為對語言及平臺開發(fā)人員常用工具的有益補(bǔ)充。當(dāng)然根據(jù)同樣的思路,開發(fā)人員也完全可以出于個(gè)人的喜好而用Node.js完成整個(gè)應(yīng)用程序的編寫;這款框架有力地挑戰(zhàn)了傳統(tǒng)觀念中“JavaScript無法完成某些任務(wù)”的固有思維。
接下來,為了滿足樂于進(jìn)一步鉆研的讀者朋友,我們將對Node.js服務(wù)進(jìn)行一次走馬觀花式的瀏覽,并提供一些特定的Node.js資源。
#p#
簡單的Node.js 服務(wù)實(shí)例
作為Node.js代碼實(shí)例,這里我們列舉一個(gè)略微過度設(shè)計(jì)的“世界你好”程序,該程序通過讀取/tmp文件夾中的文件找出招呼的來源:
- var http = require('http');
- var fs = require('fs');
- http.createServer(function(req, res) {
- fs.readFile("/tmp/hellomsg.txt", function(error, text) {
- res.writeHead(200, {'Content-Type': 'text/plain'});
- if (error) {
- res.end('Not ready to say hello...\n');
- }
- else
- {
- res.end('Hello '+text+'\n');
- }
- });
- }).listen(1337, "127.0.0.1");
- console.log('Server running at http://127.0.0.1:1337/');
逐行檢測將使我們從這里觀察到更多信息。
- var http = require('http');
- var fs = require('fs');
JavaScript不具備任何可以作用于模塊的工具包系統(tǒng),因此Node.js使用的是Common.js協(xié)議以完成庫操作。Require函數(shù)將檢索庫并返回一個(gè)句柄;var http=將該值保存在“http”當(dāng)中。接下來我們重復(fù)“fs”處理,也就是文件系統(tǒng)庫。這些句柄可以用于在庫內(nèi)部調(diào)用函數(shù),如下列代碼所示…
- http.createServer(function (req, res) {
這里還有很多其它內(nèi)容。http庫被要求創(chuàng)建一套HTTP服務(wù)器。當(dāng)該服務(wù)器上存在任何類型的請求時(shí),所調(diào)用的都是定義過的函數(shù)。請注意,所有對象都能夠被傳遞給函數(shù):此處請求對象將包含請求生成的信息,而響應(yīng)對象則會被由請求所產(chǎn)生的程序響應(yīng)所填充。
但首先我們需要獲取打招呼目標(biāo)的文本信息…
- fs.readFile("/tmp/hellomsg.txt", function(error, text) {
fs.readFile 函數(shù)需要一個(gè)能夠讀取的文件名,這樣它在讀取文件時(shí)就能夠調(diào)用我們即將指定的回調(diào)函數(shù)。該回調(diào)函數(shù)會傳遞兩個(gè)值,其內(nèi)容不是錯(cuò)誤信息就是文件內(nèi)容。在我們繼續(xù)下一步之前,需要簡化整個(gè)流程并開始創(chuàng)建響應(yīng)。響應(yīng)對象同樣具備協(xié)助建立響應(yīng)的函數(shù):
- res.writeHead(200, {'Content-Type': 'text/plain'});
在這里,我們寫入響應(yīng)頭。正在添加的是HTTP狀態(tài)200,之后媒體描述內(nèi)容也將以純文本的形式寫入?,F(xiàn)在要做的工作是寫入響應(yīng)內(nèi)容并將響應(yīng)發(fā)回服務(wù)器以繼續(xù)傳遞…
- if (error) {
- res.end('Not ready to say hello...\n');
- }
- else
- {
- res.end('Hello '+text+'\n');
- }
res.end 函數(shù)是來自http庫的實(shí)用速記位;它可以寫成
- res.write('Hello '+text+'\n');
- res.end();
res.end出于便于響應(yīng)的目的而進(jìn)行了擴(kuò)展,其中一個(gè)字符串中通過允許該函數(shù)通過最終語句的形式包含了該響應(yīng)。Res.end函數(shù)同時(shí)還向服務(wù)器發(fā)送了一個(gè)信號,指明該響應(yīng)已經(jīng)生成完畢,隨時(shí)可以發(fā)送。
- });
- }).listen(1337, "127.0.0.1");
根據(jù)函數(shù)的定義,創(chuàng)建得出的http服務(wù)器函數(shù)列表現(xiàn)在可以進(jìn)行調(diào)用,以通知其監(jiān)聽位置…
- console.log('Server running at http://127.0.0.1:1337/');
而且控制臺可以發(fā)送消息,顯示我們正在運(yùn)行中的內(nèi)容。到此,我們就搭建起了一套簡單的HTTP服務(wù)器。它處于連接等待狀態(tài),一旦連接形成,它就會切換為工作狀態(tài)并調(diào)用我們的函數(shù)。我們的函數(shù)要求讀取文件,而非中止請求;在文件打開、讀取以及關(guān)閉步驟完成后,它會調(diào)用一個(gè)函數(shù)。所調(diào)用的這個(gè)函數(shù)負(fù)責(zé)以可閱讀的文本生成“你好”響應(yīng)并將其打包發(fā)回服務(wù)器。
Node.js 資源
◆ Nodejs.org: Node.js平臺的主站點(diǎn)。在這里可以為Node.js下載資源代碼并查看每個(gè)版本的升級文檔。
◆ npmjs.org: Node軟件包管理器首頁,這里有NPM的詳細(xì)安裝說明。大家還可以在這里搜索或者瀏覽NPM軟件包。
◆ howtonode.org: 一個(gè)專門闡釋Node.js相關(guān)技術(shù)的博客。
◆ Node: Up and Running: 這是O’Reilly出版社專門為Node.js打造的開發(fā)專題網(wǎng)站,大家可以在這里在線閱讀大量資料。
◆ NodeGuide.com: 由Felix Geisend?rfer打造的Node.js選擇指南。
◆ NodeCloud.org: 一個(gè)匯總了上述及更多與Node.js相關(guān)的站點(diǎn)的資源目錄。
原文鏈接:
http://www.h-online.com/open/features/The-H-Speed-Guide-to-Node-js-1363974.html
【.com獨(dú)家特稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載!合作媒體轉(zhuǎn)載請注明原文出處!】
【編輯推薦】
- Node.js初體驗(yàn)
- 淘寶袁鋒:Node.js會令后端人員產(chǎn)生危機(jī)感
- 如何安裝Node.js
- Node.js入門之神秘的服務(wù)器端JavaScript
- 什么是Node.js?
本文題目:Node.js提速指南
網(wǎng)址分享:http://www.5511xx.com/article/djoicij.html


咨詢
建站咨詢
