Dropwizard アプリケーションで、
JavaScript、minify-maven-plugin
を
実施した
参考
Minify Maven Plugin - Introduction
Minify Maven Plugin のDocument ページ
yui-compressor-plugin との 機能の 違いに ついて
似たような
yui-compressor-plugin
に
yui-compressor-plugin
はgzip 作成まで 実施できる
minify-maven-plugin
にはgzip を 作成する 機能は ありません。 gzip feature request · Issue #90 · samaxes/minify-maven-plugin と いう Issue が 作成されていますが、 実装は されない 雰囲気が 漂います。
事前にgzip 化 して おくと、 HTTP サーバー側での gzip 化が 不要に なるため、 サーバーの CPU負荷を 軽減できます。
HTTPサーバーとして、 Apache を 使用している 場合の HTTPサーバー側での 圧縮設定と、 事前圧縮での 設定方法の 比較は 以下の 記事が わかりやすかったです。
gzip 圧縮による サイトパフォーマンスを 向上させる 方法 | murashun.jp ファイル結合時の
順番指定、 ファイル単位での 除外指定等 は、 minify-maven-plugin
のほうが 設定しやすい
minify-maven-plugin
はjson ファイルで ファイルの 圧縮定義を 記載できるので、 細かい 調整は yui-compressor-plugin
よりもやりやすいです。minify-maven-plugin
はJavaScript の Complessor と して Closure Compiler が 使える
個人的には、それほどこだわりは ありませんが、 yui-compressor-plugin
はyui-compressor
一択です。
上記のyui-compressor-plugin
を
gzip 圧縮はminify-maven-plugin
を
実現したいこと
実現したいことは
ディレクトリごとに、
圧縮、 結合の ON/OFF を 切り替えたい。
src/main/resource/static ディレクトリ配下 圧縮、結合ともに 行う、 src/main/resource/xyz ディレクトリ配下は、 圧縮のみ 行うようにしたいです。 開発時は、
圧縮、 結合ともに OFF に したい。 開発時は、 デバッグの 兼ね合いで、 圧縮、 結合ともに OFF に したいです。 圧縮、
結合対象の、 js、 css の 順序を 指定したい。
jquery と、jquery の plugin が 圧縮、 結合対象に なっている ため、
定義順序によっては、 js エラーに なってしまいます。
jquery > 1番目、
jquery のplugin > 2番目
で圧縮したいです。
実施した こと
以下の
<profiles> <profile> <id>PRODUCTION</id> <activation> <activeByDefault>false</activeByDefault> </activation> <build> <!-- resources 定義 --> <resources> <resource> <filtering>false</filtering> <directory>src/main/resources</directory> <excludes> <exclude>**/*.css</exclude> <exclude>**/*.js</exclude> </excludes> </resource> <resource> <filtering>false</filtering> <directory>src/main/java</directory> <includes> <include>**</include> </includes> <excludes> <exclude>**/*.java</exclude> <exclude>**/*.css</exclude> <exclude>**/*.js</exclude> </excludes> </resource> </resources> <plugins> <!-- minify js and css --> <plugin> <groupId>com.samaxes.maven</groupId> <artifactId>minify-maven-plugin</artifactId> <version>1.7.6</version> <executions> <execution> <id>minify-group-static</id> <phase>prepare-package</phase> <goals> <goal>minify</goal> </goals> <configuration> <webappSourceDir>${basedir}/src/main/resources</webappSourceDir> <webappTargetDir>${project.build.directory}/classes</webappTargetDir> <cssSourceDir>static</cssSourceDir> <jsSourceDir>static</jsSourceDir> <skipMerge>false</skipMerge> <nosuffix>true</nosuffix> <bundleConfiguration>${basedir}/src/main/resources/static-bundles.json </bundleConfiguration> </configuration> </execution> <execution> <id>minify-group-xyz</id> <phase>prepare-package</phase> <goals> <goal>minify</goal> </goals> <configuration> <webappSourceDir>${basedir}/src/main/resources</webappSourceDir> <webappTargetDir>${project.build.directory}/classes</webappTargetDir> <cssSourceDir>xyz</cssSourceDir> <jsSourceDir>xyz</jsSourceDir> <skipMerge>true</skipMerge> <nosuffix>true</nosuffix> <cssSourceIncludes> <cssSourceInclude>**/*.css</cssSourceInclude> </cssSourceIncludes> <cssSourceExcludes> <cssSourceExclude>**/*.min.css</cssSourceExclude> </cssSourceExcludes> <jsSourceIncludes> <jsSourceInclude>**/*.js</jsSourceInclude> </jsSourceIncludes> <jsSourceExcludes> <jsSourceExclude>**/*.min.js</jsSourceExclude> </jsSourceExcludes> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
pom.xml の
profile で
PRODUCTION を 指定
これで、mvn -PPRODUCTION
を指定した 際に、
Javascript、css の 圧縮、 結合が 実行されるようになります。 resources 定義に
ついて
javascript、css の ソースディレクトリに 対して、 <excludes >
設定しています。
これは、minify タスクで、 圧縮、 結合した ファイルが 配置される ためです。 phase は、
prepare-package を 指定
Fat jar の作成に 使用する maven-shade-plugin
のphase は package を 指定しています。
このタスクよりも 前に 実行したかったので、 prepare-package を 指定しました。 plugin の
execution 定義に ついて
ディレクトリごとに、圧縮、 結合の ON/OFF を 切り替えたかったので、
minify-group-static
、minify-group-xyz
の2つ excution 定義を 作成しました。 bundleConfiguration で、
対象ファイルの 結合順番を 指定
minify-group-static
で、bundleConfiguration
を指定していますが、
このjson ファイルで、 ファイルの 結合順番を 指定でき、 files
で指定した 順番で 結合されるようになります。
ちなみに、ファイルパスは、 cssSourceDir
、jsSourceDir
で指定した ディレクトリからの、
相対パスで記載すればよいようです。
出力対象のファイルは、 webappTargetDir
配下にcssSourceDir
で指定した ディレクトリが できるのですが、
その 直下に 出力されます。
{ "bundles": [ { "type": "css", "name": "static-combined.css", "files": [ "bootstrap/css/bootstrap.css", "fonts/font-awesome/css/font-awesome.css", "css/animations.css", "css/style.css", "css/custom.css", "css/bootstrap-custom.css" ] }, { "type": "js", "name": "static-combined.js", "files": [ "plugins/jquery.min.js", "plugins/jquery.tile.min.js", "bootstrap/js/bootstrap.min.js", "js/libs/knockout-3.3.0.js", "plugins/modernizr.js", "plugins/isotope/isotope.pkgd.min.js", "plugins/jquery.backstretch.min.js", "plugins/jquery.appear.js", "js/libs/d3.js", "js/libs/d3.layout.cloud.js", "js/apps/utils.js", "js/custom.js" ] } ] }
使用上の 注意点
実際に
Closure Compiler が 解釈できない JavaScript が 圧縮対象と なると、 エラーが 発生する
ECMA2016 構文の
同名ファイルで 上書き後、 再度圧縮すると、 構文エラーが 発生する 場合が ある
圧縮前ファイル と
自分自身で
Yui Compressor の バグ で 圧縮後の CSS が 壊れる 場合が ある
CSS の
既知の
“em” is missing in compressed file · Issue #108 · yui/yuicompressor
1.0em
と記載すると、 圧縮後に 1.0
になります。 1em
と書けば 問題ありません。 IE backslash9 (\9) hack is not handled properly · Issue #104 · yui/yuicompressor
IE hack のcss 記述が 欠落します。 これは、 開発 Version では マージされており、 Github から clone して build すると 解消される 問題かもしれません。
pom 依存関係で、download される Version 2.4.8 ではこの バグは 発生します。
回避方法は、IE 9 は 切り捨てる! かと 思います。
TODO
profile を
maven 側での
以上です。
コメント