亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Node.js的基本知識簡單匯總

 更新時間:2016年09月19日 09:33:19   投稿:hebedich  
本文主要給大家簡單介紹了Node.js的基本知識,包括概念、特點、歷史、案例的相關資料,需要的朋友可以參考下

Node.js從2009年誕生至今,已經發(fā)展了兩年有余,其成長的速度有目共睹。從在github的訪問量超過Rails,到去年底Node.jsS創(chuàng)始人Ryan Dalh加盟Joyent獲得企業(yè)資助,再到今年發(fā)布Windows移植版本,Node.js的前景獲得了技術社區(qū)的肯定。InfoQ一直在關注Node.js的發(fā)展,在今年的兩次Qcon大會(北京站和杭州站)都有專門的講座。為了更好地促進Node.js在國內的技術推廣,我們決定開設“深入淺出Node.js”專欄,邀請來自Node.js領域的布道師、開發(fā)人員、技術專家來講述Node.js的各方面內容,讓讀者對Node.js有更深入的了解,并且能夠積極投入到新技術的討論和實踐中。

專欄的第一篇文章《什么是Node.js》嘗試從各個角度來闡述Node.js的基本概念、發(fā)展歷史、優(yōu)勢等,對該領域不熟悉的開發(fā)人員可以通過本文了解Node.js的一些基礎知識。

從名字說起

有關Node.js的技術報道越來越多,Node.js的寫法也是五花八門,有寫成NodeJS的,有寫成Nodejs的,到底哪一種寫法最標準呢,我們不妨遵循官方的說法。在Node.js的官方網站上,一直將其項目稱之為”Node“或者”Node.js“,沒有發(fā)現(xiàn)其他的說法,”Node“用的最多,考慮到Node這個單詞的意思和用途太廣泛,容易讓開發(fā)人員誤解,我們采用了第二種稱呼——”Node.js“,js的后綴點出了Node項目的本意,其他的名稱五花八門,沒有確切的出處,我們不推薦使用。

Node.js不是JS應用、而是JS運行平臺

看到Node.js這個名字,初學者可能會誤以為這是一個Javascript應用,事實上,Node.js采用C++語言編寫而成,是一個Javascript的運行環(huán)境。為什么采用C++語言呢?據(jù)Node.js創(chuàng)始人Ryan Dahl回憶,他最初希望采用Ruby來寫Node.js,但是后來發(fā)現(xiàn)Ruby虛擬機的性能不能滿足他的要求,后來他嘗試采用V8引擎,所以選擇了C++語言。既然不是Javascript應用,為何叫.js呢?因為Node.js是一個Javascript的運行環(huán)境。提到Javascript,大家首先想到的是日常使用的瀏覽器,現(xiàn)代瀏覽器包含了各種組件,包括渲染引擎、Javascript引擎等,其中Javascript引擎負責解釋執(zhí)行網頁中的Javascript代碼。作為Web前端最重要的語言之一,Javascript一直是前端工程師的專利。不過,Node.js是一個后端的Javascript運行環(huán)境(支持的系統(tǒng)包括*nux、Windows),這意味著你可以編寫系統(tǒng)級或者服務器端的Javascript代碼,交給Node.js來解釋執(zhí)行,簡單的命令類似于:

#node helloworld.jsNode.js

采用了Google Chrome瀏覽器的V8引擎,性能很好,同時還提供了很多系統(tǒng)級的API,如文件操作、網絡編程等。瀏覽器端的Javascript代碼在運行時會受到各種安全性的限制,對客戶系統(tǒng)的操作有限。相比之下,Node.js則是一個全面的后臺運行時,為Javascript提供了其他語言能夠實現(xiàn)的許多功能。

Node.js采用事件驅動、異步編程,為網絡服務而設計

事件驅動這個詞并不陌生,在某些傳統(tǒng)語言的網絡編程中,我們會用到回調函數(shù),比如當socket資源達到某種狀態(tài)時,注冊的回調函數(shù)就會執(zhí)行。Node.js的設計思想中以事件驅動為核心,它提供的絕大多數(shù)API都是基于事件的、異步的風格。以Net模塊為例,其中的net.Socket對象就有以下事件:connect、data、end、timeout、drain、error、close等,使用Node.js的開發(fā)人員需要根據(jù)自己的業(yè)務邏輯注冊相應的回調函數(shù)。這些回調函數(shù)都是異步執(zhí)行的,這意味著雖然在代碼結構中,這些函數(shù)看似是依次注冊的,但是它們并不依賴于自身出現(xiàn)的順序,而是等待相應的事件觸發(fā)。事件驅動、異步編程的設計(感興趣的讀者可以查閱筆者的另一篇文章《Node.js的異步編程風格》),重要的優(yōu)勢在于,充分利用了系統(tǒng)資源,執(zhí)行代碼無須阻塞等待某種操作完成,有限的資源可以用于其他的任務。此類設計非常適合于后端的網絡服務編程,Node.js的目標也在于此。在服務器開發(fā)中,并發(fā)的請求處理是個大問題,阻塞式的函數(shù)會導致資源浪費和時間延遲。通過事件注冊、異步函數(shù),開發(fā)人員可以提高資源的利用率,性能也會改善。

從Node.js提供的支持模塊中,我們可以看到包括文件操作在內的許多函數(shù)都是異步執(zhí)行的,這和傳統(tǒng)語言存在區(qū)別,而且為了方便服務器開發(fā),Node.js的網絡模塊特別多,包括HTTP、DNS、NET、UDP、HTTPS、TLS等,開發(fā)人員可以在此基礎上快速構建Web服務器。以簡單的helloworld.js為例:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(80, "127.0.0.1");

上面的代碼搭建了一個簡單的http服務器(運行示例部署在 http://helloworld.cnodejs.net/ 中,讀者可以訪問),在本地監(jiān)聽80端口,對于任意的http請求,服務器都返回一個頭部狀態(tài)碼為200、Content-Type'值為text/plain'的”Hello World“文字響應。從這個小例子中,我們可以看出幾點:

Node.js的網絡編程比較便利,提供的模塊(在這里是http)開放了容易上手的API接口,短短幾行代碼就可以構建服務器。

體現(xiàn)了事件驅動、異步編程,在createServer函數(shù)的參數(shù)中指定了一個回調函數(shù)(采用Javascript的匿名函數(shù)實現(xiàn)),當有http請求發(fā)送過來時,Node.js就會調用該回調函數(shù)來處理請求并響應。當然,這個例子相對簡單,沒有太多的事件注冊,在以后的文章中讀者會看到更多的實際例子。

Node.js的特點

下面我們來說說Node.js的特點。事件驅動、異步編程的特點剛才已經詳細說過了,這里不再重復。

Node.js的性能不錯。按照創(chuàng)始人Ryan Dahl的說法,性能是Node.js考慮的重要因素,選擇C++和V8而不是Ruby或者其他的虛擬機也是基于性能的目的。Node.js在設計上也是比較大膽,它以單進程、單線程模式運行(很吃驚,對吧?這和Javascript的運行方式一致),事件驅動機制是Node.js通過內部單線程高效率地維護事件循環(huán)隊列來實現(xiàn)的,沒有多線程的資源占用和上下文切換,這意味著面對大規(guī)模的http請求,Node.js憑借事件驅動搞定一切,習慣了傳統(tǒng)語言的網絡服務開發(fā)人員可能對多線程并發(fā)和協(xié)作非常熟悉,但是面對Node.js,我們需要接受和理解它的特點。由此我們是否可以推測出這樣的設計會導致負載的壓力集中在CPU(事件循環(huán)處理?)而不是內存(還記得Java虛擬機拋出OutOfMemory異常的日子嗎?),眼見為實,不如來看看淘寶共享數(shù)據(jù)平臺團隊對Node.js的性能測試:

物理機配置:RHEL 5.2、CPU 2.2GHz、內存4G

Node.js應用場景:MemCache代理,每次取100字節(jié)數(shù)據(jù)

連接池大?。?0

并發(fā)用戶數(shù):100

測試結果(socket模式):內存(30M)、QPS(16700)、CPU(95%)

從上面的結果,我們可以看到在這樣的測試場景下,qps能夠達到16700次,內存僅占用30M(其中V8堆占用22M),CPU則達到95%,可能成為瓶頸。此外,還有不少實踐者對Node.js做了性能分析,總的來說,它的性能讓人信服,也是受歡迎的重要原因。既然Node.js采用單進程、單線程模式,那么在如今多核硬件流行的環(huán)境中,單核性能出色的Node.js如何利用多核CPU呢?創(chuàng)始人Ryan Dahl建議,運行多個Node.js進程,利用某些通信機制來協(xié)調各項任務。目前,已經有不少第三方的Node.js多進程支持模塊發(fā)布,專欄后面的文章會詳細講述Node.js在多核CPU下的編程。

Node.js的另一個特點是它支持的編程語言是Javascript。關于動態(tài)語言和靜態(tài)語言的優(yōu)缺點比較在這里不再展開討論。只說三點:

var hostRequest = http.request(requestOptions,function(response) {
  var responseHTML ='';
  response.on('data', function (chunk) {
    responseHTML = responseHTML + chunk;
  });
  response.on('end',function(){
    console.log(responseHTML);
    // do something useful
  });
});

在上面的代碼中,我們需要在end事件中處理responseHTML變量,由于Javascript的閉包特性,我們可以在兩個回調函數(shù)之外定義responseHTML變量,然后在data事件對應的回調函數(shù)中不斷修改其值,并最終在end事件中訪問處理。

Javascript作為前端工程師的主力語言,在技術社區(qū)中有相當?shù)奶栒倭Α6?,隨著Web技術的不斷發(fā)展,特別是前端的重要性增加,不少前端工程師開始試水”后臺應用“,在許多采用Node.js的企業(yè)中,工程師都表示因為習慣了Javascript,所以選擇Node.js。

Javascript的匿名函數(shù)和閉包特性非常適合事件驅動、異步編程,從helloworld例子中我們可以看到回調函數(shù)采用了匿名函數(shù)的形式來實現(xiàn),很方便。閉包的作用則更大,看下面的代碼示例:

Javascript在動態(tài)語言中性能較好,有開發(fā)人員對Javacript、Python、Ruby等動態(tài)語言做了性能分析,發(fā)現(xiàn)Javascript的性能要好于其他語言,再加上V8引擎也是同類的佼佼者,所以Node.js的性能也受益其中。

Node.js發(fā)展簡史

2009年2月,Ryan Dahl在博客上宣布準備基于V8創(chuàng)建一個輕量級的Web服務器并提供一套庫。

2009年5月,Ryan Dahl在GitHub上發(fā)布了最初版本的部分Node.js包,隨后幾個月里,有人開始使用Node.js開發(fā)應用。

2009年11月和2010年4月,兩屆JSConf大會都安排了Node.js的講座。

2010年年底,Node.js獲得云計算服務商Joyent資助,創(chuàng)始人Ryan Dahl加入Joyent全職負責Node.js的發(fā)展。

2011年7月,Node.js在微軟的支持下發(fā)布Windows版本。

Node.js應用案例

雖然Node.js誕生剛剛兩年多,但是其發(fā)展勢頭逐漸趕超Ruby/Rails,我們在這里列舉了部分企業(yè)應用Node.js的案例,聽聽來自客戶的聲音。

在社交網站LinkedIn最新發(fā)布的移動應用中,NodeJS是該移動應用的后臺基礎。LinkedIn移動開發(fā)主管Kiran Prasad對媒體表示,其整個移動軟件平臺都由NodeJS構建而成:

LinkedIn內部使用了大量的技術,但是在移動服務器這一塊,我們完全基于Node。

(使用它的原因)第一,是因為其靈活性。第二,如果你了解Node,就會發(fā)現(xiàn)它最擅長的事情是與其他服務通信。移動應用必須與我們的平臺API和數(shù)據(jù)庫交互。我們沒有做太多數(shù)據(jù)分析。相比之前采用的Ruby on Rails技術,開發(fā)團隊發(fā)現(xiàn)Node在性能方面提高很多。他們在每臺物理機上跑了15個虛擬服務器(15個實例),其中4個實例即可處理雙倍流量。容量評估基于負載測試的結果。

企業(yè)社會化服務網站Yammer則利用Node創(chuàng)建了針對其自身平臺的跨域代理服務器,第三方的開發(fā)人員可以通過該服務器實現(xiàn)從自身域托管的Javascript代碼與Yammer平臺API的AJAX通信。Yammer平臺技術主管Jim Patterson對Node的優(yōu)點和缺點提出了自己的看法:

(優(yōu)點)因為Node是基于事件驅動和無阻塞的,所以非常適合處理并發(fā)請求,因此構建在Node上的代理服務器相比其他技術實現(xiàn)(如Ruby)的服務器表現(xiàn)要好得多。此外,與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,因此客戶端和服務器端都用同一種語言編寫,這是非常美妙的事情。

(缺點)Node是一個相對新的開源項目,所以不太穩(wěn)定,它總是一直在變,而且缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子。

知名項目托管網站GitHub也嘗試了Node應用。該Node應用稱為NodeLoad,是一個存檔下載服務器(每當你下載某個存儲分支的tarball或者zip文件時就會用到它)。GitHub之前的存檔下載服務器采用Ruby編寫。在舊系統(tǒng)中,下載存檔的請求會創(chuàng)建一個Resque任務。該任務實際上在存檔服務器上運行一個git archive命令,從某個文件服務器中取出數(shù)據(jù)。然后,初始的請求分配給你一個小型Ruby Sinatra應用等待該任務。它其實只是在檢查memcache flag是否存在,然后再重定向到最終的下載地址上。舊系統(tǒng)運行大約3個Sinatra實例和3個Resque worker。GitHub的開發(fā)人員覺得這是Node應用的好機會。Node基于事件驅動,相比Ruby的阻塞模型,Node能夠更好地處理git存檔。在編寫新下載服務器過程中,開發(fā)人員覺得Node非常適合該功能,此外,他們還里利用了Node庫socket.io來監(jiān)控下載狀態(tài)。

不僅在國外,Node的優(yōu)點也同樣吸引了國內開發(fā)人員的注意,淘寶就實際應用了Node技術:

MyFOX 是一個數(shù)據(jù)處理中間件,負責從一個MySQL集群中提取數(shù)據(jù)、計算并輸出統(tǒng)計結果。用戶提交一段SQL語句,MyFOX根據(jù)該SQL命令的語義,生成各個數(shù)據(jù)庫分片所需要執(zhí)行的查詢語句,并發(fā)送至各個分片,再將結果進行匯總和計算。 MyFOX的特點是CPU密集,無文件IO,并只處理只讀數(shù)據(jù)。起初MyFOX使用PHP編寫,但遇到許多問題。例如PHP是單線程的,MySQL又需要阻塞查詢,因此很難并發(fā)請求數(shù)據(jù),后來的解決方案是使用nginx和dirzzle,并基于HTTP協(xié)議實現(xiàn)接口,并通過curl_multi_get命 令進行請求。不過MyFOX項目組最終還是決定使用Node.js來實現(xiàn)MyFOX。

選擇Node.js有許多方面的原因,比如考慮了興趣及社區(qū)發(fā)展,同時也希望可以提高并發(fā)能力,榨干CPU。例如,頻繁地打開和關閉連接會讓大量端口處于等待狀態(tài),當并發(fā)數(shù)量上去之后,時常會因為端口不夠用(處于TIME_WAIT狀態(tài))而導致連接失敗。之前往往是通過修改系統(tǒng)設置來減少等待時間以繞開這個錯誤,然而使用連接池便可以很好地解決這個問題。此外,以前MyFOX會在某些緩存失效的情況下出現(xiàn)十分密集的訪問壓力,使用 Node.js便可以共享查詢狀態(tài),讓某些請求“等待片刻”,以便系統(tǒng)重新填充緩存內容。

小結

本文簡要介紹了Node.js的基本知識,包括概念、特點、歷史、案例等等。作為一個僅僅2歲的平臺,Node.js的發(fā)展勢頭有目共睹,越來越多的企業(yè)開始關注并嘗試Node.js,前后端開發(fā)人員應該了解相關的內容。

相關文章

  • node.js中的fs.createWriteStream方法使用說明

    node.js中的fs.createWriteStream方法使用說明

    這篇文章主要介紹了node.js中的fs.createWriteStream方法使用說明,本文介紹了fs.createWriteStream方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 詳解nodejs微信公眾號開發(fā)——3.封裝消息響應模塊

    詳解nodejs微信公眾號開發(fā)——3.封裝消息響應模塊

    上一篇文章:nodejs微信公眾號開發(fā)(2)自動回復,實現(xiàn)了簡單的關注回復。采用拼接字符串的形式,并不是很方便,這里我們將其封裝承接口。
    2017-04-04
  • Node.js視頻流應用創(chuàng)建之后端的全過程

    Node.js視頻流應用創(chuàng)建之后端的全過程

    這篇文章主要給大家介紹了關于創(chuàng)建Node.js視頻流應用之后端的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • 利用node.js實現(xiàn)反向代理的方法詳解

    利用node.js實現(xiàn)反向代理的方法詳解

    在實際工程開發(fā)中,會有前后端分離的需求。為了平滑的完成前端請求到后端各個獨立服務,需要一個中間件實現(xiàn)請求轉發(fā)的功能,利用Nginx可以實現(xiàn),在這里使用nodejs實現(xiàn)一個反向代理服務器。本文主要介紹了關于利用node.js實現(xiàn)反向代理的相關資料,需要的朋友可以參考下。
    2017-07-07
  • import與export在node.js中的使用詳解

    import與export在node.js中的使用詳解

    本篇文章主要介紹了import與export在node.js中的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 詳解node和ES6的模塊導出與導入

    詳解node和ES6的模塊導出與導入

    在本篇文章里小編給大家分享的是關于node和ES6的模塊導出與導入知識點,需要的朋友們可以參考下。
    2020-02-02
  • nodejs之base64編碼解碼問題

    nodejs之base64編碼解碼問題

    這篇文章主要介紹了nodejs之base64編碼解碼問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • node.js 全局變量的具體使用

    node.js 全局變量的具體使用

    這篇文章主要介紹了node.js 全局變量的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • express框架下使用session的方法

    express框架下使用session的方法

    這篇文章主要介紹了express框架下使用session的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Node.js環(huán)境下JavaScript實現(xiàn)單鏈表與雙鏈表結構

    Node.js環(huán)境下JavaScript實現(xiàn)單鏈表與雙鏈表結構

    Node環(huán)境下通過npm可以獲取list的幾個相關庫,但是我們這里注重于自己動手實現(xiàn),接下來就一起來看一下Node.js環(huán)境下JavaScript實現(xiàn)單鏈表與雙鏈表結構
    2016-06-06

最新評論