お久しぶりに私の開発ブログに面白い実験結果を持ってきました。Djangoが好きな私がふとウェブフロントエンド最適化の一部であるCSS Minificationについて疑問を感じ、自ら実験してみました。その結果は非常に興味深いもので、皆さんと共有したいと思います。特に、私のようにPythonをメインに使用している開発者の方々にとって意味のある内容になると思います。

この実験を始めたきっかけ: 突然の疑問❓

普段ウェブサービスを開発する際には、「フロントエンド最適化はやはりJavaScript(Node.js)ベースのツールが最高だ!」と思い込んでいました。Node.jsエコシステムがフロントエンドのビルド及び最適化ツールを制圧しているため、当然の先入観かもしれません。CSS Minification(CSS圧縮)も同様で、webpackgulpなどのビルドツールに含まれているcss-minimizer-webpack-pluginclean-cssなどのNode.jsベースのライブラリがスタンダードのように感じられました。

さらに、ChatGPTやGeminiなどのAIにCSS minifierのおすすめを尋ねると、ほぼ1位でnpmのclean-css-cliを推薦されます。「このツールが最も速くて強力だ」といった補足説明も付いてきます。

しかし、突然こんな疑問が浮かびました。

「果たして単純なテキスト圧縮に近いCSS MinificationまでNode.jsベースのツールがPythonベースのツールより圧倒的に早いまたは効率的だと言えるのか?私がわざわざフロントエンド最適化のためにNode.js環境を設定しなければならないのか?」

この疑問に対する答えを自ら見つけるため、小さな実験を始めました。

実験内容と過程

実験は簡単です。現在運営中の私のブログのメインCSSファイルの一つであるstyle.css(約67KB)を対象に、Node.jsベースのclean-css-cliとPythonベースのcsscompressorという二つのツールを使用して圧縮し、その結果のサイズと内容を比較することでした。

1. 原本ファイルの確認

jesse@laptop:~/my/path/to/css$ ll style.css
-rw-rw-r-- 1 jesse jesse 67325  5月 23 19:10 style.css

原本style.cssファイルのサイズは67,325バイトでした。(可読性のためスペース、改行、コメントなどが含まれています。)

2. Node.js clean-css-cliを使った圧縮

npmを通じてclean-css-cliをグローバルにインストールし、style.cssstyle.min.cssに圧縮しました。

jesse@laptop:~/my/path/to/css$ npm install -g clean-css-cli
jesse@laptop:~/my/path/to/css$ cleancss -o ./style.min.css ./style.css

3. Python csscompressorを使った圧縮

Python環境でcsscompressorモジュールを使いstyle.csspython_style.min.cssに圧縮しました。

(venv)jesse@laptop:~/my/path/to/css$ python -m csscompressor style.css > python_style.min.css

4. 圧縮ファイルのサイズ比較

圧縮後に作成されたファイルのサイズをllコマンドで比較しました。

jesse@laptop:~/my/path/to/css$ ll style*
-rw-rw-r-- 1 jesse jesse 67325  5月 23 19:10 style.css         # 原本
-rw-rw-r-- 1 jesse jesse 46740  6月 23 22:39 style.min.css     # npm clean-cssの結果
-rw-rw-r-- 1 jesse jesse 46828  6月 23 23:47 python_style.min.css # Python csscompressorの結果

5. 圧縮ファイルを開いて目視で内容比較

CSS圧縮比較結果のスクリーンショット

二つの圧縮ファイルをnvimで開いて目視で内容を比較しました。(上の投稿のスクリーンショットを参考)

実験結果の分析

  • 原本 style.css (67,325 bytes)
  • clean-css-cli (style.min.css) (46,740 bytes): 約30.58%のサイズ減少!
  • csscompressor (python_style.min.css) (46,828 bytes): 約30.45%のサイズ減少!

結果を見て私も驚きました。

  1. 圧倒的なサイズ減少効果: 二つのツールはどちらも原本CSSファイルのサイズを約30%以上削減しました。これはスペース、改行、コメントなど可読性のために追加した全ての不要な文字が実際にバイトを占めており、これを削除することで相当なファイルサイズの削減効果が得られることを明確に示しています。ウェブサービスの読み込み速度向上に直接的に寄与する部分です。アプリをデプロイする際に面倒だと思わず、必ずminifyしてください。思った以上に効果があります。
  2. ほぼ変わらない圧縮効率: clean-css-clicsscompressorよりたった88バイト小さいだけで、圧縮効率の面では実質的に同じレベルのパフォーマンスを示しました。
  3. 同じ結果物の内容: nvimで比較してみると、二つの圧縮ファイルの内容はほぼ完全に一致していました。この88バイトの差が理解できないくらいです。これは各ツールが内部で使用するアルゴリズムや最適化方法に微細な違いがあったようですが、無視できる程度のものであり、最終的には不要な要素を取り除く目的は同じく達成されたことを意味します。

この実験の意義と示唆: 先入観を打破せよ!

私の実験結果が伝える最も大きなメッセージは、まさに「フロントエンド最適化は、必ずしもJavaScript(Node.js)ベースのツールでなければならないという先入観を捨てて良い」ということです。

多くのPythonバックエンド開発者が私のようにフロントエンド最適化作業が出ると、「ああ、Node.js環境をインストールするべきか?npmで何をインストールすればいいんだ?」といった負担を感じていたことでしょう。しかし、この実験はCSS Minificationのようなテキスト処理に基づいた最適化作業では言語や実行環境によるパフォーマンス差は微弱である可能性があることを示しています。

これが示唆することは明白です。

  • 技術スタック選択の自由: Pythonバックエンドをメインに使用している開発者であれば、わざわざ別個のNode.js環境を構築しなくてもcsscompressorのようなPythonベースの優れたライブラリを使ってフロントエンドCSSを十分に効果的に最適化できます。

  • 簡素化された開発ワークフロー: 複雑なwebpack設定やnpmスクリプトに囚われることなく、Pythonスクリプトや簡単なシェルコマンドを通じてビルド及びデプロイパイプラインにCSS最適化ステップを容易に統合できます。これは特に小規模プロジェクトや効率性を重視するチームにとって大きな利点となるでしょう。

  • 本質に集中: 重要なのは「どのツールを使ったか」ではなく、「どれだけ効果的に最適化したか」です。今回の実験を通じてCSSファイルサイズを約30%削減することに成功したので、ユーザー体験の向上とウェブサービスのパフォーマンス改善という本質的な目標は十分に達成されたと言えます。

もちろん、JavaScriptエコシステムのフロントエンドツールが提供する機能(バンドリング、トランスパイリング、ツリーシェイキングなど)ははるかに豊富で強力です。しかし、CSS Minificationのような特定の最適化作業においては、慣れ親しんだ開発環境を活用する方がより効率的であることを今回の実験が示しました。

私は今後、私のPythonベースのウェブサービスでCSS Minificationを行う際に、不必要なNode.js依存性を追加せずにPythonツールを積極的に活用するつもりです。

皆さんはいかがですか?もしかして皆さんも似たような先入観を持っていたか、この実験結果についてどのような考えを持っているかをコメントで共有してみてください!