
2026/07/02 2:41
花火 Ver. 3.0 が全面咲くのを間近に
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Hanami 3.0 は、Ruby 3.3+ の必須サポートと大幅なパフォーマンス向上を原動力とした Web アプリケーション開発における重要な進化を表します。デフォルトでは、メモ化されたコンポーネントとアップフロントのアクション構成スナップショットによる割り当て削減により、HTTP 上のリクエストの実行速度がほぼ 3 倍に向上し、tail latency は 89ms から p99 で 4ms に削減されました。メモリ消費量はバージョン 2.3 と比較して著しく低下しています。本アップデートは以下の 3 つの主要な新機能を導入します:
t() および localize ヘルパーを備えた内蔵型国際化(i18n)、デフォルトの RSpec フレームワークとの併用でネイティブな Minitest サポート、そして SMTP、インメモリなど複数の配信方法をサポートし、依存性の注入を通じてファーストクラス市民として動作する統合型メールャーです。内部的にはエコシステムが近代化されており:hanami-controller ジェムは hanami-action に改名され、バリデーションロジックは hanami-validations から dry-validation の直接使用へと移行し、アクション構成にmultipart フォームおよび JSON によるリクエストボディパースが標準装備されています。ビューの露出は明示的に要求される場合を除きデフォルトで装飾されず、アセットウォッチングは画像やフォントなどの静的アセットの追加・削除を処理する際に再開始を行いません。ローギンは開発環境でデフォルトカラー化、:debug レベルで SQL ステートメントがログ出力され、キーワード引数および #tagged ブロックを用いた一貫した構造化インターフェースへと改善されています。その他の微調整には、新しいジェネレーター(provider, mailer)、ジェネレーターの --force オプション、ならびに gem.coop への対応が含まれます。これらの変更により、より効率的で国際化されかつリソースフットプリントが小さいアプリケーションが可能となりますが、古い Ruby 環境をバージョン 3.3 以上にマイグレーションする必要があります。本文
ハナミ 3.0 のリリース!モジュール化された Ruby フレームワークへの進化
ハナミは当初から、明確でモジュール化され、拡張性を備えたシステムという方針で開発されてきました。本日、その方針に沿った ハナミ 3.0 が正式に発表されます!今回のリリースでは、フレームワークを以下の 三大新機能 とパフォーマンスの劇的な向上で大幅に進化させました。
🚀 メインの新機能と強化点
- メーラー(メール送信機能):以前失くしていた機能が戻ってきました。
- 国際化(i18n):アプリケーションの世界展開が容易になりました。
- Minitest テストフレームワークへの対応:RSpec と Minitest の両方をサポートします。
これらに加えて、デフォルト設定での高速化やログの明確化など、開発体験全体の向上を図っています。
📧 一等市民待遇のメーラー機能
統合されたメーラー機能が標準搭載され、アクション、ビュー、操作(operations)と調和した形で利用できるようになりました。
メーラークラスの基本構造
メーラークラスは、メール送信に必要なすべての要素を記述します。
module Bookshelf module Mailers class Welcome < Bookshelf::Mailer from "welcome@bookshelf.test" to { |user:| user.email } subject { |user:| "Welcome to Bookshelf, #{user.name}!" } expose :user end end end
- オブジェクト指向アプローチ:スタンドアロンのオブジェクトとして機能し、
ミクシンを介して依存注入可能です。Deps - 自動ヘッダーとテンプレート:
メソッドを実呼ぶだけで、入力値を使用したヘッダー準備およびビュー層の機能を取り入れたメール描画を行います。.deliver
配信方法の柔軟性
- 標準 SMTP:SMTP ホストの環境変数設定だけで利用可能です。
- テスト環境:メールはメモリ上に蓄積され、確認・検証が可能です。
- 高度なカスタマイズ:独自の配信メソッドを記述可能で、配信オプションのチェーン(連鎖)化をサポートしています。
ハナミ メーラーは低レベル処理を担当する名作 mail gem を基盤としています。
🌍 インターナショナル化(i18n)機能内蔵
アプリケーションの世界展開が今よりずっと簡単になりました。「i18n」gem が直接組み込まれ、翻訳バックエンドの設定やヘルパーが即座に利用可能です。
翻訳データの管理
翻訳データは
config/i18n/ ディレクトリに格納されます。
config/i18n/en.yml
en: posts: index: title: "Latest posts" create: created: "Your post is live!" greetings: welcome: "Welcome, %{name}!"
翻訳ヘルパーの利用例
- ビュー内:
<h1><%= t(".title") %></h1> - アクション内:
def handle(request, response) response.flash[:notice] = t(".created") # ... end - 独自コンポーネント内(
を介して取得):Deps["i18n"]class Greeter include Deps["i18n"] def call(name) i18n.t("greetings.welcome", name:) end end
ローカライゼーション(フォーマット設定)
localize ヘルパーにより、日付や時刻を現在のロケールに合わせてフォーマットできます。
localize(Date.new(2026, 5, 22)) # => "Fri, 22 May 2026" localize(Time.new(2026, 5, 22, 9, 5), format: :short) # => "22 May 9:05 am"
✅ Minitest との連携
ハナミは従来の RSpec セットアップを維持しつつ、新しい Minitest サポートを追加しました。アプリケーション生成時にテストフレームワークを選定可能です。
クイックスタート:Minitest 採用
$ hanami new my_app --test=minitest
- RSpec はデフォルトですが、必要であれば Minitest を採用できます。
- 同等の完全なセットアップ環境が即座に提供されます。
🚄 デフォルト設定で大幅に高速化
ハナミ 3.0 は導入直後から恩恵を受けるレベルの劇的な速度向上を達成しました。
パフォーマンスの目覚ましい改善
- スループット向上:HTTP を介した同一リクエストの実行速度が約 3 倍 に向上。
- メモリ使用量低減:テスト用アプリケーションでのメモリ使用量は微々たるものとなり、リクエストあたりの割当(allocation)数は約 14 倍 減少。
- タイルラテンシー縮小:p99 が 89ms から 4ms に急落。
なぜ这么快?
- コンポーネントのメモ化:コンテナ内の各コンポーネントは一度解決すれば再利用され、再構築がなくなります。
- アクション設定のスナップショット化:
が各アクションの設定を事前に取り込むため、リクエストごとの再計算が不要に。Hanami::Action- 最小限のアクションでは割当数が 88 → 17 に減少(約 3.7 倍 高速化)。
- ビュー描画の最適化:
が設定スナップショット処理を受け、余計な装飾処理が不要に。Hanami::View- 最小限の描画では割当数が 100 → 42 に減少(約 2.9 倍 高速化)。
これらすべての機能は無料で利用可能です!アップグレードだけでコード変更なしで高速化を実現できます。
📝 より明確で有用なログ
開発から本番環境まで、ログ機能を見直しました。
- 開発環境:デフォルトでカラー化されたログが表示され、SQL ステートメントも統一フォーマットに整形されます。
gem をバンドルすれば構文ハイライトも可能。rouge - SQL ログの抑制:本番環境での出力を静かにするため、SQL ステートメントのログレベルが
から:info
へ変更されます(:debug
で調整可能)。config.db.log_level - 環境変数設定:アプリケーションクラス内の設定よりも優先される
環境変数でログレベルを簡便に設定可能。HANAMI_LOG_LEVEL
ハナミは内部構造においてロギングのインタフェースを不変化し、以下の機能を標準で保証します:
- 構造化ロギング:キーワード引数を通じて標準メソッドからアクセス。
- タグ付きロギング:
ブロックを通じてログ付けが可能。#tagged
📦 よりスムーズなアセットウォッチ
「hanami assets watch」 は作業ペースに追従するよう進化しました。
- 新規・削除されたエントリーポイントや、静的アセット(画像、フォントなど)の変更をリアルタイムで検出。
- 監視プロセスの再起動が必要なくなるとおり、開発フローが妨げられる心配がありません。
また、あらゆるアセットバンドラーがハナミへのクリーンなプラグイン方法を規定する仕様を制定しました。当社のバンドラー(esbuild 系)を基盤としつつ、バンドラーロックインを防ぎ、ユーザー自らの好きなバンドラーの導入を歓迎しています。
🔄 ハナミ アクションへボディパーサー機能の統合
リクエストボディのパース処理が Middleware から取り出され、ハナミ アクション内に移転しました。
- フォーマット駆動型:アクションは受け入れるフォーマットに合わせて正確にパースを行ないます。
- 標準パーサー搭載:Multipart フォームボディと JSON パーサーが標準で利用可能。
- カスタムパーサー登録:必要であれば独自のパーサーを登録できます。
formats.register(:custom, "application/custom", parser: ->(body, env) { ... })
🎨 装飾されなかったエクスポジションによるシンプル化されたビュー
現在、ビューのエクスポジション(exposure)はデフォルトで装飾されません。テンプレートは要求通り受け取り、余計な作業を避けます。
- 明示的な装飾が必要な場合:新しい
メソッドを使用します。.decorate - 従来の動作に戻したい場合:
を設定します。config.decorate_exposures = true
🧹 よりクリーンな基盤
メジャーバージョンアップで基盤を整理整頓しました。
Gem 名の統一と廃止
→hanami-controller
に改名(クラス名と一致)。hanami-action- 依存関係設定時は
またはhanami-action
を使用してください。hanami/action
- 依存関係設定時は
が廃止。ハナミ アクションが直接hanami-validations
を呼び出すため、不要な中間 gem を省きました。dry-validation
Ruby バージョン必須化
ハナミ 3.0 では Ruby 3.3 またはそれ以降の使用を必須としています。 これにより動く部品が減り、gem の名前は明確になり、アプローチが容易になりました。
✨ さらに多くの機能!
- ジェネレーター強化:
- 新しい「hanami generate provider」と「hanami generate mailer」を追加。
- 全てのジェネレーターに
オプション(既存ファイル上書き)を付与。--force
にアプリ名空間を別途設定するhanami new
オプション追加。--name
でhanami new
から gem をインストール可能に。gem.coop
- テンプレートエンジンの可視化:
- エンジン用のテンプレート作成時に
オプション対応(erb, haml, slim)。--template-engine - 生成されたアプリケーションは Puma 7.1 を要求し、アプリプリローディング用テンプレート削除。
- エンジン用のテンプレート作成時に
- ルーターの明確化:
- ルーター内に明示的なリダイレクトヘルパー(
,permanent_redirect
)を追加。通常のリダイレクトには明示的なtemporary_redirect
引数が必要に。code:
- ルーター内に明示的なリダイレクトヘルパー(
- 設定検索の効率化:複数のストア間で設定検索を連鎖させるための
を追加。Hanami::Settings::CompositeStore - スライスの返却変更:
がすべてのスライス(ネストを含む)を返すようになった。Hanami::Slice.with_slices - ビュー情報のエクスポート:現在描画中のテンプレート名を
およびtemplate_name
としてエクスポート(相対 i18n キー検索対応)。current_template_name - エラーハンドリング改善:ルートが存在しない場合、スライスを Rack アプリとして呼び出すための便利なエラーを抛出するように改良。
- ハナカイの新しいウェルカム画面:美しいビジュアルを実装(感謝 マックス!)。
📢 是非お試しください!
ハナミ 3.0 の新しいアプリケーションは数コマンドですぐに始められます。
$ gem install hanami $ hanami new my_app $ cd my_app $ bin/hanami dev $ open http://localhost:2300
あなたの活用状況について聞きたいです!フォーラムやチャットで声をかけてください。私たちはコミュニティを非常にフレンドリーに保ち、常にハナミの旅路にお手伝いすることに喜んでおります。
2.3 からのアップグレード
すでに 2.3 を使用中の方は、3.0 アップグレードノート をご確認ください。
👏 コントリビューターへのご感謝!
今回のリリースに貢献してくださった皆様:
- Aaron Allen, Adam Lassek, Carolyn Cole, Edouard, Jane Sandberg
- Joshua Young, Konstantin Haase, Kyle Plump, Matthew Stanton
- Max Wheeler, Paweł Świątkowski, Philip Arndt, Ramón Valles
- Sean Collins, Tim Riley, Wout, Yi Sangwon
ビジネススポンサーへ:
- 🥇 Sidekiq:プラチナスポンサー
- 🥈 Brandon Weaver:ゴールドスポンサー
- 🥉 Honeybadger, FastRuby.io, AppSignal, SerpApi:シルバー・スポンサー
GitHub Sponsors および Open Collective を通じた個人の方々の支援も大いに感謝申し上げます。
本日、ハナミは満開を迎えていますが、庭園は決して完成するものではありません。その実現のためには、皆様の支援が不可欠です。ぜひスポンサーの仲間になってください。