偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Node.js提速指南

譯文
開(kāi)發(fā) 前端
沒(méi)有人奢望基于Node.js的各類(lèi)系統(tǒng)能夠一統(tǒng)web服務(wù)器這一龐大領(lǐng)域,但Node自身所具備的靈活性確實(shí)使其身影屢屢出現(xiàn)在各種各樣的任務(wù)處理流程之中。那么到底是哪些特色使得Node從以往那些web框架與平臺(tái)中脫穎而出呢?

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

51CTO推薦專(zhuān)題:Node.js專(zhuān)區(qū)

基于事件

傳統(tǒng)的阻斷程序

傳統(tǒng)的web請(qǐng)求處理流程分為幾步,即接收請(qǐng)求、進(jìn)行解析、等待必要資源載入、處理(無(wú)論需要多長(zhǎng)時(shí)間)以及返回響應(yīng)。由于整個(gè)過(guò)程中充斥著大量等待環(huán)節(jié),因此在同時(shí)處理兩個(gè)或者兩個(gè)以上請(qǐng)求時(shí)必須為每個(gè)請(qǐng)求分配一個(gè)獨(dú)立的線程來(lái)滿(mǎn)足執(zhí)行需求。需要處理的請(qǐng)求越多,我們需要的線程就越多,同時(shí)我們還要為每個(gè)線程的管理投入大量額外的資源。

基于事件的框架則采取完全不同的解決方案,不過(guò)這類(lèi)框架同時(shí)也要求我們使用不同的編碼方式。它們所利用的正是許多服務(wù)器應(yīng)用程序浪費(fèi)在等待I/O上的時(shí)間,嘗試將這些時(shí)間用在實(shí)實(shí)在在的工作上。執(zhí)行線程實(shí)際上只有一個(gè),但程序員將自己的代碼有機(jī)地加以分解,并把每一塊視為一次“事件”的出現(xiàn)。舉例來(lái)說(shuō),打開(kāi)一個(gè)文件當(dāng)然會(huì)帶來(lái)I/O時(shí)間,因此在以事件為主導(dǎo)的系統(tǒng)中,我們會(huì)下達(dá)“請(qǐng)開(kāi)始打開(kāi)一個(gè)文件,當(dāng)文件打開(kāi)工作完成后,再調(diào)回該功能。”這樣框架就會(huì)著手打開(kāi)文件,并把過(guò)程中需要用到的功能記錄下來(lái),***等待操作系統(tǒng)發(fā)來(lái)的文件打開(kāi)完成通知。一旦通知送達(dá),該事件將立即被觸發(fā),轉(zhuǎn)而調(diào)用所需功能。

某種風(fēng)格的非阻斷事件驅(qū)動(dòng)虛擬代碼

現(xiàn)在大家的***反應(yīng)可能是:“這難道不會(huì)使我的代碼在互連功能方面變得亂七八糟嗎?”答案是肯定的,如果大家的代碼在表現(xiàn)力上有所不足,那么這種負(fù)面現(xiàn)象的確會(huì)發(fā)生。舉例來(lái)說(shuō),如果各位選擇的是能夠處理匿名函數(shù)的語(yǔ)言,那么代碼可能會(huì)變成如下所示:

另一種風(fēng)格的非阻斷事件驅(qū)動(dòng)虛擬代碼

真正的區(qū)別在于,執(zhí)行時(shí)間在操作完成時(shí)并不會(huì)立即中止,而是會(huì)在底層操作系統(tǒng)通知任務(wù)結(jié)束后記錄接下來(lái)所要進(jìn)行的任務(wù)。事件驅(qū)動(dòng)類(lèi)編程能夠通過(guò)一系列語(yǔ)言實(shí)現(xiàn),可讀性與易用性也能夠加以控制——就Node.js而言,***候選語(yǔ)言無(wú)疑是JavaScript。

JavaScript

Node.js是為使用V8 JavaScript引擎所量身定制的,這款引擎同時(shí)也是Chrome瀏覽器的核心。該引擎被用于為Node提供執(zhí)行環(huán)境,并完成準(zhǔn)時(shí)化編譯及其它優(yōu)化項(xiàng)目。JavaScript語(yǔ)言從歷史層面來(lái)說(shuō)名聲并不算好,因?yàn)樗贿^(guò)多地濫用于瀏覽器動(dòng)畫(huà)處理,并且與名稱(chēng)中的Java毫不相干。不過(guò)在過(guò)去的十年中,開(kāi)發(fā)人員們已經(jīng)開(kāi)始發(fā)現(xiàn)JavaScript所具備的強(qiáng)大能力,尤其是在Scheme、Self以及Lisp方面,比起諸如Java、C與Pascal等程序語(yǔ)言,JavaScript的表現(xiàn)可以用驚艷來(lái)形容。將它視為Java的變種只能說(shuō)是種歷史的誤區(qū)。這種重新審視的起點(diǎn)來(lái)自由Douglas Crockford所撰寫(xiě)的《JavaScript:好的一面》,該文以Crockford的親身工作體會(huì)及同名講座為基礎(chǔ)(詳見(jiàn)以下谷歌技術(shù)講座視頻)。

JavaScript: 好的一面, 是由Doug Crockford推出的一次谷歌技術(shù)講座

Crockford指出,JavaScript故意提高了程序員對(duì)其的熟知感,但這也同時(shí)導(dǎo)致不少人誤以為不需要進(jìn)行有針對(duì)性的學(xué)習(xí);在這種論調(diào)的基礎(chǔ)上,他們大多沒(méi)有學(xué)習(xí)必要的基本理念。自以為了解JavaScript,或者說(shuō)自認(rèn)有能力用它為網(wǎng)頁(yè)添加編程功能的家伙不在少數(shù)。但他們***往往會(huì)驚訝地發(fā)現(xiàn),大多數(shù)JavaScript編碼,例如JavaScript中的每一個(gè)對(duì)象,實(shí)際上是一套關(guān)聯(lián)數(shù)組。盡管JavaScript運(yùn)行緩慢的惡名已經(jīng)廣為人知,但在近期的瀏覽器大戰(zhàn)中大部分競(jìng)爭(zhēng)者都在努力為所有的瀏覽器添加JavaScript加速機(jī)制。這個(gè)過(guò)程的意義在于像V8這樣的JavaScript引擎的誕生,同時(shí)也讓更多編程人員真正開(kāi)始熟悉JavaScript。將對(duì)JavaScript語(yǔ)言本身的理解及經(jīng)過(guò)加速的JavaScript引擎進(jìn)行結(jié)合,這種高效的結(jié)合體必然能為我們帶來(lái)更加光明的應(yīng)用前景……

創(chuàng)造歷程

Ryan Dahl, Node.js的創(chuàng)造者,其靈感來(lái)源于在利用Ruby網(wǎng)頁(yè)服務(wù)器以上傳文件為目的進(jìn)行進(jìn)度更新時(shí)所遇到的各種不便與問(wèn)題?!斑@么簡(jiǎn)單的事情執(zhí)行起來(lái)居然如此復(fù)雜,這讓我非常驚訝,”Dahl在2010年的一次采訪中如是說(shuō)。而動(dòng)態(tài)Ruby網(wǎng)頁(yè)服務(wù)Mongrel則給他留下了深刻的印象。這款由JavaScript“軍備競(jìng)賽”所提供的語(yǔ)言讓Dahl相信,web開(kāi)發(fā)人員能夠在它的幫助下更便捷地在瀏覽器中進(jìn)行工作;而他也將自己在事件驅(qū)動(dòng)服務(wù)方面的知識(shí)與該語(yǔ)言結(jié)合起來(lái),創(chuàng)建出了Node的最初版本。由于JavaScript缺乏服務(wù)器端庫(kù),Dahl與其它開(kāi)發(fā)人員一道創(chuàng)造出了服務(wù)器端的JavaScript標(biāo)準(zhǔn)庫(kù)。這就使得Node.js具備了凌駕于其它各類(lèi)事件驅(qū)動(dòng)型框架之上的優(yōu)勢(shì),因?yàn)槠鋷?kù)在編寫(xiě)中始終貫穿著事件驅(qū)動(dòng)這一理念;而在其它框架中,我們可以輕易發(fā)現(xiàn)那些標(biāo)準(zhǔn)庫(kù)無(wú)法調(diào)用的非事件痕跡,這種情況往往會(huì)導(dǎo)致創(chuàng)建受阻。

生態(tài)系統(tǒng)

Node.js的飛躍使得諸多在業(yè)界內(nèi)處于領(lǐng)先地位的web開(kāi)發(fā)者們將其作為自己的原型系統(tǒng)后端。這種普及的順利實(shí)現(xiàn)得益于可重用庫(kù)的功能性生態(tài)系統(tǒng)。NPM,即Node工具包管理器,目前其中已經(jīng)羅列了超過(guò)四千四百種工具包,其中較為常用的有像Underscore這樣的通用庫(kù)、像request這樣的簡(jiǎn)化庫(kù)以及像Jade這樣的模板引擎。在以一套庫(kù)支持大部分Node.js應(yīng)用的隊(duì)伍中,最引人注目的當(dāng)數(shù)Socket.io:它利用適當(dāng)連接自動(dòng)選取技術(shù),實(shí)現(xiàn)了客戶(hù)端與服務(wù)器之間的實(shí)時(shí)連接;根據(jù)瀏覽器的不同功能,它所采用的機(jī)制也分WebSockets、AJAX查詢(xún)、AJAX流等。這套庫(kù)使動(dòng)態(tài)web應(yīng)用程序的創(chuàng)建更為簡(jiǎn)便,它去除了辨別瀏覽器及管理連接工作中所固有的復(fù)雜性,并因此廣泛受到希望規(guī)范新的動(dòng)態(tài)web應(yīng)用程序的開(kāi)發(fā)者們的青睞。

Node.js應(yīng)用程序更有趣的一點(diǎn)是其作為應(yīng)用平臺(tái)的出現(xiàn);在WebOS 2.1中,該操作系統(tǒng)的開(kāi)發(fā)者們將其添加到自己的移動(dòng)平臺(tái)之上,借以創(chuàng)建利用JavaScript為本地應(yīng)用程序編寫(xiě)的本地服務(wù)項(xiàng)目。另一項(xiàng)值得稱(chēng)道的應(yīng)用就是其運(yùn)行于***發(fā)布的BeagleBone中,用戶(hù)可以登錄其上,借助網(wǎng)絡(luò)創(chuàng)建Node.js腳本,進(jìn)而控制該平臺(tái)及I/O端口。

Node.js獲得的來(lái)自生態(tài)系統(tǒng)的***助力源于Node.js 0.6.0,這是***具備Windows端口的Node版本。這很可能進(jìn)一步擴(kuò)大Node的潛在發(fā)展空間。

優(yōu)點(diǎn)與缺點(diǎn)

人們常會(huì)說(shuō)Node.js具備相當(dāng)良好的可擴(kuò)展性,其實(shí)對(duì)于Node.js而言,其中還有更深層次的特定含義:Node.jf,無(wú)論是內(nèi)部還是其本身,比起很多其它技術(shù)都能夠更好地在單核心處理器上高效應(yīng)對(duì)I/O綁定任務(wù)。但是,當(dāng)打算使用更多的核心、或者希望通過(guò)更多系統(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í)可行,但開(kāi)發(fā)人員們最終還是要將全部底層終端技術(shù)部署到同一套網(wǎng)頁(yè)服務(wù)基礎(chǔ)設(shè)施中來(lái)。也就是說(shuō),要讓Node.js高效利用每個(gè)核心,也要為之部署很多不必要的分布式基礎(chǔ)設(shè)施。

Node.js所無(wú)法替代的是web擴(kuò)展應(yīng)用程序中那些用于執(zhí)行繁重任務(wù)的計(jì)算及查詢(xún)服務(wù),就連V8這樣的高效JIT JavaScript編譯器也無(wú)法勝任此類(lèi)工作。同樣重要的是,我們必須認(rèn)識(shí)到Node.js并不是一款能夠作用于任何應(yīng)用程序的全新通用型平臺(tái),它只是現(xiàn)代系統(tǒng)架構(gòu)中的一種重要解決手段;這一手段最重要也是最有效的作用是作為“web粘合劑”存在,充當(dāng)其它各類(lèi)web應(yīng)用程序的連接組件。Node.js允許開(kāi)發(fā)人員迅速創(chuàng)建這種連接效果,一方面是因?yàn)榇蠹覍?duì)這種語(yǔ)言比較熟悉,另一方面則是事件驅(qū)動(dòng)模式使大家能夠更加高效地利用有限的資源。綜上所述,Node.js應(yīng)該作為對(duì)語(yǔ)言及平臺(tái)開(kāi)發(fā)人員常用工具的有益補(bǔ)充。當(dāng)然根據(jù)同樣的思路,開(kāi)發(fā)人員也完全可以出于個(gè)人的喜好而用Node.js完成整個(gè)應(yīng)用程序的編寫(xiě);這款框架有力地挑戰(zhàn)了傳統(tǒng)觀念中“JavaScript無(wú)法完成某些任務(wù)”的固有思維。

接下來(lái),為了滿(mǎn)足樂(lè)于進(jìn)一步鉆研的讀者朋友,我們將對(duì)Node.js服務(wù)進(jìn)行一次走馬觀花式的瀏覽,并提供一些特定的Node.js資源。

#p#

簡(jiǎn)單的Node.js 服務(wù)實(shí)例

作為Node.js代碼實(shí)例,這里我們列舉一個(gè)略微過(guò)度設(shè)計(jì)的“世界你好”程序,該程序通過(guò)讀取/tmp文件夾中的文件找出招呼的來(lái)源:

  1. var http = require('http');  
  2.    var fs = require('fs');  
  3.    http.createServer(function(req, res) {  
  4.        fs.readFile("/tmp/hellomsg.txt", function(error, text) {  
  5.            res.writeHead(200, {'Content-Type': 'text/plain'});  
  6.                if (error) {  
  7.                    res.end('Not ready to say hello...\n');  
  8.                }  
  9.                else  
  10.            {  
  11.                    res.end('Hello '+text+'\n');  
  12.                }  
  13.        });  
  14.    }).listen(1337, "127.0.0.1");  
  15.    console.log('Server running at http://127.0.0.1:1337/');  

逐行檢測(cè)將使我們從這里觀察到更多信息。

  1. var http = require('http');  
  2.    var fs = require('fs');  

JavaScript不具備任何可以作用于模塊的工具包系統(tǒng),因此Node.js使用的是Common.js協(xié)議以完成庫(kù)操作。Require函數(shù)將檢索庫(kù)并返回一個(gè)句柄;var http=將該值保存在“http”當(dāng)中。接下來(lái)我們重復(fù)“fs”處理,也就是文件系統(tǒng)庫(kù)。這些句柄可以用于在庫(kù)內(nèi)部調(diào)用函數(shù),如下列代碼所示…

  1. http.createServer(function (req, res) { 

這里還有很多其它內(nèi)容。http庫(kù)被要求創(chuàng)建一套HTTP服務(wù)器。當(dāng)該服務(wù)器上存在任何類(lèi)型的請(qǐng)求時(shí),所調(diào)用的都是定義過(guò)的函數(shù)。請(qǐng)注意,所有對(duì)象都能夠被傳遞給函數(shù):此處請(qǐng)求對(duì)象將包含請(qǐng)求生成的信息,而響應(yīng)對(duì)象則會(huì)被由請(qǐng)求所產(chǎn)生的程序響應(yīng)所填充。

但首先我們需要獲取打招呼目標(biāo)的文本信息…

  1. fs.readFile("/tmp/hellomsg.txt", function(error, text) { 

fs.readFile 函數(shù)需要一個(gè)能夠讀取的文件名,這樣它在讀取文件時(shí)就能夠調(diào)用我們即將指定的回調(diào)函數(shù)。該回調(diào)函數(shù)會(huì)傳遞兩個(gè)值,其內(nèi)容不是錯(cuò)誤信息就是文件內(nèi)容。在我們繼續(xù)下一步之前,需要簡(jiǎn)化整個(gè)流程并開(kāi)始創(chuàng)建響應(yīng)。響應(yīng)對(duì)象同樣具備協(xié)助建立響應(yīng)的函數(shù):

  1. res.writeHead(200, {'Content-Type': 'text/plain'}); 

在這里,我們寫(xiě)入響應(yīng)頭。正在添加的是HTTP狀態(tài)200,之后媒體描述內(nèi)容也將以純文本的形式寫(xiě)入?,F(xiàn)在要做的工作是寫(xiě)入響應(yīng)內(nèi)容并將響應(yīng)發(fā)回服務(wù)器以繼續(xù)傳遞…

  1. if (error) {  
  2.           res.end('Not ready to say hello...\n');  
  3.       }  
  4.       else  
  5.   {  
  6.           res.end('Hello '+text+'\n');  
  7.       }  

res.end 函數(shù)是來(lái)自http庫(kù)的實(shí)用速記位;它可以寫(xiě)成

  1. res.write('Hello '+text+'\n');  
  2.  res.end();  

res.end出于便于響應(yīng)的目的而進(jìn)行了擴(kuò)展,其中一個(gè)字符串中通過(guò)允許該函數(shù)通過(guò)最終語(yǔ)句的形式包含了該響應(yīng)。Res.end函數(shù)同時(shí)還向服務(wù)器發(fā)送了一個(gè)信號(hào),指明該響應(yīng)已經(jīng)生成完畢,隨時(shí)可以發(fā)送。

  1. });  
  2.  }).listen(1337, "127.0.0.1");  

根據(jù)函數(shù)的定義,創(chuàng)建得出的http服務(wù)器函數(shù)列表現(xiàn)在可以進(jìn)行調(diào)用,以通知其監(jiān)聽(tīng)位置…

  1. console.log('Server running at http://127.0.0.1:1337/'); 

而且控制臺(tái)可以發(fā)送消息,顯示我們正在運(yùn)行中的內(nèi)容。到此,我們就搭建起了一套簡(jiǎn)單的HTTP服務(wù)器。它處于連接等待狀態(tài),一旦連接形成,它就會(huì)切換為工作狀態(tài)并調(diào)用我們的函數(shù)。我們的函數(shù)要求讀取文件,而非中止請(qǐng)求;在文件打開(kāi)、讀取以及關(guān)閉步驟完成后,它會(huì)調(diào)用一個(gè)函數(shù)。所調(diào)用的這個(gè)函數(shù)負(fù)責(zé)以可閱讀的文本生成“你好”響應(yīng)并將其打包發(fā)回服務(wù)器。

Node.js 資源

Nodejs.org: Node.js平臺(tái)的主站點(diǎn)。在這里可以為Node.js下載資源代碼并查看每個(gè)版本的升級(jí)文檔。

◆ npmjs.org: Node軟件包管理器首頁(yè),這里有NPM的詳細(xì)安裝說(shuō)明。大家還可以在這里搜索或者瀏覽NPM軟件包。

howtonode.org: 一個(gè)專(zhuān)門(mén)闡釋Node.js相關(guān)技術(shù)的博客。

Node: Up and Running: 這是O’Reilly出版社專(zhuān)門(mén)為Node.js打造的開(kāi)發(fā)專(zhuān)題網(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

【51CTO.com獨(dú)家特稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載!合作媒體轉(zhuǎn)載請(qǐng)注明原文出處!】

【編輯推薦】

  1. Node.js初體驗(yàn)
  2. 淘寶袁鋒:Node.js會(huì)令后端人員產(chǎn)生危機(jī)感
  3. 如何安裝Node.js
  4. Node.js入門(mén)之神秘的服務(wù)器端JavaScript
  5. 什么是Node.js?
責(zé)任編輯:陳貽新 來(lái)源: 51CTO
相關(guān)推薦

2015-03-10 10:59:18

Node.js開(kāi)發(fā)指南基礎(chǔ)介紹

2021-02-01 15:42:45

Node.jsSQL應(yīng)用程序

2019-03-29 16:40:02

Node.js多線程前端

2014-08-01 09:57:52

Node.jsNode.js插件

2013-11-01 09:34:56

Node.js技術(shù)

2020-09-28 06:57:39

Node.jsGraphQLAPI

2021-08-24 05:00:21

Nodejs線程

2011-09-08 13:46:14

node.js

2011-11-01 10:30:36

Node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2021-08-25 06:33:52

Node.jsVscode調(diào)試工具

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2015-06-23 15:27:53

HproseNode.js

2012-02-03 09:25:39

Node.js

2020-10-26 08:34:13

Node.jsCORS前端

2021-04-06 10:15:29

Node.jsHooks前端

2024-07-08 08:53:52

2020-05-29 15:33:28

Node.js框架JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)