Bài đăng này được cập nhật vào ngày 23 tháng 5 năm 2024 để làm rõ sự khác biệt về mô hình và khả năng lưu giữ dữ liệu giữa Rails và Hanami.
Ruby on Rails là framework web phổ biến nhất trong hệ sinh thái Ruby và có lượng người dùng lớn, từ những người làm việc tự do đến các công ty lớn đã thành lập. Với cộng đồng người dùng tích cực và tài liệu đa dạng, nó có thể được sử dụng để xây dựng mọi thứ từ ứng dụng đơn giản đến nền tảng web phức tạp.
Điều đó cho thấy, một thí sinh mới đang chiếm ưu thế của Rails cho danh hiệu full-stack Ruby framework:Hanami. Nó là một framework Ruby mô-đun nhanh, có hiệu suất và khả năng bảo trì được cải thiện so với Rails.
Trong bài viết này, chúng ta sẽ khám phá những điểm mạnh và điểm yếu của từng khung về hiệu suất, tính năng, thử nghiệm, v.v. Vì vậy, cho dù bạn đang muốn xây dựng một ứng dụng web hướng tới khách hàng, một công cụ nội bộ hay một API có khả năng mở rộng quy mô lớn, bạn nên được thông báo rõ hơn về những gì sẽ sử dụng cho dự án tiếp theo của mình.
Hãy bắt đầu với phần giới thiệu ngắn gọn về từng khung.
Giới thiệu Ruby on Rails
Ruby on Rails là khung phát triển ứng dụng web Ruby nổi tiếng nhất với sứ mệnh nâng cao năng suất của nhà phát triển (bằng cách đưa ra một loạt giả định về cách xây dựng ứng dụng, thường được gọi là "Phương pháp Rails").
Một số giả định này bao gồm việc đảm bảo các nhà phát triển không dành thời gian định cấu hình nội dung hoặc những gì được gọi là "quy ước về cấu hình" và nhấn mạnh vào việc sử dụng các nguyên tắc DRY ("không lặp lại chính mình"). Nguyên tắc DRY khuyến khích nhà phát triển tránh lặp đi lặp lại mã mà thay vào đó sử dụng các cách trình bày đơn lẻ và tập trung về chức năng ứng dụng để đảm bảo khả năng bảo trì và tổ chức.
Giới thiệu Hanami
Trong khi Rails rất nổi tiếng trong cộng đồng Ruby thì Hanami lại ít nổi tiếng hơn. Đó là một framework Ruby hiện đại khá mới đang cố gắng chiếm lấy sự thống trị của Rails trong không gian framework web full-stack.
Hanami được xây dựng từ đầu để có dung lượng bộ nhớ nhỏ và tập trung vào tính mô-đun, từ đó tạo nên một khung rất nhanh và linh hoạt.
Rõ ràng, những lời giới thiệu ngắn gọn này sẽ không thực sự cung cấp cho bạn tất cả thông tin bạn cần để quyết định khuôn khổ phù hợp nhất với mình. Để làm được điều đó, chúng ta cần tìm hiểu sâu hơn về từng phần, bắt đầu từ cách chúng được cấu trúc.
Cấu trúc và kiến trúc của Rails và Hanami
Rails và Hanami có phần giống nhau ở chỗ cả hai đều là Ruby framework. Tuy nhiên, cách mỗi loại được xây dựng và kiến trúc ứng dụng của chúng là nơi bạn sẽ tìm thấy hầu hết sự khác biệt.
Đầu tiên, với Rails, bạn có ít tệp hoặc tóm tắt hơn (các khối xây dựng bạn sử dụng để xây dựng ứng dụng của mình), có xu hướng tăng kích thước khi bạn phát triển ứng dụng của mình. Mặt khác, Hanami đưa tính trừu tượng lên một tầm cao mới, với nhiều tệp có xu hướng có kích thước nhỏ hơn.
Các sơ đồ dưới đây minh họa điểm rõ ràng hơn. Hãy bắt đầu với Rails.

Bây giờ hãy so sánh sơ đồ trừu tượng Rails với sơ đồ Hanami bên dưới.

Như bạn có thể thấy, mỗi khung thường tuân theo model-view-controller (MVC) cấu trúc. Tuy nhiên, Hanami đưa tính trừu tượng lên một tầm cao mới.
Dưới đây là bản phác thảo đơn giản về cách sắp xếp từng khung:
- Các tuyến đường - Mỗi khung có định nghĩa tuyến đường cùng với điểm cuối của ứng dụng.
- Bộ điều khiển và hành động - Trong Rails, bạn nhận được các bộ điều khiển với một hoặc một vài hành động trong đó. Bộ điều khiển nhận và phản hồi các yêu cầu định tuyến bằng cách hướng dẫn chúng đến các hành động liên quan. Ở Hanami không có người điều khiển. Thay vào đó, bạn chuyển thẳng sang các hành động độc lập (mỗi hành động có lớp độc lập riêng).
- Mô hình và sự kiên trì - Lớp mô hình Rails đảm nhiệm việc xác thực dữ liệu và liên lạc với cơ sở dữ liệu, bao gồm mọi truy vấn mà ứng dụng của bạn có thể có. Tính bền vững được xử lý bởi Ruby Object Mapper (ROM). Trong Hanami, lớp mô hình trừu tượng hơn, được tách thành các thực thể và kho lưu trữ. Các thực thể xử lý logic miền và không phụ thuộc vào cơ sở dữ liệu, trong khi kho lưu trữ (repos) được sử dụng để giao tiếp với cơ sở dữ liệu. Hanami 2.0 trở đi không có lớp lưu giữ được định cấu hình trước, cho phép bạn chọn Trình ánh xạ quan hệ đối tượng (ORM) phù hợp với nhu cầu của bạn hoặc lập trình ORM miễn phí.
- Xem kết xuất - Giống như lớp lưu giữ lâu dài, chế độ xem Ruby on Rails có xu hướng chứa mọi thứ bạn cần để hiển thị dữ liệu ra thế giới bên ngoài ở một nơi. Điều này bao gồm tất cả cấu trúc HTML, trình trợ giúp chế độ xem và logic chế độ xem. Khi nói đến việc hiển thị hình ảnh trong Hanami, mọi thứ trừu tượng hơn. Để bắt đầu, bạn có lượt xem sử dụng bất kỳ trình trợ giúp chế độ xem nào mà ứng dụng có và cũng hiển thị mẫu . Mẫu xử lý cấu trúc HTML thực tế, trong khi các phần quan tâm đến mọi logic trình bày.
Vì vậy, tất cả những điều này có ý nghĩa gì khi nói đến việc xây dựng một ứng dụng? Với ít sự trừu tượng hơn, Rails là một lựa chọn tốt để phát triển ứng dụng của bạn và thân thiện với người mới bắt đầu hơn (như chúng ta sẽ thấy ở phần sau của bài viết này). Với Rails, bạn có thể xây dựng các ứng dụng nguyên khối rất mạnh mẽ, nhưng mã của bạn sẽ ngày càng phức tạp hơn khi bạn mở rộng quy mô. Mặt khác, cấu trúc phức tạp hơn của Hanami có thể khó học nhưng nó sẽ cho phép bạn xây dựng các ứng dụng có khả năng mở rộng quy mô lớn và có thể giúp tổ chức mã tốt hơn nhiều.
Tiếp theo, chúng ta hãy xem xét hệ sinh thái của từng khung.
Hệ sinh thái và cộng đồng
Như chúng tôi đã đề cập trước đó, Rails có framework vững chắc hơn Hanami. Rails đã tồn tại lâu hơn và do đó có một cộng đồng lớn hơn và trưởng thành hơn.
Sự khác biệt trong hệ sinh thái và cộng đồng được tóm tắt dưới đây:
- Tài liệu - Không quan trọng bạn đang cố gắng xây dựng cái gì, nếu bạn sử dụng Rails, bạn có quyền truy cập vào tài liệu được thực hiện rất tốt. Bạn được hướng dẫn qua tất cả các phần của quá trình xây dựng ứng dụng, từ xác thực, đến lưu giữ dữ liệu, xem bản trình bày và mọi thứ ở giữa. Ngoài ra, rất nhiều hướng dẫn của bên thứ ba đề cập đến hầu hết mọi thứ có thể tưởng tượng được trong quá trình xây dựng một ứng dụng.
Điều đó nói lên rằng, mọi thứ không được ổn định ở phía Hanami. Là một framework tương đối mới hơn, Hanami có cơ sở tài liệu tương đối hạn chế. Nhóm Hanami đã thực hiện một công việc ấn tượng với các hướng dẫn chính thức, nhưng so với cơ sở tài liệu Rails thì nó vẫn chưa bằng.
- Cộng đồng - Ở đây, giống như tài liệu, Rails là người chiến thắng rõ ràng. Rails đã tồn tại lâu hơn Hanami rất nhiều nên nó được áp dụng nhiều nhất. Bất kể bạn là nhà phát triển mới bắt đầu hay nâng cao, bạn sẽ tìm thấy cộng đồng Rails trên các subreddits có liên quan, nhóm Slack, Discords, v.v. Mặt khác, Hanami vẫn đang phát triển, nghĩa là nó có cộng đồng nhỏ hơn nhiều.
- Đá quý và thư viện - Vì cả Hanami và Rails đều là Ruby framework nên có thể lập luận rằng các gem hoạt động trong Rails sẽ hoạt động trong Hanami. Mặc dù điều này đúng về mặt kỹ thuật, nhưng bạn sẽ thường thấy rằng Rails có nền tảng đá quý và thư viện vững chắc hơn cho tất cả các loại chức năng chuyên biệt.
Điều đó nói lên rằng, do Hanami tập trung vào tính trừu tượng và chuyên môn hóa nên nó có một số tính năng rất tiên tiến có thể đưa ứng dụng Rails của bạn lên một tầm cao mới. Ví dụ:gem dry-rb mặc định trong Hanami có thể mang lại khả năng tổ chức và trừu tượng hóa mã tốt hơn khi sử dụng trong ứng dụng Rails.
Tiếp tục, hãy so sánh quá trình học tập và áp dụng của từng khung.
Đường cong dễ sử dụng, áp dụng, quản trị và học tập
Vì những lý do đã nêu trong phần trước, Ruby on Rails dễ dàng đánh bại Hanami về tính dễ sử dụng, khả năng áp dụng trong ngành và đường cong học tập, cụ thể:
- Học tập - Hãy tưởng tượng bạn là người mới bắt đầu muốn học một ngôn ngữ lập trình mới. Suy nghĩ đầu tiên của bạn sẽ là kiểm tra các tài nguyên học tập trực tuyến. Nếu một khung có tài liệu học tập sẵn có rộng rãi bao gồm quá trình xây dựng ứng dụng từ đầu đến cuối, bạn có thể sẽ chọn ngôn ngữ đó thay vì các ngôn ngữ khác. Và bởi vì Rails có cơ sở tài liệu lâu đời hơn nên nó vượt trội hơn Hanami khi là sự lựa chọn framework cho người mới bắt đầu. Ngoài ra, Rails thân thiện hơn nhiều đối với những người mới bắt đầu làm quen vì nó đưa ra rất nhiều giả định sâu sắc (so với Hanami, nơi cung cấp cách xây dựng ứng dụng trừu tượng hơn). Sự trừu tượng của Hanami có thể gây khó khăn ngay cả đối với các nhà phát triển Rails đã thành danh.
- Sự áp dụng trong ngành - Không bao gồm việc áp dụng các khung công tác phổ biến và lâu đời hơn như Python, React, C# và các khung công tác khác, nếu chúng ta xem xét việc áp dụng các khung công tác Ruby, Rails dễ dàng làm lu mờ Hanami. Trang chủ Rails liệt kê một số tổ chức có tên tuổi lớn đang sử dụng framework này. Mặt khác, là một đứa trẻ mới trong khối, Hanami không được áp dụng rộng rãi. Chúng ta sẽ phải chờ xem liệu điều đó có thay đổi trong tương lai hay không.
- Triển vọng thị trường việc làm - Về triển vọng việc làm, bạn sẽ tìm thấy nhiều cơ hội việc làm dành cho nhà phát triển Rails hơn là nhà phát triển Hanami.
- Quản trị - Một khía cạnh quan trọng khác không nên bỏ qua đó là quản trị. Bối cảnh thay đổi hướng dẫn cách các khung nguồn mở phát triển và tiến bộ. Tuy nhiên, hơn thế nữa, các thành viên cốt lõi trong nhóm của các khung này thường nắm giữ quyền lực to lớn và có thể ra lệnh cho những gì diễn ra trong một khung, cách nó phát triển, v.v.
Một ví dụ điển hình là thông báo vào tháng 1 của David Heinemeier Hansson (DHH), người tạo ra Rails. Anh ấy nói rằng, trong tương lai, anh ấy sẽ thúc đẩy Rails cung cấp sự hỗ trợ hạng nhất để xây dựng các ứng dụng web tiến bộ toàn diện và thông báo gốc. Những tính năng này sẽ khiến Rails trở nên rất hấp dẫn đối với các nhà phát triển thiết bị di động.
Để phản ứng lại, nhiều nhà phát triển, một số bên ngoài hệ sinh thái Ruby và thậm chí cả những người đã bỏ Rails trong nhiều năm, đều phản hồi tích cực, nói rằng họ sẽ vui lòng tiếp nhận khuôn khổ này hoặc tìm hiểu nó nếu DHH giữ lời. Ví dụ này chỉ cho bạn thấy rằng quản trị là một yếu tố rất quan trọng cần cân nhắc khi quyết định chọn khuôn khổ nào.
Bây giờ chúng ta hãy chuyển số và xem xét thứ gì đó mang tính kỹ thuật hơn, hiệu suất ứng dụng.
Hiệu suất:Ruby on Rails so với Hanami
Là nhà phát triển, bạn sẽ lo ngại về độ tin cậy, khả năng phản hồi của ứng dụng và cách ứng dụng sẽ sử dụng tài nguyên máy chủ sau khi được triển khai trong sản xuất. Đây là những mối quan tâm cơ bản có thể ảnh hưởng lớn đến việc lựa chọn khuôn khổ của bạn.
Bạn có thể sử dụng nhiều phương pháp để chạy thử nghiệm hiệu suất trên ứng dụng của mình, một trong những phương pháp phổ biến nhất là Apache JMeter. Hãy sử dụng số điểm chuẩn để so sánh Hanami và Rails.
Đây là bài kiểm tra điểm chuẩn nhanh cho thấy số lượng yêu cầu mà mỗi khung có thể xử lý mỗi giây:

Hanami đánh bại Rails nhờ khả năng xử lý yêu cầu nhiều gấp 3 lần Rails.
Ảnh chụp màn hình tiếp theo này hiển thị các giá trị độ trễ trung bình cho từng khung:

Một lần nữa, Hanami đánh bại Rails với thời gian trễ trung bình ngắn hơn khoảng 3 lần.
Nếu bạn đang tìm kiếm một framework Ruby có tốc độ cực nhanh (giả sử bạn cần làm việc trên một API nhanh và có khả năng mở rộng cực lớn), thì bạn sẽ khó tìm được thứ gì tốt hơn Hanami trong bối cảnh Ruby.
Thử nghiệm
Khi nói đến mã kiểm tra, cả hai khung đều có thể so sánh được vì bạn có thể kiểm tra bằng thư viện RSpec linh hoạt.
RSpec được bao gồm thông qua hanami-rspec gem cho ứng dụng Hanami, trong khi bạn cần cài đặt rspec-rails gem để sử dụng nó trong ứng dụng Rails của bạn. Ví dụ bên dưới hiển thị thông số thử nghiệm rất cơ bản đi kèm với ứng dụng Hanami mới của bạn:
Chạy nó với $ bundle exec rspec spec/requests/root_spec.rb sẽ dẫn đến bài kiểm tra đạt (giả sử bạn chưa chỉnh sửa mẫu chế độ xem mặc định):
Về phía Rails, bạn cần tự mình xử lý một số việc. Trước tiên, bạn cần thêm đá quý RSpec vào khối phát triển/thử nghiệm trong Gemfile như hình bên dưới rồi chạy bundle :
Bước tiếp theo là chạy cài đặt RSpec bằng lệnh bundle exec rails generate rspec:install để chuẩn bị sẵn sàng cho dự án Rails của bạn.
Cuối cùng, trước khi viết và chạy bất kỳ thử nghiệm nào, bạn có thể cần cài đặt một gem khác để xác định dữ liệu thử nghiệm cho ứng dụng Rails của mình:FactoryBot.
Và giả sử bạn đã thiết lập bộ thử nghiệm của mình đúng cách và xác định một vài thử nghiệm, bạn có thể chạy thử nghiệm giống như trong Hanami, với bundle exec rspec spec/models/user_spec.rb . Bạn có thể nhận được kết quả kiểm tra của mình giống như cách bạn làm với ứng dụng Hanami:
Cuối cùng, hãy xem các khung so sánh như thế nào khi triển khai.
Triển khai
Ngày nay, có rất nhiều lựa chọn để triển khai ứng dụng Ruby vào sản xuất.
Để bắt đầu, bạn có thể sử dụng nhà cung cấp Nền tảng như một dịch vụ (PaaS) như Heroku hoặc Fly để có trải nghiệm liền mạch hơn. Bạn cũng có thể thực hiện một chút DevOps:thiết lập cài đặt Docker trên VPS và triển khai ứng dụng của bạn ở đó.
Cho dù bạn chọn tùy chọn nào, bạn có thể mong đợi việc triển khai tương đối giống nhau trong cả hai trường hợp. Điều lưu ý duy nhất là thiếu tài liệu và hướng dẫn mở rộng để triển khai ứng dụng Hanami.
Như chúng tôi đã chỉ ra trước đây, là một framework mới hơn, Hanami vẫn chưa có tài liệu chi tiết về quá trình triển khai và những thách thức có thể nảy sinh. Nếu bạn không ngại việc giải quyết vấn đề này thì bạn sẽ ổn thôi.
Kết thúc
Trong bài viết này, chúng ta đã xem xét hai framework Ruby — Ruby on Rails và Hanami — so sánh chúng về các tính năng, kiến trúc, hiệu suất, v.v. Cuối cùng, chúng ta phải trả lời câu hỏi:"Tôi nên sử dụng framework nào và tại sao?". Chúng ta có thể tóm tắt như sau:
- Nếu bạn là nhà phát triển Ruby mới bắt đầu, hãy bắt đầu với Rails:việc tiếp thu và học hỏi sẽ dễ dàng hơn. Nếu bạn là nhà phát triển Ruby nâng cao hơn, hãy phát triển bộ kỹ năng Hanami vì nó sẽ giúp bạn phát triển các ứng dụng Ruby mạnh mẽ hơn nữa.
- Nếu bạn cần phát triển một ứng dụng có tốc độ nhanh, chẳng hạn như một API phục vụ nhiều khách hàng, thì dung lượng bộ nhớ nhỏ của Hanami, phản hồi nhanh và độ trễ thấp sẽ phục vụ tốt cho bạn. Tuy nhiên, nếu bạn chỉ cần phát triển một ứng dụng full-stack nguyên khối để xác thực ý tưởng SaaS, Rails chắc chắn sẽ đưa bạn đến đó nhanh hơn.
Cuối cùng, những gì bạn chọn cuối cùng thực sự tùy thuộc vào bạn. Việc đạt được các kỹ năng trong cả hai khuôn khổ không phải là một ý tưởng tồi. Bằng cách đó, bạn có thể quyết định khuôn khổ tốt nhất để áp dụng, tùy thuộc vào nhu cầu của dự án.
Chúc bạn viết mã vui vẻ!
Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!
P.P.S. Bạn có biết AppSignal có tích hợp Rails và Hanami không?