Web開発
Hanami 3.0: 満開
Hanami 3.0: In Full Bloom (hanakai.org)
要約
Hanami 3.0がリリースされ、Rubyフレームワークとしての成熟を迎えました。このバージョンでは、メール機能、国際化(i18n)、Minitestのサポートが主要な新機能として追加されています。また、デフォルトでのパフォーマンスが大幅に向上し、ログ機能が改善され、アセット監視やボディパーシングもよりスムーズになっています。
全文翻訳
このページから
当初から私たちは、Hanamiを明確で、モジュール式で、成長するように構築された、これまでのRubyフレームワークとは異なるものにしようと決めました。今日、それは満開を迎えます。Hanami 3.0を皆さんと共有できることを嬉しく思います!このリリースでは、メーラー、国際化、Minitestという3つの大きな新機能でフレームワークが完成します。それに加えて、あなたのアプリはデフォルトでより高速になり、ログからアセットに至るまで、開発者体験がよりシャープになります。
一流のメーラー
長らく失われていたgemが帰ってきました!Hanamiアプリには、アクション、ビュー、オペレーションの隣にぴったりと収まる統合メーラーが付属するようになりました。メーラークラスは、メールを配信するために必要なすべてを記述します。
```ruby
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ホストの環境変数をいくつか設定すれば準備完了です。テストでは、メールはメモリに蓄積され、検査できます。さらに必要な場合は、独自の配信方法を記述することもできます。これらに対するクリーンなインターフェースに加えて、Hanami Mailerは配信オプションをメーラー全体にスレッド化するためのフックを提供し、新しい配信方法がメール配信プロバイダーが提供する特別な機能を最大限に活用できるようにします。私たちのすべてのgemと同様に、Hanami Mailerもスタンドアロンで使用できるように設計されています。Rubyアプリでそれを使用するために知っておくべきすべての情報については、包括的なREADMEを確認してください。Hanami Mailerは、低レベルのメール処理のすべてを処理するために、尊敬されるmail gemに依存しています。長年にわたるmailメンテナーの皆様のすべての仕事に感謝します!
組み込みの国際化
アプリを世界に広めるのが簡単になりました。i18nがHanamiに組み込まれるようになりました。i18n gemをバンドルすると、Hanamiはアプリとすべてのスライスに自己完結型の翻訳バックエンドを設定し、translateおよびlocalizeヘルパーがアクションとビュー全体で使用できるようになります。翻訳はアプリまたはスライスのconfig/i18n/にあります。
```yaml
# config/i18n/en.yml
en:
posts:
index:
title: "Latest posts"
create:
created: "Your post is live!"
greetings:
welcome: "Welcome, %{name}!"
```
そこから、i18nヘルパーは期待どおりのどこにでもあります!ビューのように。
```erb
<%# app/templates/posts/index.html.erb %>
<h1><%= t(".title") %></h1>
```
そしてあなたのアクションにも。
```ruby
# app/actions/posts/create.rb
def handle(request, response)
response.flash[:notice] = t(".created")
# ...
end
```
その他のすべての場所では、「i18n」コンポーネントはDepsミックスインから一つだけ離れています。
```ruby
class Greeter
include Deps["i18n"]
def call(name)
i18n.t("greetings.welcome", name:)
end
end
```
ローカライズも利用できます。localizeは日付と時刻を現在のロケールに合わせてフォーマットし、英語の適切なデフォルト値が付属しています。
```ruby
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"
```
Hanamiのすべての側面と同様に、i18nは最小限の設定でそのまま機能するように設計されていますが、カスタムなものが必要な場合はたくさんの設定があります。詳細については、i18nガイドを参照してください。国際化にはi18n gemが不可欠であり、この新機能のすべての重い作業を行っています。したがって、i18nメンテナーの皆様に、世界中のRubyistsを助けてくださったことに、オーストラリア英語で「cheers, mates」と大きな感謝を申し上げます!
Minitestに対応
Hanamiは常にRSpecの準備が整ったセットアップが付属していました。新しいMinitestのサポートにより、ついに残りの半分の方々を喜ばせることができて嬉しいです!アプリを生成するときにテストフレームワークを選択してください。
```bash
$ hanami new my_app --test=minitest
```
RSpecがデフォルトですが、Minitestを選択すると、自分で何かを構築する必要なく、同様に完全なセットアップが得られます。Ryan Davis氏とMinitestへのすべての貢献者の皆様の仕事に心から感謝いたします。MinitestはRuby自体に付属しており、今後Hanamiのストーリーの一部にできることを嬉しく思います。
デフォルトで高速化
Hanami 3.0は大幅に高速化されており、すぐにその恩恵を受けることができます。テストアプリでは、同じリクエストがHTTP経由で約3倍高速に実行され、メモリ割り当てもわずかになりました。Hanamiはデフォルトでコンポーネントをメモ化するようになりました。これは、アプリのコンテナ内の各コンポーネントが一度だけ解決され、必要になるたびに新しく構築されるのではなく、再利用されることを意味します。これがあなたが本当に感じる変化です。9つのコンポーネントのグラフを解決し、ビューをレンダリングするアクションを持つアプリを取り上げ、2.3と3.0で同じリクエストを測定しました。3.0では、リクエストあたりの割り当てが14分の1になり、HTTP経由でのスループットが約3倍になりました(サーバーがボトルネックではないプロセス内での測定では9倍近くのスループット)。テールレイテンシも大幅に低下し、リクエストあたりの割り当ての頻繁な発生とGCの一時停止がなくなったため、p99は89msから4msに減少しました。
また、フレームワークの最もホットな部分全体でパフォーマンスを向上させることに焦点を当てました。Hanami Actionは、リクエストごとに再計算するのではなく、各アクションの設定を事前にスナップショットし、全体としてリクエストあたりの割り当てがはるかに少なくなります。最小限のアクションは88の割り当てから17に減少し、単独で約3.7倍高速に実行されます。Hanami Viewも同じ設定スナップショット処理を受け、デフォルトでエクスポージャーを装飾しなくなりました。最小限のレンダリングは100の割り当てから42に減少し、約2.9倍高速に実行されます。これらすべての最高の部分は?それは無料の昼食です!3.0にアップグレードするだけで、コードを変更することなく、アプリはより高速に、より少ないメモリで実行されます。3.0のパフォーマンス作業の多くを推進してくれたSean Collins氏に特別な感謝を申し上げます。以前の3倍近くあなたを愛しています!
より明確で、より役立つログ
3.0では、日々の開発とプロダクションの両方でログに力を入れました。開発では、ログはデフォルトで色付けされます。SQLステートメントはリクエストログに合わせてフォーマットされ、rouge gemがバンドルされている場合は構文ハイライトされます。SQLステートメントは、プロダクションログを静かにするために:infoレベルではなく:debugレベルでログに記録されるようになり、これはconfig.db.log_levelで調整できます。また、HANAMI_LOG_LEVELで環境からログレベルを便利に設定でき、これはアプリクラスのすべての設定よりも優先されます。内部的には、Hanamiはロガーの一貫したインターフェースを保証するようになりました(サードパーティの代替を設定した場合でも)。したがって、常に次のことを期待できます。
標準のログメソッドに渡されるキーワード引数による構造化ロギング。
#taggedブロックによるタグ付きロギング。
詳細については、改訂されたロガーガイドを参照してください。
よりスムーズなアセット監視
hanami assets watchは、より多くの作業に追いつくようになりました。新しく追加および削除されたエントリポイントを検出し、画像やフォントなどの静的アセットの変更に反応します。以前のバージョンでは、これらのそれぞれでウォッチャーを再起動する必要がありました。現在は追いついているため、フローを維持できます!また、任意のアセットバンドラーがHanamiにきれいにプラグインできる方法をカバーする仕様も公開しました。私たち自身のバンドラーはesbuildに基づいていますが、あなたを閉じ込めることを望んでいません!お気に入りのバンドラーをHanamiに持ち込むことをぜひ見たいと思っています。
Hanami Actionへのボディ解析
Hanamiのリクエストボディ解析は、ミドルウェアからHanami Actionに移行し、formats configによって駆動されるようになりました。あなたのアクションは、あなたが受け入れる形式を正確に解析し、コンテンツネゴシエーションの残りの部分と一緒にこれを設定できます。マルチパートフォームボディとJSONのパーサーはすぐに機能します。そして、他の何かが必要な場合は、独自のものを登録できます。
```ruby
formats.register(:custom, "application/custom", parser: ->(body, env) { ... })
```
詳細については、formats and media typesガイドを参照してください。
装飾されていないエクスポージャーによるよりシンプルなビュー
ビューのエクスポージャーはデフォルトで装飾されなくなりました。あなたのテンプレートは、あなたが