以前、django で html を圧縮する plugin を使ってみましたが、
Wicket でも 同様のことが実施できるか調べたところ、
Htmlcompressor · wicketstuff/core Wiki
いう ライブラリがありましたので、使ってみた結果を記載します。


前提

  • Wicket version 7.6.0です。
        <dependency>
            <groupId>org.apache.wicket</groupId>
            <artifactId>wicket-core</artifactId>
            <version>7.6.0</version>
        </dependency>
    

参考


WicketStuff の HTML Compresor を使う

WicketStuffのwiki に記載がある通りなのですが、
以下、設定、実装の追加で、HTML が圧縮されるようになります。

pom.xml に dependency を追加する

    <!-- https://mvnrepository.com/artifact/org.wicketstuff/wicketstuff-htmlcompressor -->
    <dependency>
        <groupId>org.wicketstuff</groupId>
        <artifactId>wicketstuff-htmlcompressor</artifactId>
        <version>7.6.0</version>
    </dependency>

Application クラス内で、HtmlCompressingMarkupFactory を設定する

    getMarkupSettings().setMarkupFactory(new HtmlCompressingMarkupFactory());

表示されるHTML

圧縮前、圧縮後のHTMLの記述は以下の通りです。
改行、空白が除去されています。

  • 圧縮前

<a class="btn btn-default btn-block" wicket:id="festivalLink" href="./festivals/340;jsessionid=node11ulekm8c1r1rv11yflsuplsery.node1">
    <span wicket:id="festivalName">BOUNCE UP -3rd Anniversary-</span>
</a>

  • 圧縮後

<a class="btn btn-default btn-block" wicket:id="festivalLink" href="./festivals/340;jsessionid=node11ulekm8c1r1rv11yflsuplsery.node1">
<span wicket:id="festivalName">BOUNCE UP -3rd Anniversary-</span></a>


Compresorの設定をカスタマイズして使用する

HtmlCompressingMarkupFactory 内では、com.googlecode.htmlcompressor.compressor.HtmlCompressor使って HTMLの圧縮を行っています。
コンストラクタ内の記述は、以下の通りです。

    public HtmlCompressingMarkupFactory(HtmlCompressor compressor) {
        if(compressor == null) {
            compressor = new HtmlCompressor();
            compressor.setRemoveIntertagSpaces(true);
            compressor.setRemoveSurroundingSpaces("html,head,body,br,p");
        }

        this.compressor = compressor;
    }

HtmlCompressingMarkupFactory のコンストラクタに独自設定した HtmlCompressor を渡せるので、
以下の通り、HtmlCompressorの設定を行いました。

pom.xml に、HtmlCompressor の dependency を 追加

アプリケーションのpom.xmlにcom.googlecode.htmlcompressor依存関係を追加します。1 [1] 2011年とか、少し昔に作られたライブラリですね。

    <!-- https://mvnrepository.com/artifact/com.googlecode.htmlcompressor/htmlcompressor -->
    <dependency>
        <groupId>com.googlecode.htmlcompressor</groupId>
        <artifactId>htmlcompressor</artifactId>
        <version>1.5.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.yahoo.platform.yui/yuicompressor -->
    <dependency>
        <groupId>com.yahoo.platform.yui</groupId>
        <artifactId>yuicompressor</artifactId>
        <version>2.4.8</version>
    </dependency>

アプリケーション内で、HtmlCompressorのインスタンスを生成する

WhiteTrashLord/htmlcompressor: HTML Compressor and Minifier, Backup of code.google.com/p/htmlcompressor
参考に以下の通りインスタンス生成、設定を行いました。

    getMarkupSettings().setMarkupFactory(new HtmlCompressingMarkupFactory(newHtmlCompressor));

  • newHtmlCompressor メソッド

    private HtmlCompressor newHtmlCompressor() {
        HtmlCompressor compressor = new HtmlCompressor();
        // 圧縮を実行する(true)、しない (false) デフォルト true
        compressor.setEnabled(true);
        // コメントを除去する(true)、しない(false) デフォルト true
        compressor.setRemoveComments(true);
        // 複数スペースを削除する(true)、しない(false) デフォルト true
        compressor.setRemoveMultiSpaces(true);
        // タグ間のスペースを削除する(true)、しない(false)
        compressor.setRemoveIntertagSpaces(true);
        // タグの不要な引用符を削除する 削除する(true)、しない(false) デフォルト false
        compressor.setRemoveQuotes(true);
        // DOCUMENTタイプをシンプルにする(true)、しない(false) デフォルト false
        // <!DOCTYPE html> に変換されます
        compressor.setSimpleDoctype(false);
        // ------------------------
        // script タグから、オプション属性を削除します 削除する true 削除しない false デフォルト false
        // protected static final Pattern jsTypeAttrPattern = Pattern.compile("(<script[^>]*)type\\s*=\\s*([\"\']*)(?:text|application)/javascript\\2([^>]*>)", 34);
        // protected static final Pattern jsLangAttrPattern = Pattern.compile("(<script[^>]*)language\\s*=\\s*([\"\']*)javascript\\2([^>]*>)", 34);
        // ---------
        compressor.setRemoveScriptAttributes(false);
        // style タグからオプション属性を削除します。 削除する true 削除しない false デフォルト false
        // protected static final Pattern styleTypeAttrPattern = Pattern.compile("(<style[^>]*)type\\s*=\\s*([\"\']*)text/style\\2([^>]*>)", 34);
        compressor.setRemoveStyleAttributes(false);
        // link タグからオプション属性を削除します。  削除する true 削除しない false デフォルト false
        // protected static final Pattern linkTypeAttrPattern = Pattern.compile("(<link[^>]*)type\\s*=\\s*([\"\']*)text/(?:css|plain)\\2([^>]*>)", 34);
        // protected static final Pattern linkRelAttrPattern = Pattern.compile("<link(?:[^>]*)rel\\s*=\\s*([\"\']*)(?:alternate\\s+)?stylesheet\\1(?:[^>]*)>", 34);
        compressor.setRemoveLinkAttributes(false);
        // Form タグからオプション属性を削除します。  削除する true 削除しない false デフォルト false
        // protected static final Pattern formMethodAttrPattern = Pattern.compile("(<form[^>]*)method\\s*=\\s*([\"\']*)get\\2([^>]*>)", 34);
        compressor.setRemoveFormAttributes(false);
        // Input タグからオプション属性を削除します。 削除する true 削除しない false デフォルト false
        // protected static final Pattern inputTypeAttrPattern = Pattern.compile("(<input[^>]*)type\\s*=\\s*([\"\']*)text\\2([^>]*>)", 34);
        compressor.setRemoveInputAttributes(false);
        // Boolean 値を 属性から削除します。削除する true 削除しない false デフォルト false
        // protected static final Pattern booleanAttrPattern = Pattern.compile("(<\\w+[^>]*)(checked|selected|disabled|readonly)\\s*=\\s*([\"\']*)\\w*\\3([^>]*>)", 34);
        compressor.setSimpleBooleanAttributes(false);
        // インライン イベントハンドラから "javscript:"の記述を削除します。削除する true 削除しない false デフォルト false
        compressor.setRemoveJavaScriptProtocol(false);
        // link タグなどの"http://"  記述を "//"に置換します。
        compressor.setRemoveHttpProtocol(false);
        // link タグなどの"https://" 記述を "//"に置換します。
        compressor.setRemoveHttpsProtocol(true);
        // 改行を除去しない 除去しない true 除去する false デフォルト false
        compressor.setPreserveLineBreaks(false);
        // 周囲のスペースを削除するタグ カンマ区切りで設定する デフォルト Null
        compressor.setRemoveSurroundingSpaces(HtmlCompressor.BLOCK_TAGS_MAX);
        // インラインcss を圧縮する 圧縮する true 圧縮しない false デフォルト false
        compressor.setCompressCss(true);
        // YUI cssコンプレッサーの改行を入れる文字数 -1 で改行しない
        compressor.setYuiCssLineBreak(-1);
        // インラインJavascript を圧縮する 圧縮する true 圧縮しない false デフォルト false
        compressor.setCompressJavaScript(true);
        // Yahoo YUI Compressorのdisable-optimizations の設定 標準で実装されている最適化を無効するか パラメータ を設定するか 無効する true 無効にしない false
        compressor.setYuiJsDisableOptimizations(false);
        // YUI コンプレッサーの改行を入れる文字数 -1 で改行しない
        compressor.setYuiJsLineBreak(-1);
        // nomunge パラメータ (最小化のみで、難読化はしない) を 設定するか 設定する true 設定しない false デフォルト false
        compressor.setYuiJsNoMunge(false);
        // 不要なセミコロンを削除しないようにする 削除しない true 、 削除する false
        compressor.setYuiJsPreserveAllSemiColons(false);//--preserve-semi param for Yahoo YUI Compressor

        // ---------------------------------------------------
        // 独自のjs、css コンプレッサーを用いる場合は使用する
        // ----------------------------------
        //use Google Closure Compiler for javascript compression
        // compressor.setJavaScriptCompressor(new ClosureJavaScriptCompressor(CompilationLevel.SIMPLE_OPTIMIZATIONS));
        //use your own implementation of css comressor
        // compressor.setCssCompressor(new MyOwnCssCompressor());
        return compressor;
    }

結構色々な設定ができて、エンタープライズで設定するには少し迷いますが、 デフォルトでただ使うこと自体は簡単にできるので、とりあえず導入はいいかもしれません。 以上です。

コメント