ミニファイア
JavaScript のミニファイは、ユーザーに送るデータ量を減らしページ表示を速くするうえで重要です。EC サイトではわずかな遅延が大きな損失につながることもあります。
既存のミニファイアは、圧縮率と速度のトレードオフを迫られることが多く、最も遅いものほど圧縮は良く、速いものほど圧縮は控えめ、といった選び方になりがちです。速度を犠牲にせず圧縮品質も維持するミニファイアを実現できないか、というのが狙いです。
プロジェクトの目標
google-closure-compiler、terser、esbuild、tdewolff-minify など主要ツールからテストケースを移植したプロトタイプを開発中です。
現状の結果は目標に届きそうな方向に見えます。Oxc ミニファイが実用化すれば、圧縮品質を大きく落とさず、より短い時間でミニファイできることを期待できます。
目標とする性能
- 速度: Terser より速く、esbuild と同等帯を狙う
- 圧縮率: Terser に匹敵、あるいは上回る
- 正しさ: 主要なミニファイのテストスイートに通過
アーキテクチャの概要
設計方針
- セマンティックを意識: セマンティック解析により安全な最適化を可能にする
- インクリメンタル: インクリメンタルなビルドフロー向け
- 設定可能: 最適化レベルやターゲットを選べる
- 正しさ優先: 攻めすぎた最適化より正確性を優先
現状
実装済み機能
- ✅ デッドコード削除: 到達不能コードの除去
- ✅ 定数畳み込み: 定数式の評価
- ✅ ツリーシェイク: 未使用エクスポートの削除(基本)
- ✅ 変数のマージ: 宣言の統合
- ✅ 文のマージ: まとめられる文の結合
- ✅ 名前の難読化: 変数・関数名の短縮
- ✅ 制御フローの最適化: 分岐構造の単純化
- ✅ 関数のインライン化: 小さい関数の展開
- ✅ 高度なツリーシェイク: モジュール横断の最適化
パフォーマンス戦略
- AST 走査の回数を減らす: 複数の最適化を一つのパスにまとめる
- データ構造: アリーナ割り当てやコンパクトな表現
- 早期打ち切り: 見込みのない最適化はスキップ
参考資料
ドキュメント
外部リンク
試せるサイト
- esbuild: https://esbuild.github.io/try
- rollup: https://rollupjs.org/repl
- swc: https://play.swc.rs
- terser: https://try.terser.org
- closure compiler: https://jscompressor.treblereel.dev
- 公式のホストは終了: Closure Compiler Webservice Turndown - 2025