[javascript] 如何決定何時使用Node.js?



Answers

我相信Node.js最適合實時應用程序:在線遊戲,協作工具,聊天室或任何其他用戶(或機器人或傳感器?)對應用程序執行的操作都需要立即被其他用戶看到,沒有頁面刷新。

我還應該提到,與Node.js結合使用Socket.IO將使您的實時延遲比使用長輪詢時的延遲時間更長。 作為最糟糕的情況,Socket.IO將回退到長輪詢,並且如果可用,則使用web套接字甚至Flash。

但是我還應該提到,幾乎所有可能由於線程而阻塞代碼的情況都可以通過Node.js更好地解決。 或者您需要應用程序為事件驅動的任何情況。

另外,Ryan Dahl在一次談話中表示,我曾參與過Node.js基準與Nginx的常規舊HTTP請求的競爭。 因此,如果我們使用Node.js構建,我們可以非常有效地為普通資源提供服務,而當我們需要事件驅動的東西時,就可以處理它。

再加上它一直都是JavaScript。 Lingua Franca在整個堆棧。

Question

我對這類東西很陌生,但最近我聽到很多關於Node.js好處。 考慮到我一般喜歡用jQuery和JavaScript工作,我不禁想知道如何決定何時使用Node.js. 我想到的Web應用程序就像Bitly - 需要一些內容,將其歸檔。

從過去幾天我所做的所有功課中,我獲得了以下信息。 Node.js的

  • 是一個命令行工具,可以作為普通的Web服務器運行,並讓一個運行JavaScript程序
  • 利用偉大的V8 JavaScript引擎
  • 當你需要在同一時間做幾件事時,它是非常好的
  • 是基於事件的,因此可以在服務器端完成所有美妙的Ajax類東西
  • 讓我們在瀏覽器和後端之間共享代碼
  • 讓我們與MySQL交談

我遇到的一些來源是:

考慮到Node.js幾乎可以在亞馬遜的EC2實例上直接運行,我想了解什麼類型的問題需要Node.js而不是像PHPPythonRuby那樣的強大國王。 我明白,這實際上取決於人們對語言的專業知識,但是我的問題更多地歸因於以下一般類別:何時使用特定框架以及它特別適合的類型問題?




穿石棉長褲...

昨天,我與Packt Publications合作, 與JavaScript進行反應式編程 。 它不是一個真正的以Node.js為中心的標題; 早期的章節旨在涵蓋理論,後面的代碼量大的章節涵蓋了實踐。 因為我不認為不給讀者一個網絡服務器是合適的,所以Node.js似乎是最明顯的選擇。 案件在開放前關閉。

我可以對Node.js的經驗給予非常好的看法。 相反,我對我遇到的優點和不足之處誠實。

讓我列舉一些與此相關的引用:

警告:Node.js及其生態系統很熱 - 足以將您嚴重燒傷!

當我是數學老師的助理時,我被告知的一個非顯而易見的建議不是告訴學生有什麼“容易的”。回想起來,這個理由有些明顯:如果你告訴人們有些事情是容易的,沒有看到一個解決方案可能最終會感覺(甚至更多)愚蠢,因為他們不僅沒有得到如何解決問題,但他們太愚蠢難以理解的問題是一個容易的問題!

有一些小問題不僅會讓來自Python / Django的人煩惱,如果您改變了任何東西,它們會立即重新加載源代碼。 使用Node.js時,默認行為是,如果進行一次更改,則舊版本會一直保持活動狀態,直到時間結束或您手動停止並重新啟動服務器為止。 這種不恰當的行為不僅會讓Pythonistas惱火, 它也刺激了提供各種解決方法的本地Node.js用戶。 在撰寫本文時,問題“自動重新載入Node.js中的文件”已超過200個upvotes和19個答案; 編輯會將用戶導向一個保姆腳本,節點監督員,其主頁位於http://tinyurl.com/reactjs-node-supervisor 。 這個問題使得新用戶有很大的機會感到愚蠢,因為他們認為他們已經解決了這個問題,但是舊的,錯誤的行為完全沒有改變。 而且很容易忘記彈回服務器; 我已經多次這樣做了。 我想說的是,“不,你不是愚蠢的,因為Node.js的這種行為會讓你退縮; 只是Node.js的設計者沒有理由在這裡提供適當的行為。 盡量應付它,也許需要來自節點主管或其他解決方案的一些幫助,但請不要走開感覺你是愚蠢的。 你不是那個有問題的人; 問題在於Node.js的默認行為。“

經過一番辯論之後,這部分內容被留下了,這正是因為我不想給人一個“很容易”的印象。我在重新開始工作的同時反复切斷了雙手,並且我不想平息困難,讓你相信讓Node.js及其生態系統正常運行是一件很簡單的事情,如果你也不直截了當,你就不知道自己在做什麼。 如果使用Node.js不會遇到令人討厭的困難,那真是太棒了。 如果你這樣做,我希望你不要離開感覺,“我很愚蠢 - 我一定有什麼問題。”如果你遇到與Node.js相關的令人討厭的驚喜,那麼你並不愚蠢。 這不是你! 它是Node.js及其生態系統!

附錄在最後幾章和結論中的漸增高潮之後並不是我真正想要的,它談到了我在生態系統中能夠找到的東西,並提供了一個解決方法:

另一個看似完美的數據庫可能還可以兌換,它是HTML5鍵值存儲的服務器端實現。 這種方法具有API的主要優勢,即大多數優秀的前端開發人員可以很好地理解API。 對於這一點,這也是一個大多數不太好的前端開發人員理解得足夠好的API。 但是對於node-localstorage包,雖然沒有提供字典語法訪問(您想要使用localStorage.setItem(key,value)或localStorage.getItem(key),而不是localStorage [key]),但實現完整的localStorage語義,包括一個默認的5MB配額 - 為什麼? 服務器端JavaScript開發人員是否需要受到保護?

對於客戶端數據庫功能,每個網站5MB的配額實際上是一個慷慨而有用的呼吸空間,讓開發人員可以使用它。 您可以設置更低的配額,並為開發人員提供無法衡量的改進,同時還可以改進cookie管理。 5MB限制不適用於大數據客戶端處理,但是非常慷慨的資源開發人員可以用它來做很多事情。 但另一方面,5MB並不是大多數最近購買的磁盤的一大部分,這意味著如果你和一個網站不同意什麼是合理使用磁盤空間,或者某個站點很簡單,它並不真正花費你很多,除非你的硬盤已經滿了,否則你不會遇到硬盤被淹沒的危險。 也許如果餘額稍微少一點或多一點,我們會更好,但總的來說,這是解決客戶端環境內在緊張的一個體面的解決方案。

然而,它可能會被輕輕地指出,當你是你的服務器的一個編寫代碼時,你不需要任何額外的保護來讓你的數據庫超過5MB的容量。 大多數開發人員既不需要也不需要工具充當保姆,並保護他們不會存儲超過5MB的服務器端數據。 而在客戶端實現黃金平衡的5MB配額在Node.js服務器上相當有點愚蠢。 (而且,對於本附錄中介紹的多用戶數據庫,可能會稍微痛苦地指出,除非您為每個用戶帳戶在磁盤上創建單獨的數據庫,否則這不是每個用戶帳戶5MB;這是共享的5MB所有用戶帳戶一起使用,如果病毒發作,這可能會很痛苦 )文檔指出配額是可定制的,但一周前向開發人員發送一封電子郵件,詢問如何更改配額未得到答复,就像問題一樣。 我能找到的唯一答案是在Github CoffeeScript源代碼中,它被列為構造函數的可選第二個整數參數。 所以這很容易,你可以指定一個等於磁盤或分區大小的配額。 但除了移植一個沒有意義的特性外,該工具的作者完全沒有遵循一個非常標準的解釋0的慣例,意思是對於一個變量或函數來說“無限”,其中整數是為某些資源使用指定最大限制。 對這種錯誤特徵做的最好的事情可能是指定配額是無限的:

if (typeof localStorage === 'undefined' || localStorage === null)
  {      
  var LocalStorage = require('node-localstorage').LocalStorage;
  localStorage = new LocalStorage(__dirname + '/localStorage',
    Infinity);
  }

依次交換兩個評論:

人們不斷地用JavaScript作為一個整體來攻擊自己,JavaScript的一部分成為可敬的語言是道格拉斯克羅克福德本質上所說的,“JavaScript作為一種語言有一些非常好的部分和一些非常糟糕的部分。 這是好的部分。 “也許熱門的Node.js生態系統會發展自己的 ”Douglas Crockford“,他會說,”Node.js生態系統是Wild West的編碼,但是有一些真正的寶石可以找到。 這是一個路線圖。 幾乎可以避免任何成本的領域。 以下是在任何語言或環境中都可以找到的最富有的付費區域。“

也許別人可以把這些話作為一個挑戰,並遵循克羅克福德的領導,寫出Node.js及其生態系統的“好的部分”和/或“更好的部分”。 我會買一份!

考慮到所有項目的熱情程度和純粹的工作時間,可能需要一年或兩年,甚至三年才能對本文寫作時對未成熟生態系統的任何評論大打折扣。 五年內確實可以說,“2015年的Node.js生態系統有幾個雷區。 2020 Node.js生態系統擁有多個天堂。“




它可以用在哪裡

  • 高度事件驅動和嚴重I / O限制的應用程序
  • 處理大量與其他系統連接的應用程序
  • 實時應用程序(Node.js是從實時開始設計的並且易於使用。)
  • 應用程序可以將來自其他來源的大量信息進行流式傳輸
  • 高流量,可擴展的應用
  • 移動應用程序必須與平台API和數據庫進行交流,而無需進行大量數據分析
  • 建立網絡應用程序
  • 需要經常與後端交流的應用程序

在移動方面,黃金時段的公司依靠Node.js來提供移動解決方案。 看看為什麼?

LinkedIn是一位傑出的用戶。 他們的整個移動堆棧建立在Node.js上。 他們從每台物理機器上運行15個服務器運行15個實例,到僅運行4個實例 - 可處理雙倍的流量!

eBay推出了ql.io,這是一種HTTP API的Web查詢語言,它使用Node.js作為運行時棧。 他們能夠調整一個普通的開發人員素質的Ubuntu工作站,以處理每個node.js進程超過120,000個活動連接,每個連接消耗大約2kB內存!

Walmart重新設計了其移動應用程序以使用Node.js並將JavaScript處理推送到服務器。

閱讀更多: http://www.pixelatingbits.com/a-closer-look-at-mobile-app-development-with-node-js/ : http://www.pixelatingbits.com/a-closer-look-at-mobile-app-development-with-node-js/




我為選擇一個新項目選擇Node.js的另一個理由是:

能夠進行純粹的基於雲計算的開發

我已經使用了Cloud9 IDE一段時間,現在我無法想像沒有它,它涵蓋了所有的開發生命週期。 所有你需要的是一個瀏覽器,你可以隨時隨地在任何設備上編碼。 你不需要在一台計算機上登記代碼(如在家裡),然後在另一台計算機上登記(如在工作地點)。

當然,其他語言或平台可能還有基於雲的IDE(Cloud 9 IDE也增加了對其他語言的支持),但使用Cloud 9做Node.js開發對我來說真的是一個很棒的體驗。




使用Node開始下一個項目的最重要原因...

  • 所有最酷的帥哥都進入了它......所以它一定很有趣。
  • 您可以在冷藏室環聊,並有許多Node冒險故事。
  • 當談到雲託管成本時,你是一分錢捕手。
  • 在那裡用Rails做到了
  • 你討厭IIS部署
  • 你以前的IT工作變得相當遲鈍,你希望你有一個新的啟動。

期待什麼...

  • 使用Express時,您會感到安全和放心,而不需要所有您不需要的服務器文件。
  • 像火箭一樣運行,並能很好地擴展。
  • 你夢想著。 你安裝了它。 節點包repo packages是世界上最大的開源庫生態系統。
  • 你的大腦會在嵌套回調的土地上發生時間扭曲...
  • ...直到你學會遵守Promises
  • SequelizePassport是您新的API朋友。
  • 主要調試異步代碼將得到嗯...... 有趣
  • 所有節點掌握Typescript

誰使用它?

  • PayPal,Netflix,沃爾瑪,LinkedIn,Groupon,優步,GoDaddy,道瓊斯
  • 這就是他們切換到Node的原因。



我認為沒有人提到過關於Node.js的另一件好事是令人驚嘆的社區,軟件包管理系統(npm)以及存在的模塊數量,只需將它們包含在package.json文件中即可。




I can share few points where&why to use node js.

  1. For realtime applications like chat,collaborative editing better we go with nodejs as it is event base where fire event and data to clients from server.
  2. Simple and easy to understand as it is javascript base where most of people have idea.
  3. Most of current web applications going towards angular js&backbone, with node it is easy to interact with client side code as both will use json data.
  4. Lot of plugins available.

Drawbacks:-

  1. Node will support most of databases but best is mongodb which won't support complex joins and others.
  2. Compilation Errors...developer should handle each and every exceptions other wise if any error accord application will stop working where again we need to go and start it manually or using any automation tool.

Conclusion:- Nodejs best to use for simple and real time applications..if you have very big business logic and complex functionality better should not use nodejs. If you want to build an application along with chat and any collaborative functionality.. node can be used in specific parts and remain should go with your convenience technology.




簡而言之:

Node.js非常適合具有大量並發連接的應用程序,並且每個請求只需要很少的CPU週期,因為事件循環(與所有其他客戶端一起)在執行函數期間被阻止。

關於Node.js中事件循環的一篇很好的文章是Mixu的科技博客:了解node.js事件循環




Links