↘️

【Vite】esフォーマットのlibモードではスペースや改行をminifyできない

に公開

タイトルのとおりです。

結論

ViteのLibモードでESでビルドしたとき、スペースや改行が残る形でバンドルされます。このことは公式ドキュメントにも書いてあります。

https://ja.vite.dev/config/build-options#build-minify

pure アノテーションを取り除きツリーシェイクをできなくするため、ライブラリーモードで 'es' フォーマットを使用する場合、build.minify オプションは空白文字をミニファイしないので注意してください。

2025/05現在、 この動作は上書きできません。 ビルドが完全に終わった後に自前でminifyするプラグインを入れるか、viteをやめてrollupなどを直で使いましょう。

これをやってもダメ

  • デフォルトのesbuildではなくterserを使っても改善しません。
  • vite側のminifierを無効にし、rollup-plugin-terserをrollup側のプラグインに差し込むと、コードサイズは減少しますが、スペースや改行はそのまま残ります(そして、コードの規模によっては、このスペース類のサイズが馬鹿になりません)

この奇怪な挙動を見るに、おそらくですが、生成物をviteが再フォーマットしているのではないでしょうか。viteのソースは読んでいませんが……。

githubにissueは立っていますが、2年以上Openになっており、どうもVite側がサポートすることはなさそうな雰囲気です。同じ悩みを持った人がプラグインのサンプルを掲載しています(筆者未確認)
https://github.com/vitejs/vite/issues/6555

感想

ESでビルドするケースはまだまだモジュール目的の需要が多く、それ自体のバンドルサイズを削減するよりも、Tree Shakingを優先する仕様のほうが嬉しい場面が多いので、この動作は理にかなっているとは思います。
しかし、ES Modulesがブラウザでも当たり前に使えるようになってきた現在、ブラウザ向けにバンドルサイズを削減したいESというのも需要があると思います。というか、自分がそういうケースを踏んだので記事にしました。

Discussion