Не секрет, что для высоких показателей PageSpeed полезно минифицировать css и js код на сайте. А минифицированный css код вообще желательно выводить сразу в html, чтобы тот при загрузке не блокировал первичный рендеринг страниц.
Однако, недостаток подключения сжатых копий js или css всегда заключался в том, что непосредственно сжатый код править неудобно и непонятно, куда удобней править стандартные файлы. Но тогда, после каждого редактирования своих css или js файлов, после каждой мелкой правки в них, надо было вручную перегонять оригиналы в сжатые min версии, перезаливать их на сайт, следить за актуальностью — соответствием версий сжатых и не сжатых файлов друг другу, путаться потом в этой актуальности… Какой-то геморрой, согласны?
Так было раньше, но после установки php библиотеки https://www.minifier.org/ всё будет иначе.
В шаблоне мы продолжим указывать обычные css, js файлы. Но особым способом. И редактировать тоже будем только обычные файлы, как и всегда это делали. А сжатые min копии больше не наша забота, управлять ими будет только скрипт.
Например:
<style type="text/css"> <?=minify('/tpl/css/template.css');?> </style> <!-- на выходе получаем сжатый css код -->
Или так:
<script src="<?=minify('/tpl/js/script1.js');?>"></script> <script src="<?=minify('/tpl/js/script2.js');?>"></script> <script src="<?=minify('/tpl/js/script3.js');?>"></script> <!-- в src этих скриптов на выходе всегда будет путь к сжатым и актуальным min js копиям соответствующих файлов с timestamp меткой времени изменения. -->
То есть, указываете в шаблоне обычные свои js, css файлы с относительным путем от корня сайта. И правки, когда надо, вносите как обычно в них. А создавать их сжатые версии, следить за соответствием оригиналам и актуальностью, автоматом обновлять эти сжатые копии(если был отредактирован оригинальный файл), будет специальная библиотека ( https://www.minifier.org/ ) и функция minify().
Принцип следующий: например есть файл tpl/css/styles.css , если надо напрямую в html вывести его сжатый css код, то вы просто подключаете в шаблоне его так:
<style type="text/css"><?=minify('/tpl/css/styles.css');?></style>
На выходе в браузере получится:
<style type="text/css">сжатый css код этого файла</style>
Если же нужно вывести не сжатый css код, а просто подключить на странице сжатый css файл тегом <link rel=»stylesheet» href=»…»>, тогда надо добавить параметр url вот так:
<link href="<?=minify('/tpl/css/styles.css', 'url');?>" rel="stylesheet">
На выходе в браузере получится путь с min копией соответствующего файла:
<link href="/tpl/css/styles.min.css?TIMESTAMP" rel="stylesheet">
При этом автоматически будет создан соответствующий файл /tpl/css/styles.min.css и функция сама будет отслеживать его соответствие оригиналу. Если вы внесли правки в оригинал — функция minify() автоматически обновит и соответствующий ему сжатый файл. То есть, создает, обновляет и управляет min версиями только скрипт. Достаточно подключить в шаблоне таким способом обычные файлы js и css, а про их сжатые версии забыть и не париться, будто их нет. Правки вносятся в обычные версии файлов, а скрипт подхватит, создаст и если надо обновит сжатые копии. При изменении файла изменится и timestamp метка, чтобы подхватывалось кешем юзеров.
По умолчанию, без второго параметра, функция minify() для css файлов выводит сразу сжатый css код, а для js файлов выводит путь на сжатую версию js файла.
Но это поведение можно менять, передав второй параметр. Например, если нужен не путь к сжатому файлу, а сжатый js код файла, то:
<script><?=minify('/tpl/js/example.js', 'code');?></script>
На выходе будет:
<script>сжатый js код</script>
А если из src нужно подключить min js, тогда:
<script src="<?=minify('/tpl/js/example.js');?>"></script> <!-- или равнозначно вот так --> <script src="<?=minify('/tpl/js/example.js', 'url');?>"></script>
На выходе будет путь с его актуальной min версией:
<script src="/tpl/js/example.min.js?TIMESTAMP"></script>
Внедряется на сайт всё просто:
composer require matthiasmullie/minify
Да, на папочки с файлами css или js права на запись должны иметься 755 По месту использования включаем такой скрипт:
require_once 'minify.php';
<?php require $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php'; use MatthiasMullie\Minify; /* $filepath = относительный путь к не сжатому css или js файлу $appearance = при вызове может иметь 2 значения или не указываться: 'code' = вывести сжатый код 'url' = вывести url к сжатому файлу если значение $appearance не указывается, то для css выводится сжатый код, а для js выводится путь к сжатому файлу */ function minify($filepath, $appearance = false) { $filepath = $_SERVER['DOCUMENT_ROOT'] . $filepath; $ext = substr($filepath, -3) == 'css' ? 'css' : 'js'; $minifiedPath = ($ext == 'css') ? preg_replace('#\.css$#', '.min.css', $filepath) : preg_replace('#\.js$#', '.min.js', $filepath); $v = filemtime($filepath); if (!file_exists($minifiedPath) || $v != filemtime($minifiedPath)) { $minifier = ($ext == 'css') ? new Minify\CSS($filepath) : new Minify\JS($filepath); $minifier->minify($minifiedPath); touch($filepath); } switch ($appearance) { case 'code': echo file_get_contents($minifiedPath); break; case 'url': echo mb_substr($minifiedPath, mb_strlen($_SERVER['DOCUMENT_ROOT'])) . '?' .$v; break; default: echo ($ext == 'css') ? file_get_contents($minifiedPath) : mb_substr($minifiedPath, mb_strlen($_SERVER['DOCUMENT_ROOT'])) . '?' .$v; break; } }
А если composer не используется, то:
<?php require_once __DIR__ . '/minify/src/Minify.php'; require_once __DIR__ . '/minify/src/CSS.php'; require_once __DIR__ . '/minify/src/JS.php'; require_once __DIR__ . '/minify/src/Exception.php'; require_once __DIR__ . '/minify/src/Exceptions/BasicException.php'; require_once __DIR__ . '/minify/src/Exceptions/FileImportException.php'; require_once __DIR__ . '/minify/src/Exceptions/IOException.php'; require_once __DIR__ . '/path-converter/src/ConverterInterface.php'; require_once __DIR__ . '/path-converter/src/Converter.php'; use MatthiasMullie\Minify; /* $filepath = относительный путь к не сжатому css или js файлу $appearance = при вызове может иметь 2 значения или не указываться: 'code' = вывести сжатый код 'url' = вывести url к сжатому файлу если значение $appearance не указывается, то для css выводится сжатый код, а для js выводится путь к сжатому файлу */ function minify($filepath, $appearance = false) { $filepath = $_SERVER['DOCUMENT_ROOT'] . $filepath; $ext = substr($filepath, -3) == 'css' ? 'css' : 'js'; $minifiedPath = ($ext == 'css') ? preg_replace('#\.css$#', '.min.css', $filepath) : preg_replace('#\.js$#', '.min.js', $filepath); $v = filemtime($filepath); if (!file_exists($minifiedPath) || $v != filemtime($minifiedPath)) { $minifier = ($ext == 'css') ? new Minify\CSS($filepath) : new Minify\JS($filepath); $minifier->minify($minifiedPath); touch($filepath); } switch ($appearance) { case 'code': echo file_get_contents($minifiedPath); break; case 'url': echo mb_substr($minifiedPath, mb_strlen($_SERVER['DOCUMENT_ROOT'])) . '?' .$v; break; default: echo ($ext == 'css') ? file_get_contents($minifiedPath) : mb_substr($minifiedPath, mb_strlen($_SERVER['DOCUMENT_ROOT'])) . '?' .$v; break; } }