2.3 AssetManager.php — Генерация и сборка асетовlink

Назначениеlink

AssetManager — это ядро логики генерации, подключения и кэширования JS и CSS файлов в SFLoader.
Он собирает ассеты из фреймворков и компонентов, объединяет их в бандлы, создаёт .gz версии, и подключает их к страницам.

Основная структураlink

class AssetManager { public array $components = []; public array $frameworksFiles = []; public array $frameworkHash = []; public array $frameworks = []; public array $gzipSupport = []; public array $contentPerPages = []; public bool $isTemp = false; ... }

$components — обычные плагины;

$frameworksFiles — ассеты фреймворков;

$contentPerPages — кастомные бандлы на основе страницы;

$isTemp — флаг временного режима (используется в vUseMergeConfigGenerate()).

Методы добавления ассетовlink

addJs($path, $isFramework = false)link

addCss($path, $isFramework = false)link

addString($string, $isFramework = false)link

  • Добавляют JS, CSS или строку (<script>...</script>, <style>...</style>);
  • В зависимости от флага $isFramework — кладут в $frameworksFiles или $components.

Метод renderAll($name = '', $onlyPaths = false)link

  • Главный метод генерации финального вывода;
  • При $name — рендерит только указанный фреймворк;
  • Иначе вызывает renderAllBundles() — сборку всех плагинов и компонент.

Метод renderAllBundles($onlyPaths = false)link

  • Объединяет все JS и CSS из $components;
  • Вызывает bundle() для создания файлов;
  • Возвращает:
    • массив путей (если $onlyPaths = true);
    • или HTML-теги <script>, <link>.

Метод bundle($onlyPaths = false)link

  • Генерирует хеш по контенту (md5());
  • Проверяет, существуют ли уже такие файлы:
    • bundle-<hash>.js
    • bundle-<hash>.css
  • Если нет — создаёт файлы, записывает контент;
  • Создаёт GZIP-версии (.gz) при необходимости;
  • Возвращает путь или HTML.

Метод getGzip($filePath, $content)link

  • Создаёт .gz версию указанных файлов.

Метод getIdenticalHashFiles($prefix, $extension)link

  • Проверяет, есть ли уже сгенерированные файлы с тем же хешем;
  • Помогает избежать лишнего создания новых файлов.

Метод unlinkFiles($files, $keep)link

  • Удаляет файлы, оставляя только $keep-файлы;
  • Используется при обновлении или сборке ассетов.

Метод findPageBundles()link

  • Проверяет кэш по текущему pageHash;
  • Если уже есть .js/.css бандлы — подключает их;
  • Также вставляет:
<script>
    window.BUNDLE_LOADED = true;
    window.BUNDLE_ID = '<hash>';
</script>

Назначение переменных window.BUNDLE_LOADED и window.BUNDLE_IDlink

window.BUNDLE_LOADEDlink

В методе init() плагина:

 this.firstLoad = !window.BUNDLE_LOADED;
 if (this.firstLoad) {
     document.body.style.opacity = '0';
 }

Если BUNDLE_LOADED === true, значит:

  • Бандл уже подключён сервером (AssetManager::findPageBundles());
  • Нет необходимости подгружать все ассеты через Ajax;
  • Загрузчик просто берёт плагины из localStorage и отрисовывает.
  • На бекенде генерируется только temp часть (если необходимо)

Если BUNDLE_LOADED !== true, то:

  • Показывается прелоадер;
  • Выполняется полный запрос к серверу (loader.php?a=...) для сборки.

window.BUNDLE_IDlink

Содержит уникальный хеш страницы (pageHash), сформированный на сервере.

Используется в SFLoaderPlugin для того, чтобы:

  • Сопоставить текущую страницу с кэшом в localStorage;
  • Подгрузить плагины, если хеш отличается;
  • Позволить странице сравнить: соответствует ли кэш — текущей структуре страницы.

Примерlink

| let plugins = localStorage.getItem( `SF_PLUGIN_LIST-${this.urlHash}`) if (!plugins || window.BUNDLE_ID !== this.urlHash) { plugins = localStorage.getItem(`SF_PLUGIN_LIST-$

{window.BUNDLE_ID}`) }

Выводlink

Эти переменные позволяют:link

  • избежать повторной загрузки JS/CSS;

  • не запускать прелоадер без необходимости;

  • повысить производительность и стабильность загрузки;

  • точно определить, какие плагины уже были подключены.

Поддержка GZIPlink

  • Хранит информацию в $gzipSupport[$path];
  • Используется при генерации, если включено сжатие и сервер это поддерживает.

Используется вlink

  • LoaderAsset::renderAll() и render() — для вывода в HTML;
  • Loader::vUseGenerate() и vUseMergeConfigGenerate() — как основа генерации;
  • checkSmartCache() — подключение smart-кеша (smart/<pageHash>/js.js);

Выводlink

AssetManager — это:

  • генератор финальных ассетов;
  • оптимизатор и кэшер (через хеши и gzip);
  • работает и в обычном (/cache) и временном (/temp) режимах;
  • поддерживает разделение по компонентам и фреймворкам.