Быстрая минификация css для bitrix

1k
Алексей,
Быстрая минификация css для bitrix

Идея в том, чтобы взять готовую php библиотеку для минификации css и рекурсивно пройтись им по всем css файлам шаблона, создавая min копии, которые битрикс подхватывает автоматически.

Идея в том, чтобы взять готовую php библиотеку для минификации css и рекурсивно пройтись им по всем css файлам шаблона, создавая min копии, которые битрикс подхватывает автоматически.

Готовых решений для минификации css на php полно, ссылку на какой-то конкретный давать не буду, т.к. сам с ними еще не работал. Использовать готовое решение это правильный подход. Ниже будет неправильный :)

Я для своего блога написал экспериментальный скриптик которые делает min.css файлы для всех файлов стилей.

<?
$dir = new RecursiveDirectoryIterator($_SERVER['DOCUMENT_ROOT'].'/local/'); // в папке local
$it = new RecursiveIteratorIterator($dir);
$res = new RegexIterator($it, '/^.+(?<!min)\.css$/i', RecursiveRegexIterator::GET_MATCH); // найдёт все css файлы (не *.min.css)
foreach ($res as $arFiles) {
	foreach ($arFiles as $file) {
		$css = file_get_contents($file);
		$minCss = preg_replace(
			array(
				"/\n\s+/", // удаляет пробелы-отступы
				'!/\*[^*]*\*+([^/][^*]*\*+)*/!', // удаляет комментарии
				"/[\n\r]+/", // удаляет все переносы строк
			),
			"",
			$css
		);
		
		$minCss = str_ireplace(
			array(';}', ' {', ' }', ': ', ', .', "\t", ':0px', ' !important', ', ', 'font-weight:normal', 'font-weight:bold', ':0.', ' >', '> '),
			array('}',  '{',  '}',  ':',  ',.',  " ",  ':0',   '!important',  ',',  'font-weight:400',	'font-weight:700',  ':.',  '>',  '>'),
			$minCss
		); // убирает немного пробелов и ненужных символов
		$minCss = preg_replace("/\s\s+/", ' ', $minCss); // более 2-х пробелов заменяет на 1
		$minCss = preg_replace("/\}[\w\s#=\",-:()\[\]\*~\+>^\$]+\{\}/i", '}', $minCss); // Удаляет селекторы с пустыми стилями
		$minCss = preg_replace("/url\(['\"](.+?)['\"]\)/i", 'url($1)', $minCss); // Удаляет кавычки в url
		$minCss = preg_replace('/([^=])#([a-f\d])\2([a-f\d])\3([a-f\d])\4([\s;}])/i', '$1#$2$3$4$5', $minCss); // Укарочивает hex
		// минифицированный css будет записан в файл, рядом с оригиналом, в .min.css
		$minFile = substr_replace($file, 'min.css', mb_strlen($file)-3, 3); 
		file_put_contents($minFile, $minCss);
	}
}

Простой скрипт, но опасный, т.к. может сломать вёрстку. Есть небезопасные замены, которые в редких случаях могут приводить к неправильному результату. Использовать на свой страх и риск.

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 19 августа 2021 | Обновлено 23 марта 2022
велосипед, regexp, эксперимент, производительность, css
Поделиться
Похожие статьи
CSS, JS inline в Битрикс
Добиваю Google Pagespeed, до идеального результата осталось несколько пунктов. На данный момент приш...
Читать дальше » 0
Алексей,
Как убрать js и css файлы ядра
Часть можно убрать отключив галочки в настройках модуля, часть только вырезав при завершении буфериз...
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
Идея в том, чтобы взять готовую php библиотеку для минификации css и рекурсивно пройтись им по всем css файлам шаблона, создавая min копии, которые битрикс подхватывает автоматически.