Как сжать HTML в laravel 5
в Laravel 4.0 я использую приведенный ниже код для сжатия выходных данных ответа HTML laravel в браузере, однако он не работает в laravel 5.
App::after(function($request, $response)
{
if($response instanceof IlluminateHttpResponse)
{
$buffer = $response->getContent();
if(strpos($buffer,'<pre>') !== false)
{
$replace = array(
'/<!--[^[](.*?)[^]]-->/s' => '',
"/<?php/" => '<?php ',
"/r/" => '',
"/>n</" => '><',
"/>s+n</" => '><',
"/>ns+</" => '><',
);
}
else
{
$replace = array(
'/<!--[^[](.*?)[^]]-->/s' => '',
"/<?php/" => '<?php ',
"/n([S])/" => '',
"/r/" => '',
"/n/" => '',
"/t/" => '',
"/ +/" => ' ',
);
}
$buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
$response->setContent($buffer);
}
});
пожалуйста, как мне сделать эту работу в Laravel 5.
или
пожалуйста, предоставьте лучший способ сжатия HTML в laravel 5, если таковые имеются. Спасибо заранее.
NB: я не хочу использовать какой-либо пакет laravel для сжатия html, просто нужен простой код, который выполняет работу без убийства спектакль.
6 ответов
рекомендуемый способ сделать это в Larvel 5-переписать вашу функцию как промежуточное. Как указано в документах:
..это промежуточное ПО выполнит свою задачу после запрос обрабатывается приложением:
<?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])/" => '',
"/\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;
}
}
пожалуйста, проверьте ваш браузер Network inspector для Content-Length
заголовок до / после реализации этого кода.
понравится ... :).. .
это не очень хорошее решение для минимизации html в middleware, так как вы можете потратить на него много времени процессора, и он работает по каждому запросу.
вместо этого лучше использовать пакет htmlmin (https://github.com/HTMLMin/Laravel-HTMLMin ):
composer require htmlmin/htmlmin
php artisan vendor:publish
минимизация HTML на уровне шаблона Блейда и кэширование его в хранилище должно быть намного эффективнее.
Это почти копия Вахид-х ответ, но он устраняет две проблемы.
1) это проверка, если ответ BinaryFileResponse
как любая попытка изменить этот тип ответа вызовет исключение.
2) он сохранил символы новой строки, поскольку полное исключение новых строк приведет к плохому коду 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
Примечание: В время этого ответа я не мог получить хорошее регулярное выражение, чтобы соответствовать однострочным комментариям без осложнений или, скорее, игнорировать новые строки только в строках с однострочным комментарием, поэтому я надеюсь на лучшее исправление.
вот измененная версия.
<?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])/" => '',
"/\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;
}
}
}
Это лучший способ.. нам не нужно использовать 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])/" => '',
"/\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;
}
}
для легкого сжатия я создаю свою собственную библиотеку, которая требует небольшого изменения конфигурации в app/Http/Kernel.php
в основном он будет использовать AfterMiddleware
концепция laravel, где все выходные данные готовы к удалению в браузер. Так это Middleware
будет срабатывать прямо перед отправкой вывода html в браузер.
protected $middleware = [
...
\Vrkansagara\Http\Middleware\AfterMiddleware::class,
...
];
вы также можете настроить несколько сред одновременно с помощью .
более детально о том, как установить и настроить будет найти здесь