tutorial laravel

Laravel Compress HTML, Cara Compress HTML Menggunakan Middleware

Jika anda sedang mencari solusi bagaimana cara agar source code anda tidak mudah dibaca oleh orang lain (mohon dicatat, hanya sebatas tidak mudah dibaca) yang istilahnya adalah uglify html atau compress html ada juga yang menyebutnya minify html menggunakan laravel dan anda tidak ingin menggunakan plugin tambahan untuk merealisasikannya, maka menggunakan middleware mungkin bisa menjadi solusinya. Pada kesempatan kali ini kita akan mencoba membahas bagaimana cara merealisasikannya menggunakan middleware pada laravel, langsung saja kita masuk pada pembahasannya.

Goals – Compress output html pada browser menggunakan laravel

Tujuan dari pembahasan kali ini adalah, bagaimana cara kita dapat men-compress output html pada browser menggunakan middleware pada laravel. Sebetulnya cara ini tidak direkomendasikan karena akan memberatkan performance dari cpu (karena tiap request dan response akan ada satu proses tambahan yaitu proses compress output html ini), juga karena mudahnya ditemukan plugin compress html untuk laravel yang saya rasa bisa lebih stable untuk digunakan di aplikasi anda. Jadi silahkan anda menerapkan cara yang ada pada artikel ini hanya jika anda memang tidak ingin menggunakan plugin-plugin tersebut. Berikut ini adalah contoh dari view-source pada browser setelah dan sebelum cara ini kita aplikasikan :

Sebelum compress
Laravel Compress HTML
Sesudah compress

Materi

Karena kita akan memanfaatkan middleware pada laravel, maka pertama-tama kita akan membuat middleware baru dengan nama CompressHtml, untuk detail pembuatan middleware bisa dilihat disini.

Isi dari class middleware CompressHtml kurang lebih seperti ini :

<?php

namespace App\Http\Middleware;

use Closure;

class CompressHtml
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(env('COMPRESS_HTML', true) === true){
            $response = $next($request);
            $buffer = $response->getContent();
            if(strpos($buffer,'<pre>') !== false)
            {
                $replace = array(
                    '/<!--[^\[](.*?)[^\]]-->/s' => '',
                    "/<\?php/"                  => '<?php ',
                    "/\r/"                      => '',
                    "/>\n</"                    => '><',
                    "/>\s+\n</"                 => '><',
                    "/>\n\s+</"                 => '><',
                );
            }
            else
            {
                $replace = array(
                    '/<!--[^\[](.*?)[^\]]-->/s' => '',
                    "/<\?php/"                  => '<?php ',
                    "/\n([\S])/"                => '$1',
                    "/\r/"                      => '',
                    "/\n/"                      => '',
                    "/\t/"                      => '',
                    "/ +/"                      => ' ',
                );
            }
            $buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
            $response->setContent($buffer);
            return $response;
        }else{
            return $next($request);
        }
    }
}

Perlu diperhatikan, diatas juga kita menambahkan satu buah variable baru pada file env yaitu COMPRESS_HTML, dimana jika COMPRESS_HTML berisi true maka compress output html pada browser akan dijalankan. Untuk detail pembahasan tentang file env bisa dilihat disini.

Penutup

Demikianlah bagaimana cara compress html pada laravel dengan memanfaatkan middleware, sekali lagi saya tekankan, cara ini dianggap kurang efektif karena adanya satu proses tambahan dari sisi server, dimana setiap kali ada request masuk maka response yang di kembalikan ke client akan di compress terlebih dahulu, cara ini saya tulis hanya sebagai bahan alternatif dan bahan pembelajaran saja, terima kasih.

Leave a Reply

Your email address will not be published. Required fields are marked *