以前 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/resources がhtmlの配置先になります。
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
simpleDoctype Document type をシンプルにするか否か false
removeScriptAttributes script タグのオプション属性を削除するか否か false
removeStyleAttributes style タグのオプション属性を削除するか否か false
removeFormAttributes form タグのオプション属性を削除するか否か false
removeInputAttributes input タグのオプション属性を削除するか否か false
simpleBooleanAttributes boolean 値で表すことのできる属性を削除するか否か false
removeJavaScriptProtocol eventhandler から、"javascript:"プロトコル記述を削除するか否か false
removeHttpProtocol タグ属性の中に記述されている"http://""//" に置換するか否か false
removeHttpsProtocol タグ属性の中に記述されている"https://""//" に置換するか否か false
compressCss インラインcssを圧縮するか否か false
preserveLineBreaks オリジナルHTMLファイルの改行を保持するか否か false
yuiCssLineBreak Yahoo YUI Compressor の --line-break に指定する値 -1 (改行しない)
compressJavaScript インラインjavascriptを圧縮するか否か false
jsCompressor javascriptコンプレッサーとして"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_PATTERN null
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にしておくのが吉かと思います。
    以上です。

コメント