世界を動かす技術を、日本語で。

Brut: Rubyのための新しいウェブフレームワーク

概要

Brut はRuby向けのシンプルかつ高機能なWebフレームワーク コントローラーやリソース の概念を排除し、ページやフォーム単位で構築 サーバーサイドHTML生成 を基本とし、JSやCSSも自由に記述可能 OpenTelemetryやSequel などの最新技術を活用した設計 セットアップが容易 で、Dockerを使い数分でアプリ作成が可能

Brutの特徴

  • Ruby製Webフレームワーク でありながら、従来のコントローラーやアクション、リソースの概念を持たない独自路線
  • ページ、フォーム、シングルアクションハンドラー 単位で開発するアーキテクチャ
  • サーバーサイドでHTML生成、クライアント側でJSやCSSを自由に追加可能
  • 低抽象・低儀式 を重視しつつ、Sinatraのような低レベルではなく、Webフレームワークとしての機能性を保持
  • OpenTelemetryベースの計測SequelによるデータアクセスOptionParserベースのCLI自動化 を標準搭載

インストールとセットアップ

  • Dockerコンテナ による簡単なセットアップ

    • docker run -v "$PWD":"$PWD" -w "$PWD" -it thirdtank/mkbrut mkbrut my-new-app
    • cd my-new-app
    • dx/build && dx/start
    • dx/exec bin/setup
    • dx/exec bin/dev で開発サーバ起動(localhost:6502)
  • Rubyのインストール不要、即座に開発開始可能

コア設計と思想

  • クラスベース設計 :クラスをインスタンス化し、メソッドを呼び出す明快な構造
  • includeや巨大な関数群、Hashの乱用を排除 した設計
  • セッション、フラッシュ、フォームパラメータ もすべて型付きクラスで管理
  • 動的メソッド定義やmethod_missingの最小化
  • ほぼすべてのメソッドにドキュメントが付与

モダンWebプラットフォーム対応

  • クライアント・サーバーサイドのバリデーション統合 による一貫したUX
  • BrutJS :HTMLを段階的に強化するWeb Componentsライブラリ
  • esbuildによるCSSの即時パッケージ・最小化・ハッシュ化
    • PostCSSやSASSは不要

デフォルトで良い実践

  • 適切なコンテンツセキュリティポリシー
  • データベースカラムはデフォルトでnull不可
  • 外部キーは必ず存在し、インデックス付き、null不可
  • Clockによるタイムゾーン対応の時間管理
  • 容易なローカライズ(I18n)

利用している主要Gem

  • RSpec :テスト記述用、独自マッチャーも提供
  • Faker・FactoryBot :テスト/開発データ生成
  • Phlex :HTML生成エンジン(HAMLは非対応)
  • i18n :翻訳はRuby Hashで管理(YAMLは基本不使用)
  • dotenv :環境変数で動的設定(dev/test)

設計思想とメリット

  • 不要な抽象化やYAML地獄を排除
    • 設定や定義はRubyコードや環境変数で一元管理
  • ページ名とクラス名が直感的に対応
    • 例:/widgetsはWidgetsPageクラス
  • DBアクセスとドメインロジックの分離
    • DB::Widgetでデータ取得、WidgetやWidgetServiceでビジネスロジック実装も自由
  • コントローラーや複雑なアクションの不要化
  • モナドや関数型の難解な概念を理解せずとも開発可能
    • 必要なら導入も可能だが、強制されない

開発体験と今後

  • Railsのような儀式や設定の繰り返しからの解放
  • フロントエンド技術の頻繁な変化に振り回されない
  • ビジネスロジックの配置やHTTPメソッド論争からの脱却
  • RubyとHTML、そして現代ブラウザの力を最大限活用する開発体験
  • Ruby 3.4対応
  • 今後も1.0リリースに向けて開発継続予定

参考アプリ・ドキュメント

  • ADRs.cloud :実際に動作するサンプルアプリを公開中
  • 詳細なドキュメント も完備

Brutを選ぶ理由

  • シンプルかつ強力なWeb開発環境をRubyで実現
  • 設定や抽象化に時間を取られず、開発そのものを楽しめる
  • 現代的なWeb開発のベストプラクティスを標準装備
  • Ruby好き・HTML好きな開発者に最適

Hackerたちの意見

いいね!これは、シンプルなアプリにはあまり必要ないけど、Sinatra(大好き!)とRails(これも好きだけど、必要なアプリ用)との間のいい中間地点になりそうだね。試してみるのが楽しみ!

もう一つの選択肢は https://roda.jeremyevans.net/ だね。小さなプロジェクトにはちょうどいい感じだけど、スケールアップもできるよ。プラグインシステムがすごくうまく機能して、ルーティングツリーも扱いやすい。

自分にとっての中間地点はHanamiだけど、Brutの開発はしっかり見守るつもり。

「モナドや代数データ型、カリー化、もしくはすべてをProcにすることについてはどう思う?その質問のどの部分も理解する必要はないよ。でも、ビジネスロジックでファンクターを使いたいなら、やってみて。止めないから。」 これ、めっちゃいいね!サイドプロジェクトや、少人数の経験豊富な同僚と一緒にやるプロジェクトにぴったりだと思う。

サンプルサイトにログインしようとしたけど、GitHubで認証した直後にエラーが出ちゃった。

ここで作者です。今はサンプルがログインを許可していないのは、悪用を避けるためです。公開するかどうか100%確信がなかったけど、今日公開することに決めたので、まだ誰でもログインできる状態ではありません。サイトをローカルで実行するか、https://brutrb.com/adrs.html に行ってリンクをクリックすれば、ページを見ることができます。

フォームとページに重点を置いているのがいいね。私のアプリでもそのアプローチを取ってる。フォームとリンクがすべてのインタラクションを駆動してる。JavaScriptの強化は、隠れていても既存のフォームをクリックするだけ。HTMLを検査すれば、どのルートがインタラクションを処理するか正確にわかるよ。コントローラーは使いすぎだと思う。実際には、フォーム、モデル(バックエンド)、ビュー(ページ)なんだ。コントローラーのバリデーションや儀式的な部分は、フレームワークがもっと優雅に処理できると思う。

フォームでsubmit()を呼ぶんじゃなくて、クリックイベントをシミュレートする理由ってあるの?

現在Sinatraをベースにしているんだね。Rodaを検討したことはある?

(ここに著者) Sinatraを使ってるのは、たまたま知ってたからで、低レベルな部分を立ち上げる必要があったからなんだ。長期的にSinatraに基づく必要があるかは分からないけど、Rackを使った方がいいかもね。

Rodaは、ルーティングツリーのアーキテクチャがあるから、Sinatraの線形ルーティングよりもパフォーマンスやメンテナンス性が良いかもしれない。特にアプリが大きくなるにつれてね。

これ、Campingを思い出すけど、動的な親クラスのコンストラクタがない感じ。

スターつけたけど、まだRuby使ってない(使う予定もないけど)。これがきっかけで試してみるかも。

Brutの公式サイトも面白かったよ。 https://brutrb.com/overview.html

特殊なライセンスがあるのは理解してるけど、それってソースコードが見れないってことになるの?

https://github.com/thirdtank/brut ?

ちょっと変だね、同意。

デイビッドの本『Sustainable Rails』が大好きで、Railsに関する本の中でいつもおすすめしてるやつなんだ。これはすごく面白い視点だね。こういう小さな代替フレームワークがSorbetをフル活用して、フォームバリデーションみたいなことに使うのを見てみたいな。徐々に型を導入するアプローチには反するかもしれないけど、絶対面白いと思う。

すごく才能のある人で、話すのも上手だよ。彼のトークもいくつかおすすめだな。たぶん、この本の内容に近いこっちのやつがいいかも。https://www.youtube.com/watch?v=CRboMkFdZfg

Sorbetはいいけど、データ構造の強制やデータバリデーションに関しては、dry-rbエコシステムの方が断然好きだな。