Node.js vs Ruby on Rails:哪個最適合Web開發?

2017-11-28    分類:WEB開發、程式設計開發、首頁精華0人評論發表於2017-11-28

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

大家好,在本文中,我們將比較Node.js和Ruby on Rails在Web開發上孰優孰劣。我寫這篇文章的主要原因是我們的團隊不斷被問及哪種語言或哪個框架最適合學習。無論如何,我們從不給出一個簡單的答案,因為就沒有一個明確的答案。

我認為最好是依據事實和統計資料說話。我們將瞭解Node.js和Ruby on Rails在伺服器端技術方面的一些優缺點。

在開始之前,我想先說說我的一些看法。有批評者可能會質疑我們如何將作為執行時的Node.js與作為框架的Ruby on Rails進行比較?我接受這樣的質疑,但我要比較的是兩個伺服器端技術和Web棧。我們要弄清楚現在學什麼更好,以及對於業務哪個更佳。我的意思並不是說直接比較Ruby on Rails和Node.js的功能,如果你覺得用Express或者其他基於Node的框架代替Node.js會更好的話。無論如何,我們比較的是後端結構和堆疊,而不是個別技術。

我們的團隊已經使用過這兩種技術,並且我們中的一些人對這兩種技術都很喜歡。我不是在厚此薄彼。重要的是要知道適合我們的可能並不適合你,反之亦然。另外,你應該記住,每個人的大腦都是不同的。所以,孰勝孰劣並不定論。

首先讓我們來看看這兩種技術之間的一些相似之處。

  • 受歡迎的伺服器端技術。
  • 相當容易學習。
  • 高效能。
  • 為頂級網站/應用程式使用。
  • 強大的社群。
  • 基於類似MVC的結構。
  • 快速開發。

Node.js和Rails都是備受推崇和流行的伺服器端技術,可以做很多不同的事。它們可以與許多不同的堆疊和資料庫等等協同工作。兩者都相當容易學習。Node使用JavaScript,而Rails使用Ruby。但是Ruby和JavaScript比Java,C#或其他一些高階語言更容易學習。它們都是相當寬容的語言,有大量的資源可供學習。Node.js和Ruby on Rails執行優良,因此我們將討論效能水平。有很多流行網站使用這兩種技術。Node和Rails擁有非常強大和堅持自我的社群。

Rails存在的時間更久一點,有更多老前輩。但是Node日漸變得越來越流行。現在MVC,即Model-View-Controller成為了一種設計模式。而Ruby on Rails有很強的MVC。針對模型、控制器和檢視有一個資料夾。通過Node中的某些框架,例如Express,可以實現MVC。不過,Express比Rails更靈活。你可以只採納MVC的某些方面。這不是唯一可能的結構。Node和Rails用於快速開發和原型。Rails有一個很棒的摺疊功能,當然Express也有生成器和命令列工具。

Rails的優點

  • 一致的結構。
  • 非常堅持自我。
  • 資料庫遷移。
  • 開發速度。
  • Ruby是一門偉大的語言。
  • Ruby gems。
  • 成熟和受尊重的社群。

首先,讓我們來看看Ruby on Rails的優點,然後再看缺點。正如我所說,Rails有一個非常強大的MVC結構。大多數Rails應用程式在核心檔案和資料夾方面看起來非常相似。有了這個堅實的基礎之後,然後在gems和自定義的包和庫之上構建。另外,Rails非常堅持自我,這就意味著它允許你堅持自己的做事方式。Rails假設你將要以某種方式編寫程式碼,有些人可能會說這稍微有點限制。但是它也使程式碼變得更簡單,更簡潔,而且也使得更不容易建立錯誤和出現問題。從某種意義上說,你不能製造你想要的東西,但卻是助你到達目的地的途徑。如果你以正確的方式去做,那很可能就是最簡單的方法。

Rails也有非常好的資料庫遷移功能。它們允許我們在資料庫中建立和編輯表格與列,而無需手動進入去新增或更改內容。它也會給你一個很好的小日誌或路徑,允許你檢視對資料庫結構究竟做了什麼。

現在再說Node。有一些用於遷移的軟體包或模組,比如DB-migrate就可以很好地工作,但不像Rails chord migration system那樣深入和易於使用。在原型設計和快速開發方面,沒有太多技術可以打敗Rails。所以,通過一些基本配置和一些scaffolding命令,你可以擁有一個完整的CRUD應用程式。資料庫遷移被新增到這個速度。如果你使用第三方工具和模組的話,Node.js和Express在快速開發方面相當不錯。但Rails擁有的所有這些東西都是開箱即用的。

Ruby語言有優點也有缺點,但在大多數情況下,它是很受尊敬的,而且非常乾淨。 Ruby是一個多正規化語言,你可以做到程式程式碼功能化,但大部分是物件導向的。一切都可以看作是一個物件。RubyGems是Ruby on Rails的包管理器,它用於擴充套件框架的核心功能。這與Node.js的npm相似。所有Rails應用程式都有一個gem檔案,你可以在其中指定你的gems。然後執行bundler命令來安裝它們,類似於使用Node.js的npm install。

關於Ruby on Rails的另一個好處是,它已經存在了一段時間,因此擁有一個非常受人尊重的智慧社群。維護Ruby on Rails的開發人員非常聰明,並且非常熱愛框架。核心框架上有大量資源,包括論壇,部落格文章和文件,以幫助你解決問題。這些都是Ruby on Rails的巨大優勢。

Rails的缺點

  • 效能
  • 太簡單
  • 聲望
  • 缺乏文件

我們來談談Rails的一些缺點。我們知道的關於Ruby on Rails的最大抱怨是它相對較慢。Rails是一個很大的框架,有很多很多功能。除了一些較輕便的框架之外,還有gem和應用程式檔案依賴的因素。有太多的自動化和scaffolding,以致於開發人員並沒有真正學習很多關於Rails框架如何工作的內容。你可能瞭解Ruby語言,瞭解應用程式的語法或結構,但對於真正瞭解Rails如何工作的人來說,自動化和scaffolding是非常棒的,因為有助於快速開發。另一方面,一些開發者的確需要做更多的努力才能真正理解某些事情。Rails對於大型專案,也比小型應用程式更困難。它也有一些縮放問題。

所以另外一個缺點是Rails不像Node.js那樣受歡迎。此時,Node.js處於Web開發的前沿,而且Rails令人興奮的時代已經逝去。我們認為,如果你正在找工作,那麼我們言之鑿鑿地建議學習Node,以及可能的話還有Express。比起其他語言,有更多的公司正在招聘JS開發人員。如果是在五年前,那麼Rails或Ruby必將是值得學習的前三大語言之一。但是現在它沒有那麼受歡迎了。所以我在前面簡單地提到,核心Rails框架有一些非常好的文件和示例,可以讓你學習簡單的scaffolding命令和資料庫遷移。這一切都很好。然而,當你試圖學習更高階的程式設計,並且試圖瞭解特定的gems時,有時候感覺就像大海撈針一樣。

一些名氣相當大的平臺曾經使用過或正在使用Ruby on Rails。Twitter就是其中一個巨頭。另外,由於一些擴充套件問題,他們已經把很多後端服務移到了Scala和Java上。但是由於他們使用過Rails很長一段時間,所以我非常確定他們仍然在平臺的其他方面使用它,比如與Shopify的合作。此外,作為專案管理解決方案的Basecamp表示,Rails是他們專案的核心和靈魂。執行GitHub的軟體是建立在Rails上的。Soundcloud和Hulu,流行的流媒體服務,都是建立在Rails上的。從一開始,Groupon和LivingSocial,SlideShare和Urban Dictionary就在他們的開發中使用Rails。

Node.js的優點

  • 非常受歡迎。
  • 高效能。
  • 非同步。
  • 非常可擴充套件。
  • JavaScript前端和後端。
  • 靈活的檔案結構。
  • npm和模組。

看了Rails之後,現在讓我們開始看看Node.js。我們將從它的優點開始。Node.js的一個巨大的優勢是它非常受歡迎。它基本上是web開發中的最新的尖端技術。市場需求非常大。極其受創業公司的歡迎。圍繞Node和Express框架有一個繁榮的開源社群。在npm基礎上有很多開發良好的模組,並且當談到速度和效能的時候,Node對上Rails有著絕對的優勢。事實上,Node幾乎所向披靡。它執行在速度如閃電般的Google JavaScript引擎上。Node用於構建幾乎感覺像桌面應用程式一樣的實時Web應用程式。

接下來,Node.js也是非同步的。這意味著程式向伺服器傳送請求時,不必等待回覆。它可以繼續執行。Node執行在單個執行緒上,而不像其他語言一樣傳送請求。這些語言需要等待,直到請求完成,然後傳送下一個,再等待。所以Node.js也是非常可擴充套件的,在單執行緒中發揮了很大的作用。Node也可以和像MongoDB這樣的NoSQL資料庫一起工作,它比傳統的關係型資料庫如MySQL更具可擴充套件性。幾乎所有我瞭解的大公司都轉移到了Node.js上,他們報告說生產力有了很大提高。

Node的另一個很棒的優勢是它使用JavaScript,而JavaScript被廣泛用於許多Web棧。很多時候,前端的語言與後端的語言是不一樣的,但是在使用Node.js的時候並不是這樣。我們在前端和後端都可以使用JavaScript。有很多主導業界的客戶端框架——React,Angular,Vue.js。所以這對Node.js來說是一個巨大的優勢。顯然,JavaScript也和非常受歡迎的JSON API也可以協同工作。

Node.js,Express或Happy.js,這些框架中的任何一個都具有非常靈活的檔案結構。它們能讓你構建你想要的應用程式。你可以將所有內容都塞進應用程式的單個JS檔案。如果你想有更多傳統的MVC結構,那就有利有弊了。但是大多數情況下,如果你知道你在做什麼,而且你是一個好的程式設計師,那麼靈活性是一件好事。和Ruby gems一樣,Node也有它自己的包管理器,稱為npm或Node包管理器。npm和Ruby gem最大的區別就是依賴關係的管理方式。使用Ruby,依賴關係是全域性安裝的。所以你必須使用捆綁器,並且必須自己管理它們。 npm實際上負責你的所有模組。它們被放入Node模組資料夾。這些模組也可以擁有自己的Node模組資料夾,並具有自己的依賴關係。npm模組似乎也有更好的文件,至少以我的經驗來看是這樣的。

Node.js的缺點

  • 糟透了的CPU密集型任務。
  • 不一致性。
  • 較新的技術。
  • 回撥地獄。
  • 太模組化。

好的,既然我們瞭解了Node.js的優勢之後,讓我們來看看它的一些缺點。對於許多CRUD類應用程式來說,Node是很好,但對於CPU密集型應用程式來說,這絕對是一件非常糟糕的事情。原因是,只要執行某些操作一些時間(例如CPU操作),它就會將所有傳入的請求排隊,因為它在單個執行緒上執行。像Apache這樣有更多可用執行緒的,將會在它們之間分配CPU時間。只有IO操作是並行的,因為它們是非同步執行的。CPU密集型任務的例子為3D渲染,視訊編碼,科學建模等等。

關於Node的另一個抱怨是它可能有點不一致。有些人覺得API保持經常的改變。它有時不是很向後相容。不僅如此,而且Express應用程式的結構通常非常自由和靈活。因此,有時它反而會使得開發者作繭自縛。

Rails是非常嚴格的,所以編寫壞程式碼更困難。由於Node是非同步的,所以你將會處理很多回撥函式,它們經常會蜂擁而至並進入所謂的回撥地獄(callback hell)。對此的解決方案有非同步工具和使用promises。你也可以做一些事情來預防。我覺得就我個人而言這不是問題,但我知道一些不習慣非同步程式設計的開發人員對回撥真的很頭疼。

正如你可以看到這兩個後端選擇都有其優點和缺點,但它們都是很棒的技術。我們應該根據具體情況具體對待,而不是絕對地說這個比另一個更好。

譯文連結:http://www.codeceo.com/article/node-js-vs-ruby-on-rails.html
英文原文:Node.js vs Ruby on Rails: Which Is the Best for Web Development?
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章