以前 apache wicket で 構築中の java アプリケーションのcss、javascript の圧縮を行うため、Minify Maven Plugin - Introduction使ってみました。

ビルド時に html の minify は実施していなかったので、plugin を探したところ、alextunyk/htmlcompressor-maven-plugin: Maven HTMLCompressor Plugin allows to compress HTML/XML files by adding a few lines to the pom file.見つかりました。

こちらを使用して、html の圧縮ができるか試してみます。


実施のモチベーション

  • 作成中のアプリケーション由来
    Apache Wicket には、Htmlcompressor · wicketstuff/core Wikiいうliblary があり、アプリケーション内で、画面描画の前にhtmlの圧縮を実施することができます。
    しかし、リクエストのたびに圧縮を実施するため、CPU負荷はかかります。
    このため、事前圧縮して描画直前での圧縮は実施しないようにしたいと思いました。

参考


pom.xml へ定義の追加

build の plugin 定義に以下を追加します。
maven repository 上 1.3 が最新です。

Maven HTMLCompressor Plugin - javalibs pom 定義を参考に以下のように記載しました。

  • pom.xmlの抜粋
        <plugin>
            <groupId>com.tunyk.mvn.plugins.htmlcompressor</groupId>
            <artifactId>htmlcompressor-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <id>compress-html</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>html</goal>
                    </goals>
                    <configuration>
                        <srcFolder>${basedir}/src/main/java</srcFolder>
                        <fileExt>
                            <ext>html</ext>
                        </fileExt>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    

html の配置先について

defalut では、${basedir}/src/main/resourceshtmlの配置先になります。
Apache Wicket は、基本的に java パッケージ内に html を配置するため、圧縮対象のリソース配置先ディレクトリを変更し、<srcfolder >${basedir}/src/main/java</srcfolder>しています。

pom 追加後の mvn clean package の実行結果

以下、コンソール出力が追加されました。
template のファイルサイズが全体で半分になったということになります。

INFO] --- htmlcompressor-maven-plugin:1.3:html (compress-html) @ festivals4partypeople-web ---
[INFO] Compressing /Users/xxxxxxxxxx/Bitbucket/festivals4partypeople_java/festivals4partypeople-web/src/main/java
[INFO] HTML compression statistics:
+-----------------------------+-----------------------------+-----------------------------+
| Category                    | Original                    | Compressed                  | 
+-----------------------------+-----------------------------+-----------------------------+
| Filesize                    | 3.8 kB                      | 1.4 kB                      | 
| Empty Chars                 | 2022                        | 112                         | 
| Script Size                 | 0 B                         | 0 B                         | 
| Style Size                  | 0 B                         | 0 B                         | 
| Event Handler Size          | 0 B                         | 0 B                         | 
+-----------------------------+-----------------------------+-----------------------------+
| Time: 00:00:00, Preserved: 0 B, Compression Ratio: 0.37, Savings: 62.84%                | 
+-----------------------------+-----------------------------+-----------------------------+

[INFO] HTML compression completed.


設定値

pom.xml に指定できる設定値は以下の通りです。今回の用途は html 圧縮なので、htmlcompressor-maven-plugin/HtmlCompressorMojo.java at master · alextunyk/htmlcompressor-maven-plugin確認しています。
xml の場合は、htmlcompressor-maven-plugin/XmlCompressorMojo.java at master · alextunyk/htmlcompressor-maven-plugin確認してください。
基本的にYahoo YUI Compressor に指定できる値が指定できる実装になっていると見受けられました。

プログラムを見はじめてから気がつきましたが、github の wiki にドキュメントがありました。
[Configuration · alextunyk/htmlcompressor-maven-plugin Wiki]
構わず続けます。

設定値説明Default値
htmlCompressionStatisticsコンプレッサーが圧縮した結果 txt ファイルの出力パス${project.build.directory}/htmlcompressor/html-compression-statistics.txt
fileExt処理対象とするファイルの拡張子 配列htm,html
enabled圧縮可否を切り替えるtrue
removeCommentsコメントを削除可否を切り替えるtrue
removeMultiSpaces連続する改行を削除するか否かtrue
removeIntertagSpacesタグ内のスペースを除去するか否か?false
removeQuotes不要なタグ属性引用符を削除するか否かfalse
simpleDoctypeDocument type をシンプルにするか否かfalse
removeScriptAttributesscript タグのオプション属性を削除するか否かfalse
removeStyleAttributesstyle タグのオプション属性を削除するか否かfalse
removeFormAttributesform タグのオプション属性を削除するか否かfalse
removeInputAttributesinput タグのオプション属性を削除するか否かfalse
simpleBooleanAttributesboolean 値で表すことのできる属性を削除するか否かfalse
removeJavaScriptProtocoleventhandler から、"javascript:"プロトコル記述を削除するか否かfalse
removeHttpProtocolタグ属性の中に記述されている"http://""//" に置換するか否かfalse
removeHttpsProtocolタグ属性の中に記述されている"https://""//" に置換するか否かfalse
compressCssインラインcssを圧縮するか否かfalse
preserveLineBreaksオリジナルHTMLファイルの改行を保持するか否かfalse
yuiCssLineBreakYahoo YUI Compressor の --line-break に指定する値-1 (改行しない)
compressJavaScriptインラインjavascriptを圧縮するか否かfalse
jsCompressorjavascriptコンプレッサーとして"yui""closure"のどちらを使用するか"yui"
yuiJsNoMunge"yui"--nomunge を指定するか否か"false" (指定しない) デフォルトはインラインjavascriptはoffなので発動しない
yuiJsPreserveAllSemiColons"yui"--preserve-semi を指定するか否か"false" (指定しない)
yuiJsLineBreak"yui"に指定する--line-break の値-1 改行しない
closureOptLevel"closure"に指定するclosureOptLevel の値"simple"
yuiJsDisableOptimizations"yui"--disable-optimizationsを指定するか否かfalse
predefinedPreservePatterns圧縮対象外にする?タグのパターンPHP_TAG_PATTERNSERVER_SCRIPT_TAG_PATTERNnull
preservePatterns圧縮対象外にする文字列を正規表現で指定null
preservePatternFiles圧縮対象外にする文字列をファイルで指定(配列)null
generateStatistics圧縮結果の統計情報を出力するか否かtrue
srcFolder圧縮対象のファイル格納先を指定する${basedir}/src/main/resources
targetFolder圧縮後のファイル格納先を指定する${project.build.directory}/classes
javascriptHtmlSprite圧縮されたすべてのhtmlファイルをjsonオブジェクトとして含むjavascriptファイルを作成するか否かtrue
javascriptHtmlSpriteIntegrationFile圧縮されたすべてのhtmlファイルをjsonオブジェクトとして含むjavascriptファイルのファイル名"${basedir}/src/main/resources/html/integration.js"
javascriptHtmlSpriteTargetFile圧縮されたhtmlファイルをjsonオブジェクトとして使用する、JavaScriptスプライトファイル名"${project.build.directory}/htmlcompressor/html/integration.js"
encoding作成、読み込むファイルのエンコーディング指定"utf-8"
closureCustomExternsOnly既定の組み込みクロージャーエクスターナルを無効にするfalse
closureExternsクロージャーエクスターナルの指定null

想像以上に多くつらかったですが、以上になります。


設定を踏まえてpom.xmlを修正

設定値を調べたことを踏まえて以下の通り、修正しました。
インラインcss、インラインjsの圧縮をONにし、その他はdefalut値としました。

  • pom.xmlの抜粋
        <plugin>
            <groupId>com.tunyk.mvn.plugins.htmlcompressor</groupId>
            <artifactId>htmlcompressor-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <id>compress-html</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>html</goal>
                    </goals>
                    <configuration>
                        <srcFolder>${basedir}/src/main/java</srcFolder>
                        <fileExt>
                            <ext>html</ext>
                        </fileExt>
                        <compressCss>true</compressCss>
                        <compressJavaScript>true</compressJavaScript>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    

minify-maven-plugin だけでも実施できそう

minify-maven-plugin でも実施できそうな雰囲気を感じる StackOverFlow の記事がありました。
こちら試してはおりません。
しかしたら、minify-maven-plugin のみで、html も含む 静的コンテンツ圧縮はまかなえるのかもしれません。

javascript - minify-maven-plugin minifying html and xml files also - Stack Overflow


まとめ

Minify Maven Plugin - Introduction使ってみて、無事動作しました。
以下まとめます。

  • 古いpluginだが、依存ライブラリも古く、十分枯れていると考えられる。
    メンテナンスはそれほど行われていないかもしれませんが、歴史のあるライブラリに処理を委譲しているだけなので、それなりに安定していると思います。

  • これから、新規作成するシステムには不要かもしれない。
    個人的な見解、そして、疑問点でもありますが、新たに構築するシステム、サービスでは、使う機会がないのかもしれません。
    Javaのサーバー側主体(主導)で、htmlテンプレートを抱える仕組みが続くのかというと、直近の状況ではNOかなと思います。

  • *今まで、作ってきたものの寿命引き伸ばしには使える *

レガシー?なシステムで、javaプロジェクト、且つ、maven で ちょっと 古いフロントを使っている場合に、少し圧縮したいなというときには使えるのかなと思います。
モダーンなフロントエンド導入の途中に、既存サービスの寿命延長の施作として。

  • 古いとかいっていて、yui compressorの完成度がすごい
    設定値の具合とか見ていると、熟考の末、作られたものだと思います。
    設定が細かい、且つ、納得する。デフォルトはfalse設定は長いこと使った挙句のHTMLの仕様の変化の影響は受けなくはなさそうなので、falseしておくのが吉かと思います。
    以上です。

コメント