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パッケージを使用したくありません。パフォーマンスを低下させることなく機能する単純なコードが必要です。
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;
}
}
完全なコードはこれです(カスタム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
ヘッダーについてブラウザーのネットワークインスペクターを確認してください。
楽しめ ... :).. 。
ミドルウェアでhtmlを縮小することは、CPU時間を多く費やすことができ、すべてのリクエストで実行されるため、あまり良いソリューションではありません。
代わりに、htmlminパッケージを使用することをお勧めします( https://github.com/HTMLMin/Laravel-HTMLMin ):
composer require htmlmin/htmlmin
php artisan vendor:publish
ブレードテンプレートレベルでHTMLを縮小してストレージにキャッシュすると、はるかに効果的です。
これはほぼ 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によるこのソリューション
同じ目的を解決するためにwebpackプラグインを作成しました。 MinifyHtmlWebpackPlugin
Npmでプラグインをインストールします。
$ npm install minify-html-webpack-plugin --save-dev
以下のスニペットを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のビルド中にすべてのビューファイルを縮小します。
このパッケージは私の意見でははるかに良いオプションです renatomarinho/laravel-page-speed
これが最善の方法です。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;
}
}