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




nodejs webapp (14)

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

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

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

我遇到的一些消息來源是:

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


沒有像銀彈一樣的東西。 一切都帶來了與之相關的一些成本。 就像你吃油膩的食物,你會損害你的健康,健康的食物不會像油性食物一樣含有香料。 無論他們是否想要健康或香料,都是個人選擇。 Node.js考慮在特定場景中使用的方式相同。 如果您的應用不適合該方案,則不應將其視為您的應用開發。 我只是想到了同樣的想法:

何時使用Node.JS

  1. 如果您的服務器端代碼需要很少的CPU週期。 在其他世界中,您正在執行非阻塞操作,並且沒有繁重的算法/作業,這會消耗大量的CPU週期。
  2. 如果您來自Javascript,並且在編寫單線程代碼時非常舒服,就像客戶端JS一樣。

何時不使用Node.JS

  1. 您的服務器請求取決於耗費大量CPU的算法/作業。

Node.JS的可擴展性考慮

  1. Node.JS本身並不利用底層系統的所有核心,默認情況下它是單線程的,你必須自己編寫邏輯來利用多核處理器並使其成為多線程。

Node.JS替代品

還有其他選項可用來代替Node.JS,但Vert.x似乎非常有前途,並且具有許多其他功能,如polygot和更好的可擴展性考慮因素。


使用NodeJS的原因:

  • 它運行Javascript,因此您可以在服務器和客戶端上使用相同的語言 ,甚至可以在它們之間共享一些代碼(例如,用於表單驗證,或者在兩端呈現視圖。)

  • 與傳統的多線程Java或ROR框架相比, single-threaded事件驅動系統即使在一次處理大量請求時也fast ,而且也很簡單。

  • 可通過NPM訪問的不斷增長的packages池,包括客戶端和服務器端庫/模塊,以及用於Web開發的命令行工具。 其中大部分都方便地託管在github上,有時您可以報告問題並在幾小時內找到它! 把所有東西放在一個屋簷下很好,標準化的問題報告和簡單的分叉。

  • 它已經成為運行Javascript相關工具和其他與Web相關的工具的事實標準環境,包括任務運行器,縮小器,美化器,鏈接器,預處理器,捆綁器和分析處理器。

  • 它似乎非常適合原型設計,敏捷開發和快速產品迭代

使用NodeJS的原因:

  • 它運行Javascript,沒有編譯時類型檢查。 對於大型,複雜的安全關鍵系統或項目,包括不同組織之間的協作,鼓勵合同接口並提供靜態類型檢查的語言可以從長遠來看節省一些調試時間(和爆炸 )。 (雖然JVM卡住了null ,但請將Haskell用於你的核反應堆。)

  • 除此之外,NPM中的許多軟件包都有點原始 ,並且仍處於快速發展階段。 舊框架的一些庫經歷了十年的測試和錯誤修正,並且現在非常穩定Npmjs.org沒有對包進行評級的機制 ,這導致包大量增加或多或少相同的東西,其中大部分不再維護。

  • 嵌套的回調地獄。 (當然有20種不同的解決方案 ......)

  • 不斷增長的軟件包池可以使一個NodeJS項目與下一個項目顯得截然不同 。 由於可用的選項數量巨大(例如Express / Sails.js / Meteor / Derby ),實現方式有很大差異。 這有時會使新開發人員更難進入Node項目。 與Rails開發人員加入現有項目相比:他應該能夠很快熟悉應用程序,因為鼓勵所有Rails應用程序使用類似的結構

  • 處理文件可能有點痛苦。 在其他語言中微不足道的事情,比如從文本文件中讀取一行, 對Node.js來說很奇怪 ,有80多個upvotes的問題。 從CSV文件中一次讀取一條記錄沒有簡單的方法 。 等等。

我喜歡NodeJS,它既快速又狂野又有趣,但我擔心它對可證明的正確性幾乎沒有興趣。 讓我們希望我們最終可以融合兩全其美。 我很想知道將來取代Node會有什麼...... :)


節點提供的另一個功能是能夠使用節點的子進程( childProcess.fork()每個需要10mb內存,根據文檔)創建多個v8節點的節點,從而不影響運行服務器的主進程。 因此,卸載需要大量服務器負載的後台作業會成為孩子的遊戲,我們可以在需要時輕鬆殺死它們。

我一直在使用節點,在我們構建的大多數應用程序中,同時需要服務器連接,因此網絡流量很大。 Express.js和新的Koajs (刪除了回調地獄)等框架使節點上的工作變得更加容易。


我有一個真實世界的例子,我使用Node.js. 我工作的公司有一個客戶希望擁有一個簡單的靜態HTML網站。 本網站用於使用PayPal銷售一件商品,客戶也希望有一個顯示銷售商品數量的櫃檯。 客戶預計會有大量訪問者訪問本網站。 我決定使用Node.js和Express.js框架製作計數器。

Node.js應用程序很簡單。 從Redis數據庫中獲取已售商品金額,在商品售出時增加計數器,並通過API向用戶提供計數器值。

在這種情況下我選擇使用Node.js的一些原因

  1. 它非常輕巧,快速。 本網站在三週內訪問量超過20萬次,最小的服務器資源已經能夠處理。
  2. 計數器很容易實時。
  3. Node.js很容易配置。
  4. 有很多模塊可以免費使用。 例如,我找到了PayPal的Node.js模塊。

在這種情況下,Node.js是一個很棒的選擇。


我的文章:nodejs非常適合製作分析,聊天應用程序,api,廣告服務器等實時系統。天啊,我在2小時內使用nodejs和socket.io創建了我的第一個聊天應用程序,在考試週期間也是如此!

編輯

自從我開始使用nodejs以來已經有好幾年了,我已經用它來製作許多不同的東西,包括靜態文件服務器,簡單的分析,聊天應用程序等等。 這是我在何時使用nodejs的看法

什麼時候用

在製作強調並發性和速度的系統時。

  • 套接字僅限聊天應用,irc應用等服務器。
  • 社交網絡強調實時資源,如地理位置,視頻流,音頻流等。
  • 像分析Web應用程序一樣快速處理小塊數據。
  • 作為暴露REST唯一api。

什麼時候不用

它是一個非常通用的網絡服務器,所以你可以在任何你想要的地方使用它,但可能不是這些地方。

  • 簡單的博客和靜態網站。
  • 就像一個靜態文件服務器。

請記住,我只是在挑剔。 對於靜態文件服務器,apache更好,主要是因為它廣泛可用。 nodejs社區多年來變得越來越大,越來越成熟,如果你有自己選擇的託管,可以說nodejs可以在任何地方使用。


  1. Node非常適合快速原型,但我從來沒有再用它來做任何復雜的事情。我花了20年時間與編譯器建立關係,我肯定想念它。

  2. Node對於維護一段時間沒有訪問過的代碼特別痛苦。類型信息和編譯時錯誤檢測是好事。為什麼拋出這一切?為了什麼? 當dang,當某些東西向南移動時,堆棧痕跡往往完全沒用。


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


節點最適合併發請求處理 -

那麼,讓我們從一個故事開始吧。 從過去2年開始,我正致力於JavaScript和開發Web前端,我很享受。 後端人員提供了一些用Java編寫的API,python(我們不關心),我們只是編寫一個AJAX調用,獲取我們的數​​據並猜測是什麼! 我們完了。 但實際上並不是那麼容易,如果我們得到的數據不正確或者存在服務器錯誤,那麼我們就會陷入困境,我們必須通過郵件或聊天聯繫我們的後端人員(有時也會在whatsApp上:)。)並不酷。 如果我們用JavaScript編寫API並從前端調用這些API,該怎麼辦? 是的,這很酷,因為如果我們在API中遇到任何問題,我們可以調查它。 你猜怎麼著 ! 你現在可以這樣做,怎麼樣? - 節點就在你身邊。

Ok同意您可以用JavaScript編寫API,但如果我對上述問題感到滿意怎麼辦。 您是否有任何其他理由將節點用於rest API?

所以這就是神奇的開始。 是的我還有其他理由將節點用於我們的API。

讓我們回到我們傳統的rest API系統,該系統基於阻塞操作或線程。 假設發生了兩個並發請求(r1和r2),每個請求都需要數據庫操作。 所以在傳統系統中會發生什麼:

1.等待方式:我們的服務器開始提供r1請求並等待查詢響應。 在完成r1 ,服務器開始服務r2並以相同的方式執行。 所以等待不是一個好主意,因為我們沒有那麼多時間。

2.線程方式:我們的服務器將為請求r1r2創建兩個線程,並在查詢數據庫之後為其目的服務,以便快速實現它的目的。但它是內存消耗,因為你可以看到我們啟動了兩個線程,當兩個請求都查詢時問題也增加了相同的數據然後你必須處理死鎖類問題。 所以它比等待方式更好,但仍有問題。

現在這裡是節點將如何做到:

3.節點:當同一個並發請求進入節點時,它將通過其回調註冊事件並向前移動它不會等待特定請求的查詢響應。所以當r1請求到來時節點的事件循環(是的,有一個事件)用於此目的的節點中的循環。)使用其回調函數註冊事件並向前移動以提供r2請求,並類似地通過其回調註冊其事件。 每當任何查詢完成時,它會觸發相應的事件並執行其回調以完成而不會被中斷。

所以沒有等待,沒有線程,沒有內存消耗 - 是的,這是服務休息API的節點。


穿石棉longjohns ...

昨天我的標題是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,大多數不那麼優秀的前端開發人員都能很好地理解。 但是使用node-localstorage包,雖然不提供字典語法訪問(您希望使用localStorage.setItem(key,value)或localStorage.getItem(key),而不是localStorage [key]),但實現了完整的localStorage語義,包括默認的5MB quota ?為什麼? 服務器端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的一部分被製作成可敬的語言是Douglas Crockford本質上說,“JavaScript作為一種語言有一些非常好的部分和一些非常糟糕的部分。 這是好的部分。 只要忘記其他任何東西都在那裡。“也許熱門的Node.js生態系統會發展自己的 ”道格拉斯·克羅克福德“,他會說,”Node.js生態系統是一個編碼狂野的西部,但有一些真正的寶石可以找到。 這是一個路線圖。 以下是幾乎不惜任何代價避免的區域。 以下是可以在任何語言或環境中找到最豐富的付費區域。“

也許其他人可以將這些話作為挑戰,並遵循Crockford的主導並為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的精彩內容。 我的感覺是Node.js特別適合於您希望保持從瀏覽器到服務器的持久連接的應用程序。 使用稱為"long-polling" ,您可以編寫一個實時向用戶發送更新的應用程序。 對許多網絡巨頭進行長時間輪詢,比如Ruby on RailsDjango ,會在服務器上產生巨大的負擔,因為每個活動客戶端都會佔用一個服務器進程。 這種情況相當於一個tarpit攻擊。 當您使用Node.js之類的東西時,服務器不需要為每個打開的連接維護單獨的線程。

這意味著您可以在Node.js中創建基於瀏覽器的聊天應用程序 ,幾乎不需要任何系統資源來為很多客戶端提供服務。 任何時候你想做這種長輪詢,Node.js是一個很好的選擇。

值得一提的是Ruby和Python都有工具來做這種事情(分別是eventmachinetwisted ),但是Node.js非常好地完成了它,並且從頭開始。 JavaScript非常適合基於回調的並發模型,它在這裡很有優勢。 此外,能夠使用本機的JSON序列化和反序列化客戶端和服務器是非常好的。

我期待在這裡閱讀其他答案,這是一個很棒的問題。

值得指出的是,Node.js對於在客戶端/服務器間隙中重複使用大量代碼的情況也很有用。 Meteor框架使這很容易,很多人都認為這可能是Web開發的未來。 我可以從經驗中說,在Meteor中編寫代碼非常有趣,其中很大一部分是花更少的時間考慮如何重構數據,因此瀏覽器中運行的代碼很容易操縱它並將其傳回。

這是一篇關於金字塔和長輪詢的文章,結果很容易在gevent的幫助下設置: TicTacToe和Long Polling with Pyramid


使用Node啟動下一個項目的最重要原因...

  • 所有最酷的傢伙都進入了它...所以它一定很有趣。
  • 你可以在冷卻器上進行聚會,並有很多Node冒險來吹噓。
  • 在雲託管成本方面,你是一個便宜的pincher。
  • 用Rails完成了那個
  • 你討厭IIS部署
  • 你的舊IT工作變得相當沉悶,你希望你處於一個閃亮的新起點。

期待什麼......

  • 如果沒有您從未需要的所有服務器膨脹軟件,您將感受到安全和安全。
  • 像火箭一樣運行並且可以很好地擴展。
  • 你夢想著它。 你安裝了它。 節點包repo packages是世界上最大的開源庫生態系統。
  • 你的大腦會在嵌套回調的土地上扭曲時間......
  • ......直到你學會遵守Promises
  • SequelizePassport是您的新API朋友。
  • 調試大多數異步代碼將會變得有趣
  • 所有Noders掌握Typescript

誰用它?

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

如果您的應用程序主要使用web apis或其他io頻道,提供或採用用戶界面,node.js可能是一個公平的選擇,特別是如果你想要擠出最大的可擴展性,或者,如果你的生活中的主要語言是javascript(或各種javascript轉換器)。如果你構建微服務,node.js也沒關係。Node.js也適用於任何小型或簡單的項目。

它的主要賣點是允許前鋒負責後端的東西,而不是典型的鴻溝。另一個合理的賣點是,如果您的員工以javascript為導向開始。

但是,除了某一點之外,如果沒有可怕的黑客攻擊來強制模塊化,可讀性和流量控制,就無法擴展代碼。有些人喜歡那些黑客,特別是來自事件驅動的javascript背景,他們似乎熟悉或可原諒。

特別是,當您的應用程序需要執行同步流程時,您會開始放棄半生不熟的解決方案,這會使您在開發過程中大大減慢速度。如果您的應用程序中有計算密集型部件,請謹慎選擇(僅限)node.js. 與我最初使用node.js或寫這篇文章相比,也許Koajs或其他新奇事物可以緩解那些最初棘手的問題。


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

能夠進行基於純雲的開發

我已經使用了Cloud9 IDE一段時間了,現在我無法想像沒有它,它涵蓋了所有的開發生命週期。 您所需要的只是一個瀏覽器,您可以隨時隨地在任何設備上進行編碼。 您無需在一台計算機中籤入代碼(如在家中),然後在另一台計算機(例如在工作場所)結賬。

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







web-applications