Node.js vs Ruby on Rails:哪個最適合Web開發?
大家好,在本文中,我們將比較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。你也可以做一些事情來預防。我覺得就我個人而言這不是問題,但我知道一些不習慣異步編程的開發人員對回調真的很頭疼。
正如你可以看到這兩個后端選擇都有其優點和缺點,但它們都是很棒的技術。我們應該根據具體情況具體對待,而不是絕對地說這個比另一個更好。