Tygh\Less::parseUrls добавляет к ассетам в url() компайл-тайм TIME — рассинхрон одинаковых шрифтов/картинок между скомпилированными файлами стилей

В методе Tygh\Less::parseUrls() к каждому url(...) (шрифты, фоновые картинки) добавляется '?' . TIME — момент компиляции. При этом fn_merge_styles() создаёт несколько скомпилированных файлов стилей standalone.<hash>.css (для разных устройств, раскладок, наборов активных аддонов), и каждый компилируется в свою секунду. В результате один и тот же физический файл шрифта получает разный query в каждом из этих standalone.*.css. Последствия:

  • браузер не переиспользует уже скачанный шрифт между страницами, которые обслуживаются разными standalone.*.css — качает его заново для каждого;
  • любой <link rel="preload"> на шрифт со стабильным query промахивается мимо URL в CSS → шрифт грузится дважды (видно в PageSpeed, аудит «шрифты»).

Из-за этого не может нормально работать существующий модуль. Популярный аддон AlexBranding «AB: Preload» предзагружает шрифты через <link rel="preload"> ради ускорения первого рендера. Но его query никогда не совпадает с query того же шрифта внутри standalone.*.css (там компайл-тайм TIME), поэтому предзагруженный шрифт браузер скачивает повторно при разборе CSS. Модуль делает противоположное своему назначению — не из-за своей ошибки, а из-за поведения ядра. То есть проблема ломает и штатную загрузку, и стороннюю экосистему оптимизации.

Предложение: использовать fn_get_storage_data('cache_id') вместо TIME:

. '?' . (fn_get_storage_data('cache_id') ?: TIME);

Мотивация: бесплатное улучшение LCP/FCP для любого магазина, где создаётся несколько standalone.*.css и используются кастомные шрифты; впервые начинает работать предзагрузка шрифтов — как штатная, так и через аддоны вроде AB: Preload.

Минусов нет: cache_id бампается ровно при fn_clear_cache('assets') — то есть тогда, когда ассеты и могут смениться, так что cache-busting сохраняется полностью. Файлы шрифтов не входят в хэш скомпилированного файла (там только filemtime CSS-исходников), поэтому замена шрифта в любом случае требует очистки кэша → cache_id это покрывает. Сценария, где TIME даёт корректность, которой не даёт cache_id, — нет.