web-dev-qa-db-ja.com

laravel 5でHTMLを圧縮する方法

Laravel 4.0では、以下のコードを使用してHTMLを圧縮していますlaravelブラウザへの応答出力ですが、laravel 5。

App::after(function($request, $response)
{
    if($response instanceof Illuminate\Http\Response)
    {
        $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);
    }
});

Laravel 5。

OR

laravel 5があれば5でHTMLを圧縮するより良い方法を提供してください。よろしくお願いします。

注意:HTMLの圧縮にlaravelパッケージを使用したくありません。パフォーマンスを低下させることなく機能する単純なコードが必要です。

23
Emeka Mbah

Larvel 5でこれを行うには、関数を middleware に書き換えることをお勧めします。ドキュメントで述べたように:

..このミドルウェアは、要求がアプリケーションによって処理された後にタスクを実行します。

<?php namespace App\Http\Middleware;

class AfterMiddleware implements Middleware {

    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform action

        return $response;
    }
}
5
darronz

完全なコードはこれです(カスタムGZipを有効にした場合):

<?php

namespace App\Http\Middleware;

use Closure;

class OptimizeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $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);
        ini_set('zlib.output_compression', 'On'); // If you like to enable GZip, too!
        return $response;
    }
}

このコードを実装する前/後に、Content-Lengthヘッダーについてブラウザーのネットワークインスペクターを確認してください。

楽しめ ... :).. 。

18
ivahidmontazer

ミドルウェアでhtmlを縮小することは、CPU時間を多く費やすことができ、すべてのリクエストで実行されるため、あまり良いソリューションではありません。

代わりに、htmlminパッケージを使用することをお勧めします( https://github.com/HTMLMin/Laravel-HTMLMin ):

composer require htmlmin/htmlmin
php artisan vendor:publish

ブレードテンプレートレベルでHTMLを縮小してストレージにキャッシュすると、はるかに効果的です。

15
Jokerius

これはほぼ Vahid's 回答のコピーですが、2つの問題が修正されています。

1)このタイプの応答を変更しようとすると例外がスローされるため、応答がBinaryFileResponseかどうかを確認します。

2)改行が完全に削除されると、1行コメントのある行でJavascriptコードが不正になるため、改行文字が保持されていました。

たとえば、以下のコード

 var a; //This is a variable
 var b; //This will be commented out

となります

 var a; //This is a variable var b; //This will be commented out

注:この回答の時点では、問題なく1行のコメントを一致させるための適切な正規表現を手に入れることができなかったため、1行のコメントがある行のみの改行を無視したので、より良い修正を望んでいます。

これが修正バージョンです。

<?php

namespace App\Http\Middleware;

use Closure;

class OptimizeMiddleware {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    $response = $next($request);
    if ($response instanceof \Symfony\Component\HttpFoundation\BinaryFileResponse) {
        return $response;
    } else {
        $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+/" => "\n",
                "/\t/" => '',
                "/ +/" => ' ',
            );
        }
        $buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
        $response->setContent($buffer);
        ini_set('zlib.output_compression', 'On'); //enable GZip, too!
        return $response;
    }
  }
}

編集

ミドルウェアを使用してすべてのリクエストの出力を圧縮することは本当に悪い考えです。チェックアウトすることをお勧めします Jokeriusによるこのソリューション

2

同じ目的を解決するためにwebpackプラグインを作成しました。 MinifyHtmlWebpackPlugin

Npmでプラグインをインストールします。

$ npm install minify-html-webpack-plugin --save-dev

Laravel Mix Users

以下のスニペットをmix.jsファイルに貼り付けます。

    const MinifyHtmlWebpackPlugin = require('minify-html-webpack-plugin');
    const mix = require('laravel-mix');

    mix.webpackConfig({
        plugins: [
            new MinifyHtmlWebpackPlugin({
                src: './storage/framework/views',
                ignoreFileNameRegex: /\.(gitignore)$/,
                rules: {
                    collapseWhitespace: true,
                    removeAttributeQuotes: true,
                    removeComments: true,
                    minifyJS: true,
                }
            })
        ]
    });

Webpackのビルド中にすべてのビューファイルを縮小します。

1
Ashutosh Jha

このパッケージは私の意見でははるかに良いオプションです renatomarinho/laravel-page-speed

0
Pawan Rai

これが最善の方法です。laravel packegesを使用する必要はありません。ありがとうございます。

<?php

namespace App\Http\Middleware;

use Closure;

class OptimizeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $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);
        ini_set('zlib.output_compression', 'On'); // If you like to enable GZip, too!
        return $response;
    }
}
0
AliAsghar