Minifier
JavaScriptのミニファイアは、送信されるデータ量を削減することで、ウェブサイトのパフォーマンスを最適化する上で重要な役割を果たします。これにより、ページの読み込み速度が向上します。この効果は特に、1秒単位で数百万ドルに相当する可能性のある電子商務サイトにとって、莫大な経済的価値を持っています。
しかし、既存のミニファイアは圧縮品質と速度の間で妥協を強いられることが一般的です。最高の圧縮率を得るためには遅いツールを選ばなければならず、逆に高速なツールを選ぶと圧縮率が低下します。では、圧縮品質を損なわずに、より速いミニファイアを開発できないでしょうか?
プロジェクトの目標
当プロジェクトでは、google-closure-compiler、terser、esbuild、tdewolff-minify といった著名なミニファイアからすべてのテストケースを移行することで、この目標に向けたプロトタイプの開発を進めています。
初期の結果から、目標達成に向けて順調な進捗が見られています。Oxcミニファイアを使用すれば、圧縮品質を犠牲にせずに、より高速なミニファイニングが実現可能です。
目標となるパフォーマンス
- 速度: Terserより速く、esbuildと同等の性能
- 圧縮率: Terserの圧縮比と同等かそれ以上
- 正しさ: 主要なミニファイアテストスイートをすべて通過
アーキテクチャの概要
設計方針
Oxcミニファイアは以下の重要な原則に基づいて構築されています:
- 意味論に対応した設計: 意味解析を活用し、安全な最適化を可能にする
- インクリメンタル対応: インクリメンタルコンパイルワークフローに適合する設計
- カスタマイズ可能: 異なる最適化レベルやターゲットをサポート
- 正確性重視: 過度な最適化よりも正確性を優先
現在の状況
実装済み機能
- ✅ 不要コード削除: 到達不可能なコードを削除
- ✅ 定数畳み込み: 定数式を評価
- ✅ ツリーシェイキング: 使用されていないエクスポートを削除(基本版)
- ✅ 変数マージ: 変数宣言を統合
- ✅ ステートメントマージ: 互換性のあるステートメントを結合
- ✅ 名前短縮(マングリング): 変数および関数名を短縮
- ✅ 制御フロー最適化: 制御構造を簡略化
- ✅ 関数インライン展開: 小さな関数をインライン展開
- ✅ 高度なツリーシェイキング: モジュール間最適化
パフォーマンス最適化
パフォーマンス維持のための主要な戦略:
- 最小限のAST走査: 一度の走査で複数の最適化を組み合わせる
- 効率的なデータ構造: アリーナ割り当てとコンパクトな表現を使用
- 早期終了: 効果がない場合に最適化をスキップ
リソース
ドキュメント
外部リファレンス
プレイグラウンド
- esbuild: https://esbuild.github.io/try
- rollup: https://rollupjs.org/rep
- swc: https://play.swc.rs
- terser: https://try.terser.org
- closure compiler: https://jscompressor.treblereel.dev
- 公式ウェブサイトは利用不可:Closure Compiler Webservice Turndown - 2025
