以前 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_PATTERN 、SERVER_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
にしておくのが吉かと思います。
以上です。
コメント