Google Pagespeed meckert es ebenfalls von Zeit zu Zeit an: Neben einer empfohlenen GZIP-Komprimierung kann man auch unnötige Zeichen (z.B. Leerzeichen, Umbrüche und HTML-Kommentare) aus dem gerenderten HTML einer TYPO3-Seite entfernen. Zwar gibt es bereits einen ViewHelper (f:spaceless) der einem im Fluid hilft, den Code etwas zu komprimieren, aber dieser kümmert sich in der Regel lediglich um den Body-Bereich eurer Website. Wollt ihr wirklich alles komprimieren, empfiehlt sich der Einsatz von PSR-15 Middleware.
Das Paket wyrihaximus/html-compress hilft uns bei der Komprimierung. Dazuladen kann man das z.B. über die composer.json:
{
"name": "vendor/sitepackage",
"description": "Sitepackage extension",
"type": "typo3-cms-extension",
"homepage": "https://www.in2code.de",
"require": {
"typo3/cms-core": "^10.4",
"wyrihaximus/html-compress": "^1"
},
"autoload": {
"psr-4": {
"Vendor\\Sitepackage\\": "Classes/"
}
}
}
EXT:sitepackage/Configuration/RequestMiddlewares.php:
<?php
return [
'frontend' => [
'sitepackage-compress-html' => [
'target' => \Vendor\Sitepackage\Middleware\HtmlCompress::class,
'before' => [
'typo3/cms-frontend/output-compression'
],
'after' => [
'typo3/cms-adminpanel/renderer'
]
]
]
];
EXT:sitepackage/Classes/Middleware/HtmlCompress.php:
<?php
declare(strict_types=1);
namespace Vendor\Sitepackage\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use TYPO3\CMS\Core\Http\StreamFactory;
use WyriHaximus\HtmlCompress\Factory;
/**
* Class HtmlCompress
*/
class HtmlCompress implements MiddlewareInterface
{
/**
* @param ServerRequestInterface $request
* @param RequestHandlerInterface $handler
* @return ResponseInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$response = $handler->handle($request);
if ($this->isTypeNumSet($request) === false) {
$stream = $response->getBody();
$stream->rewind();
$content = $stream->getContents();
$newBody = (new StreamFactory())->createStream($this->compressHtml($content));
$response = $response->withBody($newBody);
}
return $response;
}
/**
* @param string $html
* @return string
*/
protected function compressHtml(string $html): string
{
$parser = Factory::construct();
$html = $parser->compress($html);
$html = $this->removeComments($html);
return $html;
}
/**
* Remove all html comments but not "<!--TYPO3SEARCH_begin-->" and "<!--TYPO3SEARCH-end-->"
* @param string $html
* @return string
*/
protected function removeComments(string $html): string
{
return preg_replace('/<!--((?!TYPO3SEARCH)[\s\S])*?-->/', '', $html);
}
/**
* @param ServerRequestInterface $request
* @return bool
*/
protected function isTypeNumSet(ServerRequestInterface $request): bool
{
return $request->getAttribute('routing')->getPageType() > 0;
}
}
Hinweis: Wenn ihr HTML-Kommentare entfernt, bedenkt, dass ihr für Solr oder die Indexsuche die Kommentare "TYPO3SEARCH_..." benötigt! Oben stehender Code berücksichtigt dies bereits.