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) режимах;
  • поддерживает разделение по компонентам и фреймворкам.

2.2 LoaderAsset.php — Менеджер асетовlink

Назначениеlink

LoaderAsset — это прокси-класс между системой загрузки и низкоуровневым менеджером ассетов (AssetManager).
Он управляет подключением фреймворков, загрузкой их JS/CSS, проверкой кэша Smart-компонентов и предоставляет доступ к * *AssetManager**.

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

 class LoaderAsset
 {
     protected static $instance;
     public AssetManager $assetManager;
     public const ASSET_DIR = SF_MAIN . '/asset';
     public const ASSET_CONFIG_FILE = '/config/.asset.config.php';
 }
  • Реализован как Singleton (getInstance()).
  • Хранит экземпляр AssetManager в $this->assetManager.

Метод getInstance()link

Возвращает один и тот же экземпляр LoaderAsset:

 LoaderAsset::getInstance()

Позволяет централизованно использовать менеджер ассетов по всей системе.

Метод load($framework, $types = null, $version = 'default')link

Загружает указанный фреймворк по имени:

  • Обращается к файлу конфигурации /simai/config/.asset.config.php;
  • Ищет в нём структуру по $framework → version → file[];
  • Передаёт каждый файл в AssetManager->addJs(), addCss() или addString() в зависимости от типа (script, style, string);
  • Может применять префикс /simai к путям;
  • Возвращает массив подключённых путей.

Метод fetchComponents()link

Непубличный (protected), вызывается из load():

  • Обходит структуру конфигурации ассетов;
  • Проверяет расширение файлов;
  • Добавляет файлы в AssetManager;
  • Поддерживает стили, скрипты, строки.

Метод getCoreHash($name, $cache_path)link

  • Получает хеш-файл для указанного фреймворка:
    • core-<hash>.js
    • core-<hash>.css
  • Проверяет существование этих файлов в /cache/loader/;
  • Если файлы есть — возвращает пути к ним;
  • Используется, например, в Loader::init() для вставки core-бандла без необходимости пересобирать.

Метод checkSmartCache()link

Проверяет, существует ли готовый кэш Smart-компонентов:

  • Путь: /simai/cache/smart/<pageHash>/;
  • Если найдены js.js и/или css.css, они подключаются как ассеты:
 $this->assetManager->addJs(...);
 $this->assetManager->addCss(...);

Позволяет избежать повторной генерации шаблонов и ускорить загрузку.

Метод render(string|array $path)link

Принимает строку пути или массив путей и:

  • генерирует HTML <script> или <link> тег;
  • выводит их напрямую в HTML-ответе.

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

  • Loader::init() — для загрузки фреймворка и подключения готовых кэшей;
  • Loader::vUseGenerate() и vUseMergeConfigGenerate() — для генерации финального вывода;
  • Шаблоны, темы, динамическая загрузка.

Выводlink

LoaderAsset — это:

  • прослойка между логикой и AssetManager;
  • инструмент для подключения фреймворков, кэша, core-бандлов;
  • хранилище и делегатор всех JS/CSS ресурсов;
  • основная точка доступа к AssetManager в проекте.

2.4 TemplateLoader.php — Работа с шаблонами Smart-компонентовlink

Назначениеlink

Класс TemplateLoader отвечает за:

  • загрузку и сохранение шаблонов Smart-компонентов;
  • генерацию файлов js.js и css.css из шаблонов;
  • формирование fake-шаблонов для вставки в DOM;
  • обновление кэша шаблонов, если они изменились.

Этот класс используется при генерации ответа клиенту, в частности, в режиме vUseMergeConfigGenerate().

Ключевые методыlink

buildObject($hash): arraylink

Основной публичный метод.

  • Принимает хеш страницы (pageHash);
  • Собирает шаблоны из кэша и/или временного контента;
  • Возвращает массив:
[
    'status' => true,
    'hasHash' => true|false,
    'templates' => [...],
    'fakeTemplates' => [...] 
]

getTemplates($path) и getFakeTemplates($path)link

  • Загружают шаблоны из файлов templates.txt и fake.txt, находящихся в папке /simai/cache/.

setTemplates($data, $path) и setFakeTemplates(...)link

  • Сохраняют сериализованные массивы шаблонов в .txt файлы.

processTemplateData() / processCacheData()link

  • Обновляют шаблоны, если есть отличия;
  • Используют метод searchDiff() для определения изменений;
  • При необходимости — сливают старые и новые шаблоны.

getTemplateFiles($data, $hashDir)link

  • Формирует массив путей к CSS и JS-файлам, полученным из шаблонов Smart-компонентов;

  • Используется при генерации единого js.js и css.css.

setCachedFiles($hashDir, $data)link

  • Сохраняет шаблоны в папке /simai/cache/smart//
  • Минифицирует и объединяет файлы;
  • Создает:
    • js.js
    • css.css

Минификацияlink

Используется библиотека MatthiasMullie\Minify:

use MatthiasMullie\Minify\CSS;
use MatthiasMullie\Minify\JS;

Минификация выполняется в методе setFileData($data, $path, $type).

Кэширование по pageHashlink

  • Шаблоны кэшируются в поддиректории /cache/smart//;
  • При повторной загрузке — шаблоны берутся оттуда;
  • Если хеш совпадает — повторная генерация не выполняется.

Очисткаlink

clear()link

  • Удаляет templates.txt.

removeDirectory($dir)link

  • Удаляет директорию smart/ (в т.ч. если она устарела).

Безопасностьlink

checkData($data)link

  • Проверяет, является ли файл валидным сериализованным массивом.

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

  • Loader::vUseMergeConfigGenerate() → генерация шаблонов;
  • Серверной логике Smart-компонентов;
  • Для хранения шаблонов fakeTemplates → вставляются в DOM на клиенте.

2.7 LoaderFile.php — Поиск и фильтрация файловlink

Назначениеlink

LoaderFile — это вспомогательный класс, который предоставляет метод для получения списка файлов из директории с возможностью фильтрации.
Он используется для поиска JS/CSS-файлов при сборке ассетов в Loader.php и AssetManager.

Основной методlink

getList($dir, $arSearchFileType = false, $arIgnoreFile = false, $sortFlag = true): array

Аргументыlink

Параметр Описание
$dir Абсолютный или относительный путь к директории
$arSearchFileType Список нужных расширений, например: ['js', 'css']
$arIgnoreFile Список подстрок, по которым нужно исключать файлы (например, ['.map'])
$sortFlag Сортировать результат или нет (по умолчанию true)

Поведениеlink

  1. Если путь не абсолютный — дополняется $_SERVER["DOCUMENT_ROOT"];
  2. Выполняется opendir($dir) и перебор всех файлов;
  3. Пропускаются . и ..;
  4. Применяется фильтрация по расширениям;
  5. Применяется фильтрация по подстрокам в имени файла;
  6. Возвращается массив вида:

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

  • Loader::getMinFile() — для поиска .js;
  • Loader::getMinFileCss() — для поиска .css;
  • Других частях, где нужно получить список файлов определённого типа из папки компонента.
 \"/abs/path/to/file1.js\" => \"file1.js\",
 \"/abs/path/to/file2.js\" => \"file2.js\"

Пример вызоваlink

 $jsFiles = LoaderFile::getList('/simai/asset/simai.framework/component/modal/js/', ['js'], ['.map']);

Особенностиlink

  • Универсальный механизм обхода и фильтрации;
  • Позволяет игнорировать нежелательные файлы (например, .map, .bak, .DS_Store);
  • Автоматически дополняет путь до корня проекта при необходимости.