Node.js是用來做什麼的?


國外有一篇非常好的Node.js 介紹文章,從原理入手講解,在這裡給大家翻譯一下(本人非翻譯出身,一些地方結合了點個人理解,有錯誤歡迎指出)。

原文地址 Node.js is the New Black

譯文如下:

如果你去年注意過技術方面的新聞,我敢說你至少看到node.js不下一兩次。那麼問題來了「node.js是什麼?」。有些人沒準會告訴你「這是一種通過JavaScript語言開發web服務端的東西」。如果這種晦澀解釋還沒把你搞暈,你沒準會接著問:「為什麼我們要用node.js?」,別人一般會告訴你:node.js有非阻塞,事件驅動I/O等特性,從而讓高並發(high concurrency)在的輪詢(Polling)和comet構建的應用中成為可能。

當你看完這些解釋覺得跟看天書一樣的時候,你估計也懶得繼續問了。不過沒事。我這篇文章就是在避開高端術語的同時,幫助你你理解node.js的。

瀏覽器給網站發請求的過程一直沒怎麼變過。當瀏覽器給網站發了請求。伺服器收到了請求,然後開始搜尋被請求的資源。如果有需要,伺服器還會查詢一下資料庫,最後把響應結果傳回瀏覽器。不過,在傳統的web伺服器中(比如Apache),每一個請求都會讓伺服器創建一個新的進程來處理這個請求。

後來有了Ajax。有了Ajax,我們就不用每次都請求一個完整的新頁面了,取而代之的是,每次只請求需要的部分頁面信息就可以了。這顯然是一個進步。但是比如你要建一個FriendFeed這樣的社交網站(類似人人網那樣的刷朋友新鮮事的網站),你的好友會隨時的推送新的狀態,然後你的新鮮事會實時自動刷新。要達成這個需求,我們需要讓用戶一直與伺服器保持一個有效連接。目前最簡單的實現方法,就是讓用戶和伺服器之間保持長輪詢(long polling)。

HTTP請求不是持續的連接,你請求一次,伺服器響應一次,然後就完了。長輪訓是一種利用HTTP模擬持續連接的技巧。具體來說,只要頁面載入了,不管你需不需要伺服器給你響應信息,你都會給伺服器發一個Ajax請求。這個請求不同於一般的Ajax請求,伺服器不會直接給你返回信息,而是它要等著,直到伺服器覺得該給你發信息了,它才會響應。比如,你的好友發了一條新鮮事,伺服器就會把這個新鮮事當做響應發給你的瀏覽器,然後你的瀏覽器就刷新頁面了。瀏覽器收到響應刷新完之後,再發送一條新的請求給伺服器,這個請求依然不會立即被響應。於是就開始重複以上步驟。利用這個方法,可以讓瀏覽器始終保持等待響應的狀態。雖然以上過程依然只有非持續的Http參與,但是我們模擬出了一個看似持續的連接狀態

我們再看傳統的伺服器(比如Apache)。每次一個新用戶連到你的網站上,你的伺服器就得開一個連接。每個連接都需要佔一個進程,這些進程大部分時間都是閑著的(比如等著你好友發新鮮事,等好友發完才給用戶響應信息。或者等著資料庫返回查詢結果什麼的)。雖然這些進程閑著,但是照樣佔用內存。這意味著,如果用戶連接數的增長到一定規模,你伺服器沒準就要耗光內存直接癱了。

這種情況怎麼解決?解決方法就是剛才上邊說的:非阻塞事件驅動。這些概念在我們談的這個情景裡面其實沒那麼難理解。你把非阻塞的伺服器想像成一個loop循環,這個loop會一直跑下去。一個新請求來了,這個loop就接了這個請求,把這個請求傳給其他的進程(比如傳給一個搞資料庫查詢的進程),然後響應一個回調(callback)。完事了這loop就接著跑,接其他的請求。這樣下來。伺服器就不會像之前那樣傻等著資料庫返回結果了。

如果資料庫把結果返回來了,loop就把結果傳回用戶的瀏覽器,接著繼續跑。在這種方式下,你的伺服器的進程就不會閑著等著。從而在理論上說,同一時刻的資料庫查詢數量,以及用戶的請求數量就沒有限制了。伺服器只在用戶那邊有事件發生的時候才響應,這就是事件驅動。

FriendFeed是用基於Python的非阻塞框架Tornado (知乎也用了這個框架) 來實現上面說的新鮮事功能的。不過,Node.js就比前者更妙了。Node.js的應用是通過javascript開發的,然後直接在Google的變態V8引擎上跑。用了Node.js,你就不用擔心用戶端的請求會在伺服器里跑了一段能夠造成阻塞的代碼了。因為javascript本身就是事件驅動的腳本語言。你回想一下,在給前端寫javascript的時候,更多時候你都是在搞事件處理和回調函數。javascript本身就是給事件處理量身定製的語言。

Node.js還是處於初期階段。如果你想開發一個基於Node.js的應用,你應該會需要寫一些很底層代碼。但是下一代瀏覽器很快就要採用WebSocket技術了,從而長輪詢也會消失。在Web開發里,Node.js這種類型的技術只會變得越來越重要。

以上。


一種javascript的運行環境,能夠使得javascript脫離瀏覽器運行。


閱讀本帖需要先複習小學語文課文,華羅庚的《統籌方法》。

比如,想泡壺茶喝。當時的情況是:開水沒有;水壺要洗,茶壺茶杯要洗;火生了,茶葉也有了。怎麼辦?

辦法甲:洗好水壺,灌上涼水,放在火上;在等待水開的時間裡,洗茶壺、洗茶杯、拿茶葉;等水開了,泡茶喝。

辦法乙:先做好一些準備工作,洗水壺,洗茶壺茶杯,拿茶葉;一切就緒,灌水燒水;坐待水開了泡茶喝。

辦法丙:洗凈水壺,灌上涼水,放在火上,坐待水開;水開了之後,急急忙忙找茶葉,洗茶壺茶杯,泡茶喝。

哪一種辦法省時間?我們能一眼看出第一種辦法好,後兩種辦法都窩了工。

...

從這個圖上可以一眼看出,辦法甲總共要16分鐘(而辦法乙、丙需要20分鐘)。

...

看來這是「小題大做」,但在工作環節太多的時候,這樣做就非常有必要了。

...

來源:華羅庚 統籌方法_百度文庫

Node.js就是跟華羅庚一夥的,幫助我們更快地沏茶,而且更快地給一幫人沏茶。

我們在用瀏覽器訪問伺服器的時候,就好像去茶葉鋪買茶喝。我們可以買回來自己沏,也可以在店裡自帶的茶座兒坐下來喝現成的。

如果我們買回來喝,參考華老師的課文,他自己都說了這是「小題大作」,因為16分鐘和20分鐘差不了太多,就我們自己和家人,慢生活4分鐘也沒什麼毛病。

但是如果我們在店裡喝,那可不是咱一家兒等著。比起16分鐘的最少等候時間,第一桌多等4分鐘,第二桌要同時來的話得多等24分鐘,第三桌站起來走了,20多張桌子都閑著。忙活了半天,茶客不耐煩,茶鋪不賺錢。

所以,茶葉鋪一定要學好小學課文,不僅對於同一桌的不同請求要統籌安排,別認死理一件事不幹完絕不開始下一件,甚至對於不同桌的不同請求也要盡量並行處理,比如等開水時可以幫好幾桌點單、拿茶葉、洗茶杯茶壺,水開之前別閑著,水一開就給各桌上茶,讓每桌客人都感覺嗖快嗖快的。

在這個故事裡,茶葉鋪就是網路伺服器。我們自己就是瀏覽器。

我們要是不想瀏覽器事必躬親,那就把活扔給伺服器干;當伺服器一下子服務很多瀏覽器時就不能認死理非要串列操作,要靈活統籌,同時開始幾件事,哪件完事關閉哪件。

這三個特徵用江湖切口說就叫:

  • 伺服器端JavaScript處理:server-side JavaScript execution
  • 非阻斷/非同步I/O:non-blocking or asynchronous I/O
  • 事件驅動:Event-driven

Node.js就是這樣一個伺服器端的、非阻斷式I/O的、事件驅動的JavaScript運行環境。

所以說,Node.js是華羅庚的路數,幫茶葉鋪更快更多地伺候茶客。

這麻利的店小二誰家養的?大家。

因為Node.js是開源的。


推薦幾本Node.JS 相關的入門書籍~希望對於想了解Node.js是用來做什麼的同學,一定的幫助哈~

入門

《了不起的Node.js》

作為NodeJS入門挺好的一本書,可惜講得太淺了,基本上就是介紹開發一個簡單的NodeJS應用所要用到的一些技術和工具,對裡面的原理以及NodeJS本身沒有做太多的介紹,停留在介紹第三方庫及其API的階段。

《Node.js開發指南》

讀了一半,就是看這本書理解了NodeJS的事件循環。作者是大神啊。

進階

《深入淺出Node.js》

很出名的一本書,對NodeJS的一些原理做了深入介紹,挺不錯的,還沒看完。

更多前端相關書籍推薦,可閱讀 騰訊Web工程師的前端書單 - 騰雲閣 - 騰訊雲


/*

更新內容-7月31日

*/

看到了評論區知友們的回復,想想還是正經寫一段知乎文吧。

先當一次搬運工

使用 Node.js 的優勢和劣勢都有哪些? - Web 開發

看到評論區有朋友對node的安全性和穩定性仍持懷疑態度,我想說安全性和穩定性完全可以通過第三方Module和代碼的健壯性來彌補,通俗的說就是你得多花點時間,不像C#什麼都幫你弄好了,這點是C#以及JAVA的優勢。

知友 @xs yin :不能做為支撐大站的主力語言,只能做助攻 。

額,這位知友對node太悲觀了

搬運內容如下:What companies are using Node.js in production?

裡面有很多耳熟能詳的公司,如 Netflix,PayPal,Linkedin。他們都在用node,當然,不是他們所用的代碼都用node寫。但是node(JavaScript)可以算上主力語言了。

當然了,node並不是適合所有應用場景的,注重CPU運算的,例如AI,肯定不會node寫。

不過話又說回來了,因為node強大的community,總有讓人腦洞大開的第三方module,

比如這個:sandeepmistry/noble · GitHub

這是一個用node寫的bluetooth central module,真的是很好很強大,node的牛人真的是太多了,藍牙模塊都被寫出來了。

再來看一個:NW.js 乍一看大家都不知道這東西是幹嘛使得,

但是如果你知道它原來叫做:node-webkit,可能就應該想起來了。

我們都知道像chrome和safari的內核都是webkit,而node-webkit 相當於一個自定義的webkit內核瀏覽器中執行伺服器端代碼 node js。NW.js多用於跨平台開發,也就是Hybird App,可以用它配合ionic使用。

另外nw.js 是用 io.js - JavaScript I/O 寫的,io.js這個東東是完全兼容node, 但是支持下一代javascript的,俗稱ES6。

想了解更多nw.js,可以看下這篇教程:Cross-Platform Development With NW.js

結語:大家都應該知道web是未來的發展趨勢,那麼鄙人覺得node應該就是web的未來了。

(另外看到評論區有朋友說 「 發現好些個會nodejs的人自稱全棧 」。額我想說,我們這些寫JavaScript的,以前都那麼苦逼,難得有次裝逼的機會,就麻煩不要拆穿了,嗯么么噠)

/*

更新內容end

*/

首先不太認同@賈廠長 譯文中提起node還處在初期階段,不清楚國內,反正某綿羊島國挺火的,希望你有空來參加下我們的node js meetup auckland活動 :)

首先很多人沒弄明白node js到底是啥?它不是library,它是一個運行環境。就比如run Java 和 c#需要各自的編譯環境。目的是讓JavaScript 可以和其他後端語言一樣在伺服器上運行。這讓原本只能做做特效的JavaScript華麗賽亞人變身!咳,其實一開始我是拒絕的(真的一開始有點小鄙視node)用了以後發現自己傻逼了

用來做啥?RestAPI用它比較多。為什麼就不多解釋了,前面理論知識都概括的差不多了。現在web app比較流行的趨勢angular+node,或者react+backbone/flux+node。

說說為啥用它?

一、天下武功唯快不破,node在restapi這塊真的比c# webapi快多了。我們公司用c#寫的,那個慢啊,深有體會。

二、用的人多!github那個火啊,各種第三方module,認識有個node developer開發了120多個modules

三、免費,不僅如此,伺服器成本你就能省好多,aws, azure的價格已經哭瞎,買個linode或者digital ocean便宜又實惠,自己一個人做產品當然越便宜越好

四、賴的再學c# Java了,直接上JavaScript

壯哉我大JavaScript,真是一秒鐘讓你變fullstack!有木有!不再是永遠的加特效和animation了。

微軟在vs2015都加入了js 編譯器,小夥伴們還在等神馬。

有興趣的小夥伴可以看下:Node.js Tools 1.0 for Visual Studio

最後我想說,這是我的帥,你怎麼帥。

看了知乎那麼久,終於忍不住獻出第一次{腮紅}


最近在忙著GRE的事情所以回答這邊先緩一下,日後還會持續更新,在這邊可以分享一個自己用node寫的小工具,希望大家喜歡。 GitHub - Marswang92/Focus: Keep you away from the distracting websites.

順便,本人正在找2017暑假國內前端或是全棧實習的機會,感興趣的大大們請私信郵箱,求收留~

-----------------------------------------------原回答分割線-----------------------------------------------------

本人在知乎的第一個正經回答,最近正在學Node.js,權當筆記了。

首先要了解Node.js,我們可以先要了解什麼是v8引擎,可以說Node.js的誕生很大程度上歸功於v8引擎的出現。

我們都知道計算機處理器智能識別機器語言,而JavaScript是一門高級語言,計算機並不能直接讀懂。所以我們需要所謂的引擎來將其轉化成計算機所能理解的語言。v8引擎是由Google推出的,為其瀏覽器Chrome所設計的開源JavaScript引擎。得益於JIT,編譯模式的改變與編譯階段的優化,JavaScript的性能得到了一個飛躍。其源代碼是用c++寫的,感興趣的可以點GitHub - v8/v8: The official mirror of the V8 git repository

除了對JavaScript性能的大幅提升,v8引擎也提供了「嵌入」的功能,使得開發者也可以在自己的c++程序中使用「嵌入」的v8引擎,從而高效地編譯JavaScript,並加入c++的feature。要知道,作為一個底層得多的語言,c++可以實現的feature可要比JavaScript多得多。舉例說明,JavaScript本身並沒有read這麼一個function。然而通過v8,我們可以將其綁定到一個用c++寫的read callback上,從而通過JavaScript我們也可以直接載入文件了。

於是,藉助於v8種種便利的功能,Node.js誕生了。

Node.js是一項伺服器技術。我們都知道客戶端提出服務請求,而伺服器端負責處理請求並提供服務。而對於互聯網來說,在Node.js之前JavaScript是一項完全的客戶端技術,被用於瀏覽器中實現各種動畫,對DOM的操作等等。而後端,即服務端則是由PHP、Python、Ruby、Java等等語言來實現。Node.js的出現,使得前後端使用同一種語言,統一模型的夢想得以實現。

所以Node.js到底解決了JavaScript的什麼痛點和問題?

  1. 更好的組織代碼,提升復用性。當然在ES6中這一點也得到了很大的提升。
  2. 處理文件與資料庫。
  3. 與互聯網進行溝通,以標準化的格式處理請求並發送回答。
  4. 快速地解決如上問題。

同時,Node.js還帶來了許多別的後端技術所不具備,或是不完善的優點,如其他人回答中的事件驅動,非同步編程,非阻塞式io等等。JavaScript本身語言的特性,以及其的流行程度與社區活躍度給Node.js帶來了各種意義上的優勢。

新人,如有理解上的偏差請各位指正,謝謝!


我說我用 nodejs 做化學,你信么?


現在最主流的應用是用來跑npm。。。


node.js可以看成是apache/tomcat;JavaScript可以對應看成是php/jsp語言。google v8 引擎被嵌入到node.js當中,用來解釋JavaScript語言。

下面的鏈接對它是什麼、不是什麼、適合做什麼、不適合做什麼講的很清楚:

Node.js 究竟是什麼?


js版php,不知道這麼說對不對


node.js就是一個前端覺得寫個功能還要等後端搗鼓半天,然後乾脆就自己用javascript把後端搞定的一個東西。


是一個 JS 運行環境,可以用來做伺服器,也可以用來像批處理一樣執行某些任務。

在前端開發里一般是用來執行編譯 CSS 預編譯語言、預編譯、壓縮、混淆 JS、壓縮圖片、reload、deploy 等工程化任務,常用的平台有 Grunt 和 Gulp。


能用來做什麼取決於你的想像力,比如可以用 Node.js 來寫 API 服務,並且還有大量拿來即用的工具,社區也總結了不少 寫 API 的最佳實踐:編寫 Node.js Rest API 的 10 個最佳實踐。

當然,這裡不是在鼓勵這樣一種方法論:當你手上拿著鎚子的時候,看所有的東西都是釘子,不是要用 Node.js 去做所有的事情,合適的工具做合適的事情才是王道。回到 Node.js 本身,做流量接入層具有非常大的性能優勢,但是對於 CPU 密集型的應用可能就捉襟見肘了。

再回到工程師自身,俗話說技不壓身,如果用 Node.js 做了很多事情,相信你能總結出他最適合做的事情。


本人切圖仔,最近剛開始接觸伺服器,如有理解錯誤,請大大們指出,謝謝~

-------------------------------------------------------

什麼上Node.js?

我們平時的看到的網頁的js主要靠瀏覽器進行編譯,編譯後才能產生我們想看到的效果。但是如何讓js在伺服器上編譯呢?於是有了Node.js。。。

Node.js是用C++編寫的,是Javascript的運行環境,也就是說你可以編寫系統級或者伺服器端的Javascript代碼,交給Node.js來解釋執行。

我了解和理解的功能如下:

Node.js在本地(即你自己的電腦上)可以搭建一個本地web伺服器來模擬網路瀏覽進行測試,還可以通過npm來安裝插件。

而在雲伺服器(當然也可能是你自己搭建的伺服器)上,通過安裝Node.js,可以在伺服器上編寫js來實現web伺服器的功能——處理HTTP協議,響應用戶瀏覽器發來的請求....巴拉巴拉.....的作用。

與Apache 和 Tomcat比較

Apache 和 Tomcat 都是web伺服器。Apache 主要是用C編寫的,可以編譯php;Tomcat主要是用Java編寫的,可以編譯java。

為什麼伺服器上要編譯js /php/java 呢?因為有些網頁的複雜功能(業務邏輯等等)是用這些語言寫的,將這些語言編寫的代碼放在雲伺服器,然後通過雲伺服器上的Node.js/Apache/Tomcat來進行編譯執行。

附伺服器響應過程圖:


AngularJS做前端,NodeJS做服務端,MongoDB做資料庫。

NodeJS是一個代碼庫,方便只會js的人做站。


個人覺得nodejs與java的整體結構應該是類似的,以為java運行是用jvm去運行java程序,java的跨平台性是因為無論在什麼平台,運行的環境是相同的,nodejs 也是相同的,javascript語言並沒有作為後端語言所必需的文件讀寫能力,但是瀏覽器的內核有這個功能,利用js去調用瀏覽器內核的一些作為後端語言所必須的功能。nodejs 並不只可以用於webserver的編寫,也可以做到很多很多java可以做到的事情。


首先要了解Node.js,我們可以先要了解什麼是v8引擎,可以說Node.js的誕生很大程度上歸功於v8引擎的出現。我們都知道計算機處理器只能識別機器語言,而JavaScript是一門高級語言,計算機並不能直接讀懂。所以我們需要所謂的引擎來將其轉化成計算機所能理解的語言。

v8引擎是由Google推出的,為其瀏覽器Chrome所設計的開源JavaScript引擎。得益於JIT,編譯模式的改變與編譯階段的優化,JavaScript的性能得到了一個飛躍。其源代碼是用c++寫的,感興趣的可以點GitHub – v8/v8: The official mirror of the V8 git repository除了對JavaScript性能的大幅提升,v8引擎也提供了「嵌入」的功能,使得開發者也可以在自己的c++程序中使用「嵌入」的v8引擎,從而高效地編譯JavaScript,並加入c++的feature。

要知道,作為一個底層得多的語言,c++可以實現的feature可要比JavaScript多得多。舉例說明,JavaScript本身並沒有read這麼一個function。然而通過v8,我們可以將其綁定到一個用c++寫的read callback上,從而通過JavaScript我們也可以直接載入文件了。於是,藉助於v8種種便利的功能,Node.js誕生了。

Node.js是一項伺服器技術。我們都知道客戶端提出服務請求,而伺服器端負責處理請求並提供服務。而對於互聯網來說,在Node.js之前JavaScript是一項完全的客戶端技術,被用於瀏覽器中實現各種動畫,對DOM的操作等等。而後端,即服務端則是由PHP、Python、Ruby、Java等等語言來實現。

Node.js的出現,使得前後端使用同一種語言,統一模型的夢想得以實現。

所以Node.js到底解決了JavaScript的什麼痛點和問題?更好的組織代碼,提升復用性。當然在ES6中這一點也得到了很大的提升。處理文件與資料庫。與互聯網進行溝通,以標準化的格式處理請求並發送回答。快速地解決如上問題。

同時,Node.js還帶來了許多別的後端技術所不具備,或是不完善的優點,如其他人回答中的事件驅動,非同步編程,非阻塞式io等等。JavaScript本身語言的特性,以及其的流行程度與社區活躍度給Node.js帶來了各種意義上的優勢。

什麼是Node.js,而又能做什麼?

什麼是Node.js

Q:Node.js?

A:這貨不是Javascript。但它的的確確是Javascript!

Q:一個新的Javascript框架?

A:不是框架,哦,如果不嚴格地說,好像也算是框架,但是在瀏覽器中它不並怎麼受支持。

Q:那有個屁用?

A:那就錯了,它的作用會讓你和你的小夥伴驚呆的。

Q:哦?我不相信!

A:額,如果有人告訴你,這貨是做伺服器端開發的,就像Java,PHP,.NET,GO,Python和Ruby等等做伺服器端開發一樣,你會相信嗎?

Q:是嗎?你這是在侮辱我的智商!

A:別著急,首先要申明,當初網景這個公司開發LiveScript的時候,本來就在同步製作服務端的開發,只是因為那個時代已經有很多有名的後台語言誕生,從而放棄這個夢想,所以你現在只看到瀏覽器中的Javascript,而且它被人長久誤會為玩具。哦,對了,JavaScript和LiveScript是一個東西。

Q:好吧,這好像有點意思,那麼它能做什麼?

A:不要著急,這麼偉大的一個創舉,你為什麼不多體會一下呢,其實一直有人在做這樣的事情,只不過沒有被得到廣泛應用,或者只是自己用來玩玩,而不像V8團隊這樣聰明。

Q:V8?

A:沒錯,V8,這是一個在丹麥的Google團隊,專門開發Javascript引擎,或許你已經無時無刻的都在使用它,也許你用過Chrome瀏覽器,或者基於Chromium的瀏覽器,那麼你可以體會到頁面的載入速度如此之快,這些一部分得利於V8引擎。

Q:那你的意思是,V8引擎可以將Javascript用於伺服器功能開發?

A:正如你所說,谷歌開源了這個引擎,不僅僅開源這樣簡單,在Javascript的發展到路上具有劃時代的意義。在前端,jQuery的出現加速了頁面性能的優化,提高了Javascript的腳本功能,從而使得更多的前端框架出現,而現在Javascript的服務端功能得以東山再起,使得Javascript不在是單兵作戰。

又能做什麼

Q:我已經知道Javascript的服務端功能了,那麼這個項目就叫做Node.js?

A:是的。

Q:那他能做什麼呢?

A:服務端想要做到的事情基本都能做到。

Q:它由什麼編寫而成的呢?

A:C++

Q:那麼它對底層的支持如何?

A:嗯,這樣給你說吧,Node.js的實質就是用Javascript的代碼規範通過C++進行了實現和封裝,現在Node.js正在快速發展,對底層的支持也在逐步擴展,其中很多原生的Node都是使用底層的方式進行運作的。

Q:那這麼說,我是否可以開發HTTP或者HTTPS協議這樣的服務呢?

A:當然可以,而且還非常簡單,甚至可以做TCP中socket開發,當然UDP一樣支持。

Q:如果這樣,我想我會考慮學習這個語言,可是,它有什麼優點和缺點,現在的服務端語言這麼多,我為什麼要使用它呢?

A:當然,你沒有必要必須要使用它,或許他也不是一門必修的語言課程,但是他的魅力足以讓你學習。如果說優點,那麼就是它是單線程多核多進程的語言,並且在他眼裡所有的都是事件,而缺點也是因為如此,它無法滿足實時密集型請求處理,而事件模型是很多人無法理解的。

Q:單線程?我的天,那效率怎麼能提高呢?

A:不,其實多線程的語言處理是以消耗內存為代價,對於CPU的使用率一直不是很好,V8團隊堅信,單線程已經夠用了,使用非阻塞式IO和請求大大提高CPU的使用率,如果使CPU達到100%利用,那最好不過了,並且這對內存的釋放也是有好處的。但也是因為如此對於密集方式請求,可能會出現阻塞,但好在當前密集方式請求並不是很多。

Q:好吧,那麼什麼是事件模型,我不太明白。

A:事件模型,從概念上來說就是通過一些列事件的綁定和觸發進行交互的反饋,如果你使用過一些語言的監聽器,或者理解什麼是監聽者模式,你會更好的理解這些,但是這裡我不想太多講解這些,你可以簡單的理解為,所有的處理都像是在發命令,而對這個命令有興趣的人會有反應,從而做一些事情。

Q:哦,那如果這樣說,Node不是順序執行了?

A:是的,這正是事件模型的核心,它不考慮順序,而是以實際的事件響應順序為主,所以這也給一些想學習這個語言的人帶來了一些障礙,或許無法很好的理解這一點,但是我想應該先去學習一下什麼是監聽者模式就夠了。

忽視了什麼

Q:很好,我現在知道一些大概了,那我們是不是忽略了什麼?

A:你說的很對,我們忽略了很多,但是猶如之前的對話,其中的缺點也就是我們所忽略的,Node不是萬能的,比如他無法實現客戶端界面的開發,至少目前是這樣,對資料庫的鏈接有些官方沒有發行和開發,你或許可以在社區中看到有類似mysql的處理庫,但這不意味者這是官方發行版本,所以很多人不願意通過Node與資料庫進行鏈接,當然現在Node對NoSQL類型資料庫鏈接支持的不錯。

Q:社區?那麼這個社區活躍嗎?

A:非常活躍,也正式因為如此,Node的發展速度非常驚人,比如你可以自己構建一個LIB,通過npm進行發布的升級,就是這麼簡單。

Q:那他在什麼系統下開發?

A:除了傳統的linux和unix外,現在也支持windows,當然windows下畢竟不是主流,我想你不也不會考慮在windows下進行開發。

Q:是的。不過能否給我一個簡單的例子,讓我體會一下呢?

A:沒有問題。

一個簡單的案例

var http = require("http");
var util = require("util");
var querystring = require("querystring");
http.createServer(function(request,response){
var post = "";
request.on("data",function(chunk){
post += chunk;
console.log(chunk);
});
request.on("end",function(){
post = querystring.parse(post);
response.end(util.inspect(post));
});
}).listen(8080);


node的使用場景:
適用於處理IO頻繁但是CPU計算簡單的場景,
放到真正的業務場景之中作為中間層是再好不過的選擇:

  1. 在單頁應用流行的今天可以輕鬆實現前後端同構,以此來提升頁面渲染、載入速度,去除單頁應用不利於SEO的負面影響。
  2. 使用node可以對不同的後端服務進行一次全面整合,包括許可權控制等很多方面。
  3. js是前端程序員所最熟悉的語言之一,學習成本低但是收益高,node所實現的中間層完全可以由前端程序員完成。


全棧開發或者解決特定場景的性能問題。


在伺服器上直接允許js的環境,有利於前端進行數據操作


推薦閱讀:

前端的表單驗證還有必要嗎?
如何用計算機程序驗證E=mc^2?
電腦一點不會的傢伙怎麼學編程?看什麼書?
C++ 是否能夠定義引用的引用?

TAG:後端技術 | 編程 | Nodejs | 計算機科學 | 互聯網行業 |