CSSとJavaScriptミニマイザーの有効性の比較(2013年9月)

バンドルトランスフォーマーの最小化モジュールのロゴ

過去に、 以前のレビューの公開以来、3か月は、ほとんどすべての考慮された最小化アルゴリズム(Packerを除く)を更新することができました。 さらに、新しいClean-css最小化モジュールがBundle Transformer - BundleTransformer.CleanCssに登場しました

この比較レビューの準備では、読者の次の要望が考慮されました。
  1. 前回のレビューでは、次のファイルがソースファイルとして使用されました。TwitterBootstrap 2.3.2の bootstrap.cssおよびbootstrap.jsで、結果の信頼性が低いためです。 新しいレビューでは、サンプルサイズが増加しました。比較のために、10の人気のあるオープンソースプロジェクトから7つのJSファイルと5つのCSSファイルが選択されました。
  2. 現在、CSS ミニマイザーの比較には、 LESSおよびSassプリプロセッサー用の組み込み最小化ツールも含まれます。
  3. ご存知のように、Bundle Transformerは各ファイルを個別に最小化し、最小化されたコードを1つのファイルに結合します。 このメカニズムは、以前に最小化されたファイルの再最小化を防ぐように設計されています。 他の同様のライブラリは、最初にファイルコードをマージしてから、このマージされたファイルを最小化します。 したがって、完全を期すために、2つの比較を行います。最初に、最小化されたコードを組み合わせて取得したファイルと、ファイルの組み合わせコードを最小化して取得したファイルで、ミニマイザーの有効性を比較します。

前のレビューと同様に、Bundle Transformerモジュールを使用してファイルを最小化し、 YSlow拡張機能を使用して受信ファイルのサイズを測定します。

CSSミニマイザーの比較


次のCSS最小化アルゴリズムを比較します。

表1.アダプターおよびCSS最小化アルゴリズムに関する情報
アダプター最小化アルゴリズムソースライブラリサイト
YuiCssMinifierYUI CSS Compressor for .Net 2.3.0.0http://yuicompressor.codeplex.com
MicrosoftAjaxCssMinifierMicrosoft Ajax CSS Minifier 4.97http://ajaxmin.codeplex.com
KryzhanovskyCssMinifierCSSO 1.3.8http://github.com/css/csso
WgCssMinifierWebGrease Semantic CSS Minifier 1.5.2http://webgrease.codeplex.com
CleanCssMinifierClean-css 1.1.1http://github.com/GoalSmashers/clean-css
LessTranslatorLESS 1.4.2(圧縮モードはソースライブラリの設定に対応し、 compressオプションはtrue等しくなりtruehttp://lesscss.org
SassAndScssTranslatorSass 3.2.10(圧縮モードは、ソースライブラリの設定に対応します:styleオプションはcompressed等しい)http://sass-lang.com

LessTranslatorおよびSassAndScssTranslatorアダプターを最小化機能として使用するには、ソースCSSファイルの拡張子を.less (および.scss )に変更し、 useNativeMinification構成プロパティをtrue設定する必要がありtrue

ソースファイルとして使用します。
  1. Twitter Bootstrap 3.0.0のbootstrap.css
  2. jQuery UI 1.10.3のjquery-ui-1.10.3.custom.css
  3. 2013年8月15日にAnimate.cssからのanimate.css
  4. hint.css 1.3.0のhint.css
  5. zocial.css年2月12日付のZocial CSSソーシャルボタンからのzocial.css

合計ファイルサイズは296.2 KBで、GZip圧縮を適用した後-98.7 KBです。

表2. CSS最小化アルゴリズムを各ファイルに個別に適用した結果
アダプター最小化後のサイズ、KB保存中GZip圧縮による最小化後のサイズ、KBGZip圧縮の節約
KBでKBで
YuiCssMinifier239.756.519.0779.918.819.05
MicrosoftAjaxCssMinifier238.757.519.4179.519.219.45
KryzhanovskyCssMinifier234.162.120.9778.020.720.97
WgCssMinifier------
CleanCssMinifier240.655.618.7780.218.518.74
LessTranslator240.056.218.9780.018.718.95
SassAndScssTranslator241.255.018.5780,418.318.54

表3.マージされたファイルにCSS最小化アルゴリズムを適用した結果
アダプター最小化後のサイズ、KB保存中GZip圧縮による最小化後のサイズ、KBGZip圧縮の節約
KBでKBで
YuiCssMinifier239.756.519.0779.918.819.05
MicrosoftAjaxCssMinifier238.757.519.4179.519.219.45
KryzhanovskyCssMinifier232,463.821.5477.421.321.58
WgCssMinifier------
CleanCssMinifier240.655.618.7780.218.518.74
LessTranslator240.056.218.9780.018.718.95
SassAndScssTranslator241.255.018.5780,418.318.54

CSS最小化アルゴリズムのパフォーマンスチャート

1. CSS最小化アルゴリズムの使用による節約(パーセント)

グラフは、前回同様、 Yandexの CSSOミニマイザー(CSSオプティマイザー)によって最良の結果が表示されたことを明確に示しています。 しかし、軟膏にハエがないわけではありません。フォームの2つのコメントを削除することで、結合ファイルを圧縮するときに0.57%の追加のゲインが得られました/*! - */ /*! - */ 。 原則として、このようなコメントには、ライブラリのバージョンとその開発者に関する情報が含まれています。 CSSOは、最初のコメントのみを残し、残りを削除します(UPD2を参照)。

Microsoft Ajax CSS Minifierは、主要なライバルであるYUI CSS Compressor for .Netと比較して、再び良い結果を示しました。

とりわけ、新参者は私を驚かせました-Goal Smashersの Clean-css 。 Node.jsコミュニティで非常に人気のあるCSS ミニマイザー (Clean-cssはgrunt-contrib-cssminパッケージで使用されます )から、より高度な圧縮が期待されていました。 最小化効率の点では、LESSプリプロセッサとSassプリプロセッサのビルトインミニマライザの間にあります。

Microsoft -WebGrease Semantic CSS Minifierの構造最小化ツールの新しいバージョンには、依然として重大なエラーが含まれています。
  1. @charsetディレクティブと@-o-keyframesルールを処理できません。
  2. 1未満の小数値をリセットします。

したがって、WebGrease Semantic CSS Minifierは再び戦いの場を失います。

結合されたコードでファイルを最小化して得られたファイル(例外はCSSOを使用して処理されたファイル)が、個別に最小化されたファイルから収集されたファイルよりもサイズがわずかに小さいことはグラフから実際には見えません。 このようなファイルのサイズが小さいのは、次の2つの理由によるものです。
  1. 個々のファイルのコードを区切る余分な改行は削除されました。
  2. いくつかの@charsetディレクティブが1つにマージされました。

したがって、結論としては、結合されたコードでファイルを最小化しても、実際にはファイルサイズは増加しません。

JS Code Minimizerの比較


次のJSコード最小化アルゴリズムを比較します。

表4.アダプターおよびJSコード最小化アルゴリズムに関する情報
アダプター最小化アルゴリズムソースライブラリサイト
CrockfordJsMinifier2013年3月29日のJSMinhttp://github.com/douglascrockford/JSMin
YuiJsMinifierYUI JS Compressor for .Net 2.3.0.0http://yuicompressor.codeplex.com
ClosureLocalJsMinifier2013年8月26日からのClosure Compilerアプリケーション( Simpleモード)http://developers.google.com/closure/compiler/docs/gettingstarted_app
MicrosoftAjaxJsMinifierMicrosoft Ajax JS Minifier 4.97http://ajaxmin.codeplex.com
UglifyJsMinifierUglifyJS 2.4.0http://github.com/mishoo/UglifyJS2

既にEdwardsJsMinifierは、 EdwardsJsMinifierアダプターは上記のリストにありません。 彼がサポートする最小化アルゴリズムであるPacker 3.0は2007年以降変更されていないため、このレビューには含めないことにしました。

ソースファイルとして使用します。
  1. Twitter Bootstrap 3.0.0のbootstrap.js
  2. jQuery UI 1.10.3のjquery-ui-1.10.3.custom.js
  3. MicrosoftAjax.debug.js AJAX Framework 4.0.0.0のMicrosoftAjax.debug.js
  4. Knockout 2.3.0のknockout-2.3.0.debug.js
  5. jsrender.js 1.0.0-betaのjsrender.js
  6. LINQ for JavaScript 2.2.0.2のlinq.js
  7. moment.js 2.1.0のmoment.js

合計ファイルサイズは1218.9 KBで、GZip圧縮を適用した後-406.3 KBです。

表5. JS最小化アルゴリズムを各ファイルに個別に適用した結果
アダプター最小化後のサイズ、KB保存中GZip圧縮による最小化後のサイズ、KBGZip圧縮の節約
KBでKBで
CrockfordJsMinifier713.5505.441.46237.8168.541.47
YuiJsMinifier593.0625.951.35197.6208.751.37
ClosureLocalJsMinifier525.4693.556.90175.1231.256.90
MicrosoftAjaxJsMinifier527.7691.256.71175.9230,456.71
UglifyJsMinifier531.1687.856.43177.0229.356.44

表6. JS最小化アルゴリズムを結合ファイルに適用した結果
アダプター最小化後のサイズ、KB保存中GZip圧縮による最小化後のサイズ、KBGZip圧縮の節約
KBでKBで
CrockfordJsMinifier713.4505.541.47237.8168.541.47
YuiJsMinifier593.0625.951.35197.6208.751.37
ClosureLocalJsMinifier525.3693.656.90175.1231.256.90
MicrosoftAjaxJsMinifier527.7691.256.71175.9230,456.71
UglifyJsMinifier533.1685.856.26177.7228.656.26

JS最小化アルゴリズムのパフォーマンスチャート

2. JS最小化アルゴリズムの使用による節約(パーセント)

上記のデータから、 Googleの Closure Compilerミニマイザーが最初の段階にあることは明らかです。

今回は、Microsoft Ajax JS MinifierがUglifyJSを追い越し、当然2位になりました。

一般に、UglifyJSは、結合されたコードでファイルを最小化する一方で、結果のファイルのサイズが減少するだけでなく、増加するという事実に非常に驚きました。 アルゴリズムのいくつかの欠陥について語っています。

YUI JS Compressor for .Netは、最初の3つの最小化ツールよりもはるかに遅れており、アルゴリズムの陳腐化を示しています。

JSMinがまだ開発中であるという事実にもかかわらず、その中で定められている原則は同じままです。スクリプトロジックへの干渉はなく、コメントと空白の削除のみです。 したがって、このレビューでは、JSMinは参加者ではなく、下限として機能します。

CSSミニマイザーの場合のように、結合されたコードでファイルを最小化してもほとんど利益が得られませんでした。

おわりに


前回同様、ミニマライザーの戦いは検索大手のYandexとGoogleが勝ちました。 最高のCSSミニマイザーがロシアの会社で作成されたことを知ってうれしいです。

WebGrease Semantic CSS Minifierには重大な問題がありますが、MicrosoftはMicrosoft Ajax Minifierミニマイザーファミリの開発に大きな進歩を遂げました。

すべてのソースファイルと最小化ファイルはhttps://www.dropbox.com/s/k232cloh87sn9pr/css-and-js-minifiers-sep-2013-files.zipで入手できます

UPD1:グラフを再編集して関心を示します。

UPD2: 「軟膏で飛ぶ」に関して、CSSOはセルゲイクリザノフスキー (CSSO開発者) からコメントを受け取りました。 実際、これは欠陥ではなく、単に構造の最小化の機能です。スタイルシートの構造を変更すると、そのようなコメントは参照先のコードから分離され、スタイルシートに単に「ハング」します。 したがって、最初のコメントのみが保存されます。 ここでの状況は、クロージャーコンパイラの場合と同様であり、構造的にJSコードを最小化すると、すべてのコメントが削除されます。

UPD3: CSS-minimizer Closure Stylesheetsを使用してテストを試みました。 最初に、利用可能な最新バージョンのバイナリ-closure-stylesheets-20111230.jarをテストし、 bootstrap.cssファイルを最小化するときにエラーが発生しました。 次に、ソースから最新バージョンを収集し( 86bb800d79a3をコミット)、 bootstrap.cssファイルを最小化する際にエラーを再度受け取りました。

 Compiler parsing error: Parse error in C:\!closure-stylesheets\bootstrap.css at line 1658 column 19: margin-top: 1px \9; ^ com.google.common.css.compiler.ast.GssParserException: Parse error in C:\!closure-stylesheets\bootstrap.css at line 1658 column 19: margin-top: 1px \9; ^ at com.google.common.css.compiler.ast.GssParserCC.parse(GssParserCC.java:176) at com.google.common.css.compiler.ast.GssParser.parse(GssParser.java:46) at com.google.common.css.compiler.commandline.DefaultCommandLineCompiler.parseAndPrint(DefaultCommandLineCompiler.java:104) at com.google.common.css.compiler.commandline.DefaultCommandLineCompiler.compile(DefaultCommandLineCompiler.java:94) at com.google.common.css.compiler.commandline.DefaultCommandLineCompiler.execute(DefaultCommandLineCompiler.java:129) at com.google.common.css.compiler.commandline.ClosureCommandLineCompiler.executeJob(ClosureCommandLineCompiler.java:290) at com.google.common.css.compiler.commandline.ClosureCommandLineCompiler.main(ClosureCommandLineCompiler.java:356) Caused by: com.google.common.css.compiler.ast.ParseException: Encountered " <BAD_TOKEN> "\\ "" at line 1658, column 19. Was expecting one of: ";" ... "/" ... "=" ... "}" ... "," ... <S> ... <IMPORTANT_SYM> ... <ATKEYWORD> ... at com.google.common.css.compiler.ast.GssParserCC.generateParseException(GssParserCC.java:3756) at com.google.common.css.compiler.ast.GssParserCC.jj_consume_token(GssParserCC.java:3635) at com.google.common.css.compiler.ast.GssParserCC.ruleSet(GssParserCC.java:464) at com.google.common.css.compiler.ast.GssParserCC.block(GssParserCC.java:2856) at com.google.common.css.compiler.ast.GssParserCC.start(GssParserCC.java:2903) at com.google.common.css.compiler.ast.GssParserCC.parse(GssParserCC.java:174) ... 6 more 

さらに、 jquery-ui-1.10.3.custom.cssanimate.cssを最小化しようとしましたが、再びエラーが発生しました。

したがって、WebGrease Semantic CSS Minifierなどのクロージャースタイルシートは、このレビューの比較テストに参加できません。

UPD4:ソースおよび最小化されたファイルを含むアーカイブへのリンクを追加しました-https://www.dropbox.com/s/k232cloh87sn9pr/css-and-js-minifiers-sep-2013-files.zip

世論調査


記事の最後で、調査に参加することをお勧めします。 回答オプションのリストにミニマイザーが見つからなかった場合は、「その他」オプションを選択し、コメントで開発者サイトの名前と住所を示します。

Source: https://habr.com/ru/post/J193556/


All Articles