自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Node.js提速指南

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

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

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

基于事件

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

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

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

某種風格的非阻斷事件驅動虛擬代碼

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

另一種風格的非阻斷事件驅動虛擬代碼

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

JavaScript

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

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

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

創(chuàng)造歷程

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

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

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

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

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

優(yōu)點與缺點

人們常會說Node.js具備相當良好的可擴展性,其實對于Node.js而言,其中還有更深層次的特定含義:Node.jf,無論是內部還是其本身,比起很多其它技術都能夠更好地在單核心處理器上高效應對I/O綁定任務。但是,當打算使用更多的核心、或者希望通過更多系統(tǒng)運行Node.js應用程序時,我們必須回到較為傳統(tǒng)的擴展性處理模式:將Node.js應用程序運行于多個核心或系統(tǒng)中,并在其上設置負載平衡項目,以將工作量有效分散。因此,盡管將Node.js擴展到網絡上確實可行,但開發(fā)人員們最終還是要將全部底層終端技術部署到同一套網頁服務基礎設施中來。也就是說,要讓Node.js高效利用每個核心,也要為之部署很多不必要的分布式基礎設施。

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

接下來,為了滿足樂于進一步鉆研的讀者朋友,我們將對Node.js服務進行一次走馬觀花式的瀏覽,并提供一些特定的Node.js資源。

#p#

簡單的Node.js 服務實例

作為Node.js代碼實例,這里我們列舉一個略微過度設計的“世界你好”程序,該程序通過讀取/tmp文件夾中的文件找出招呼的來源:

  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/');  

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

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

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

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

這里還有很多其它內容。http庫被要求創(chuàng)建一套HTTP服務器。當該服務器上存在任何類型的請求時,所調用的都是定義過的函數。請注意,所有對象都能夠被傳遞給函數:此處請求對象將包含請求生成的信息,而響應對象則會被由請求所產生的程序響應所填充。

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

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

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

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

在這里,我們寫入響應頭。正在添加的是HTTP狀態(tài)200,之后媒體描述內容也將以純文本的形式寫入?,F(xiàn)在要做的工作是寫入響應內容并將響應發(fā)回服務器以繼續(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 函數是來自http庫的實用速記位;它可以寫成

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

res.end出于便于響應的目的而進行了擴展,其中一個字符串中通過允許該函數通過最終語句的形式包含了該響應。Res.end函數同時還向服務器發(fā)送了一個信號,指明該響應已經生成完畢,隨時可以發(fā)送。

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

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

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

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

Node.js 資源

Nodejs.org: Node.js平臺的主站點。在這里可以為Node.js下載資源代碼并查看每個版本的升級文檔。

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

howtonode.org: 一個專門闡釋Node.js相關技術的博客。

Node: Up and Running: 這是O’Reilly出版社專門為Node.js打造的開發(fā)專題網站,大家可以在這里在線閱讀大量資料。

NodeGuide.com: 由Felix Geisendörfer打造的Node.js選擇指南。

◆ NodeCloud.org: 一個匯總了上述及更多與Node.js相關的站點的資源目錄。

原文鏈接:

http://www.h-online.com/open/features/The-H-Speed-Guide-to-Node-js-1363974.html

【51CTO.com獨家特稿,非經授權謝絕轉載!合作媒體轉載請注明原文出處!】

【編輯推薦】

  1. Node.js初體驗
  2. 淘寶袁鋒:Node.js會令后端人員產生危機感
  3. 如何安裝Node.js
  4. Node.js入門之神秘的服務器端JavaScript
  5. 什么是Node.js?
責任編輯:陳貽新 來源: 51CTO
相關推薦

2015-03-10 10:59:18

Node.js開發(fā)指南基礎介紹

2021-02-01 15:42:45

Node.jsSQL應用程序

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技術

2020-09-28 06:57:39

Node.jsGraphQLAPI

2021-08-24 05:00:21

Nodejs線程

2011-09-09 14:23:13

Node.js

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2012-10-24 14:56:30

IBMdw

2021-08-25 06:33:52

Node.jsVscode調試工具

2021-12-25 22:29:57

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

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2015-06-23 15:27:53

HproseNode.js

2021-04-06 10:15:29

Node.jsHooks前端

2020-10-26 08:34:13

Node.jsCORS前端

2024-07-08 08:53:52

點贊
收藏

51CTO技術棧公眾號