【轉】Node.js究竟是用來作什麼的

Node.js的究竟是用來作什麼的

在闡述以前我想放一個連接,這是國外的一個大神,對於node.js很是好的一篇介紹的文章,英文比較好的朋友能夠直接去閱讀,本文也很大程度上參考了這篇文章,也同時感謝知乎用戶廠長對於本文的翻譯!原文題目爲Node.js is the New Blackjavascript

Node.js的簡介

根據維基百科對於Node.js的介紹,咱們能夠知道一些基本關於Node.js的狀況。Node.js是瑞安·達爾(Ryan Dahl)在2009年發明出來的一種一個可以在服務器端運行JavaScript,而且能夠開放源代碼,以及跨平臺運行JavaScript的一種運行環境。
Node.js採用了Google公司的V8引擎。Node.js容許經過JavaScript和一系列模塊來編寫服務器端應用和網絡相關的應用。核心模塊包括文件系統I/O、網絡(HTTP、TCP、UDP、DNS、TLS/SSL等)、二進制數據流、加密算法、數據流等等。Node模塊的API形式簡單,下降了編程的複雜度。
Node.js主要用於編寫像Web服務器同樣的網絡應用,這和PHP和Python是相似的。可是Node.js與其餘語言最大的不一樣之處在於,PHP等語言是阻塞的(只有前一條命令執行完畢纔會執行後面的命令),而Node.js是非阻塞的(多條命令能夠同時被運行,經過回調函數得知命令已結束運行)。
Node.js是事件驅動的。開發者能夠在不使用線程的狀況下開發出一個可以承載高併發的服務器。其餘服務器端語言難以開發高併發應用,並且即便開發出來,性能也不盡人意。Node.js正是在這個前提下被創造出來。Node.js把JavaScript的易學易用和Unix網絡編程的強大結合到了一塊兒。
Node.js使用Google V8 JavaScript 引擎,由於前端

  • V8是基於BSD許可證的開源軟件
  • V8速度很是快
  • V8專一於網絡功能,在HTTP、DNS、TCP等方面更加成熟

Node.js已經有數十萬模塊,它們能夠經過一個名爲npm的管理器免費下載。Node.js開發社區主要有兩個郵件列表、一個在freenode的名爲#node.js的IRC頻道。社區集中在NodeConfjava

雜敘

在學習Web前端的朋友看來,Node.js是一個常常會聽到並且沒法迴避的問題,然而國內的資料相對較少,國外的資料大多數是以英文爲主要藍本闡述的,因此友好度並不高,我結合最近查詢到的資料,結合本身淺薄的看法,作出一點點介紹和綜述,但願能夠幫到你們。若有不正,多請斧正!node

1. Node.js究竟是什麼

Node.js在維基百科中就已經很明確的說明了,它是一個運行環境,並非其餘的什麼好比軟件庫,簡而言之,和C#所須要的編譯環境同樣,Node.js就是JavaScript的編譯環境,它存在的目的就是爲了讓JavaScript能夠和其餘的後端語言同樣可以在瀏覽器上運行,換種說法就是,可讓前端語言JavaScript在寫完以後交給Node.js進行編譯和解釋,它的存在對於JavaScript有了質的飛躍,對於一個前端來講利用JavaScript就能夠編譯後臺代碼是一件多麼爽飛天的事情。
簡單的Node.js命令就是c++

#node hello.jsweb

2. V8引擎

咱們都知道計算機處理器智能識別機器語言,而JavaScript是一門高級語言,計算機並不能直接讀懂。因此咱們須要所謂的引擎來將其轉化成計算機所能理解的語言。v8引擎是由Google推出的,爲其瀏覽器Chrome所設計的開源JavaScript引擎。得益於JIT,編譯模式的改變與編譯階段的優化,JavaScript的性能獲得了一個飛躍。其源代碼是用c++寫的,感除了對JavaScript性能的大幅提高,v8引擎也提供了「嵌入」的功能,使得開發者也能夠在本身的c++程序中使用「嵌入」的v8引擎,從而高效地編譯JavaScript,並加入c++的feature。要知道,做爲一個底層得多的語言,c++能夠實現的feature可要比JavaScript多得多。舉例說明,JavaScript自己並無read這麼一個function。然而經過v8,咱們能夠將其綁定到一個用c++寫的read callback上,從而經過JavaScript咱們也能夠直接加載文件了。
因而,藉助於v8種種便利的功能,Node.js誕生了。算法

3. 數據的請求和處理(表述的不太準確望海涵

首先咱們要注意的是瀏覽器給網站發請求的過程一直沒怎麼變過。當瀏覽器給網站發了請求。服務器收到了請求,而後開始搜尋被請求的資源。若是有須要,服務器還會查詢一下數據庫,最後把響應結果傳回瀏覽器。不過,在傳統的web服務器中,每個請求都會讓服務器建立一個新的進程來處理這個請求。後來有了Ajax,咱們就不用每次都請求一個完整的新頁面了,取而代之的是,每次只請求須要的部分頁面信息就能夠了。這顯然是一個進步。可是好比你要建一個相似微博的社交網站,致使的結果是你的好友會隨時的推送新的狀態,而後你的新鮮事會實時自動刷新。要達成這個需求,咱們須要讓用戶一直與服務器保持一個有效鏈接。目前最簡單的實現方法,就是讓用戶和服務器之間保持長輪訓(long polling)。
HTTP請求不是持續的鏈接,你請求一次,服務器響應一次,而後就完了。長輪訓是一種利用HTTP模擬持續鏈接的技巧。具體來講,只要頁面載入了,無論你需不須要服務器給你響應信息,你都會給服務器發一個Ajax請求。這個請求不一樣於通常的Ajax請求,服務器不會直接給你返回信息,而是它要等着,直到服務器以爲該給你發信息了,它纔會響應。好比,你的好友發了一條新鮮事,服務器就會把這個新鮮事當作響應發給你的瀏覽器,而後你的瀏覽器就刷新頁面了。瀏覽器收到響應刷新完以後,再發送一條新的請求給服務器,這個請求依然不會當即被響應。因而就開始重複以上步驟。利用這個方法,可讓瀏覽器始終保持等待響應的狀態。雖然以上過程依然只有非持續的HTTP參與,可是咱們模擬出了一個看似持續的鏈接狀態咱們再看傳統的服務器。每次一個新用戶連到你的網站上,你的服務器就得開一個鏈接。每一個鏈接都須要佔一個進程,這些進程大部分時間都是閒着的(好比等着你好友發新鮮事,等好友發完纔給用戶響應信息。或者等着數據庫返回查詢結果什麼的)。雖然這些進程閒着,可是照樣佔用內存。這意味着,若是用戶鏈接數的增加到必定規模,你服務器沒準就要耗光內存直接癱了。這種狀況怎麼解決?解決方法就是剛纔上邊說的:非阻塞和事件驅動。這些概念在咱們談的這個情景裏面其實沒那麼難理解。你把非阻塞的服務器想象成一個loop循環,這個loop會一直跑下去。一個新請求來了,這個loop就接了這個請求,把這個請求傳給其餘的進程(好比傳給一個搞數據庫查詢的進程),而後響應一個回調(callback)。完事了這loop就接着跑,接其餘的請求。這樣下來。服務器就不會像以前那樣傻等着數據庫返回結果了。若是數據庫把結果返回來了,loop就把結果傳回用戶的瀏覽器,接着繼續跑。在這種方式下,你的服務器的進程就不會閒着等着。從而在理論上說,同一時刻的數據庫查詢數量,以及用戶的請求數量就沒有限制了。服務器只在用戶那邊有事件發生的時候才響應,這就是事件驅動。FriendFeed是用基於Python的非阻塞框架Tornado (知乎也用了這個框架) 來實現上面說的新鮮事功能的。不過,Node.js就比前者更妙了。Node.js的應用是經過javascript開發的,而後直接在Google的變態V8引擎上跑。
用了Node.js,你就不用擔憂用戶端的請求會在服務器裏跑了一段可以形成阻塞的代碼了。由於javascript自己就是事件驅動的腳本語言。你回想一下,在給前端寫javascript的時候,更多時候你都是在搞事件處理和回調函數。因此javascript自己就是給事件處理量身定製的語言。數據庫

4. 使用Node.js的優劣(很重要)

在使用Node.js的時候咱們能夠知道,Node.js解決了不少JavaScript的痛點。固然Node.js做爲一個語言也有不少都缺陷。
優點npm

  • 採用事件驅動、異步編程,爲網絡服務而設計。其實Javascript的匿名函數和閉包特性很是適合事件驅動、異步編程。並且JavaScript也簡單易學,不少前端設計人員能夠很快上手作後端設計。
  • Node.js非阻塞模式的IO處理給Node.js帶來在相對低系統資源耗用下的高性能與出衆的負載能力,很是適合用做依賴其它IO資源的中間層服務。
  • Node.js輕量高效,能夠認爲是數據密集型分佈式部署環境下的實時應用系統的完美解決方案。Node很是適合以下狀況:在響應客戶端以前,您預計可能有很高的流量,但所需的服務器端邏輯和處理不必定不少。

缺點編程

  • 可靠性低。

  • 單進程,單線程,只支持單核CPU,不能充分的利用多核CPU服務器。一旦這個進程崩掉,那麼整個web服務就崩掉了。

固然對於這些缺點也喲普不少解決辦法:

  • 開啓多個進程,每一個進程綁定不一樣的端口,用反向代理服務器如 Nginx 作負載均衡,好處是咱們能夠藉助強大的 Nginx 作一些過濾檢查之類的操做,同時可以實現比較好的均衡策略,但壞處也是顯而易見——咱們引入了一個間接層。
  • 多進程綁定在同一個端口偵聽。在Node.js中,提供了進程間發送「文件句柄」 的功能。
  • 一個進程負責監聽、接收鏈接,而後把接收到的鏈接平均發送到子進程中去處理。

5. 適用場景

SON APIs——構建一個Rest/JSON API服務,Node.js能夠充分發揮其非阻塞IO模型以及JavaScript對JSON的功能支持(如JSON.stringfy函數)單頁面、多Ajax請求應用——如Gmail,前端有大量的異步請求,須要服務後端有極高的響應速度基於Node.js開發Unix命令行工具——Node.js能夠大量生產子進程,並以流的方式輸出,這使得它很是適合作Unix命令行工具流式數據——傳統的Web應用,一般會將HTTP請求和響應當作是原子事件。而Node.js會充分利用流式數據這個特色,構建很是酷的應用。如實時文件上傳系統transloadit準實時應用系統——如聊天系統、微博系統,但Javascript是有垃圾回收機制的,這就意味着,系統的響應時間是不平滑的(GC垃圾回收會致使系統這一時刻中止工做)。若是想要構建硬實時應用系統,Erlang是個不錯的選擇。

結語

Node.js是一個對於前端工做者不可或缺的工具。尤爲是對於JavaScript有着巨大的提高,現階段Node.js的應用已經有了很是蓬勃的發展。對於Node.js的學習和熟練運用,必不可少!以上。

【轉自】https://www.jianshu.com/p/fac1fa66a00a
相關文章
相關標籤/搜索