Adopting Herb at GitHub
https://hawksley.org/2026/05/06/adopting-herb-at-github.html
Joel HawksleyによるGitHubでのHerb導入経験についてのBoulder Rubyライトニングトーク記録
GitHubでHerbを導入する理由
RailsコアチームがHerbにErubiを置き換えさせたい意向
GitHubはおそらく世界最大のERBレンダラー
約50万行のERB、約1万ファイル(平均50行/ファイル)
新UIはReact中心だが、2025年も350ファイル・15,000行以上のERBを追加
2024年比で2倍のファイル数
Railsに取り込まれる前の検証役を依頼された
導入プロセス
最初の目標はnpx @herb-tools/linterのparser-no-errorsルール通過
初回実行時の通過率は75%未満で、2,768ファイルの修正が必要だった
Herbが見つけた既存コードのバグ
不正なHTML
閉じタグ不足、ブラウザの寛容性で隠れていた
要素やERBブロックの閉じタグが入れ替わっているケース
条件付きの開閉タグ
ASTへの変換が困難なパターン
captureブロックを使う形にリファクタリングした
約150件存在したが、Claude Opusによるワンショット修正がほぼ100%成功
不正なRubyコード
<% if x.y? && x.z? && %>のような構文エラー
erb_lintとテストスイートで見逃されていた
Prismで実際にRubyをパースするため検出可能
Herb自体に見つけたバグ
空白文字の扱いのバグ
Erubiと挙動が異なるケース
コメント付きendで不正なRubyを生成する重大バグ
Railsはテンプレートを実行時までコンパイルしない
実行されない行はCIで検出できず、本番でランタイム例外になる
RailsがActionViewハンドラの出力を盲目的に信頼する設計の問題でもある
対策としてherb analyzeにRuby検証を追加
ベンダーディレクトリのテンプレート
herb CLIはvendorディレクトリを無視する
Gem提供のERB(Primer ViewComponents、good_jobなど)で本番クラッシュの可能性
暫定的にCIで全vendorの.erbを強制コンパイルする独自チェックを追加
パフォーマンスの問題
ランタイム性能に影響なし、しかしブート時間が2分→3分に増加
HerbはErubiよりテンプレートコンパイルが1桁遅い
Tiny(58B): 7.2倍
Small(250B): 11.2倍
Medium(1KB): 15.0倍
Large(3KB): 13.0倍
GitHub.comはActionView::Precompilerでブート時にキャッシュを温める
約500MB/コンテナのCopy-on-Writeメモリ削減効果もある
本番投入は性能問題の解決待ち
Marco Rothは最適化可能と見ている
ActionView::PrecompilerのRails本体へのupstreamを提案
残課題
Erubiの108テストのうち8つが未通過
Hyrum's Lawの典型例
20年以上の歴史を持つERB、10年近いErubiに依存する未文書化挙動が多数存在
今後の方向性
erb_lintとerb_lint-githubへの依存を削除
Lintルールの拡張
Herb ASTを使ったERB→Reactへのトランスパイル