1.1 Автоматический поиск плагинов
SFLoaderPlugin определяет, какие модули нужны текущей странице, и загружает только их JS/CSS. Основной источник правил
для поиска — объект SF.RuleLoader. В него попадают правила для разных смысловых наборов:
component— обычные UI-компоненты изsrc/component/*;smart— Smart-компоненты изsrc/smart/*и связанный с ними runtime;utility— утилитарные классы изsrc/utility/*.
Тип модуля и способ его обнаружения — разные вещи. Например, Smart-компонент может находиться по тегу <sf-tooltip>, а
обычный компонент — по регулярному выражению в HTML. Это не делает один подход «новее» другого: loader просто использует
разные каналы поиска.
Основной контракт SF.RuleLoader
Правило описывает имя модуля, способ его обнаружения, тип и нужные ресурсы:
SF.RuleLoader['dropdown'] = {
regex: /sf-dropdown|sf-list-item/,
type: 'component',
js: true,
css: true,
relation: [{ name: 'icon-buttons' }],
};
SF.RuleLoader['cl-tooltip'] = {
tags: ['sf-tooltip'],
type: 'smart',
mode: 'smart',
js: true,
relation: [{ name: 'tooltip' }],
};
Частые поля:
tags— список custom-element тегов, по которым модуль ищется в живом DOM;regex— регулярное выражение для поиска признаков модуля в HTML;type— смысловой тип модуля:component,smart,utility;mode— режим загрузки, если он отличается или должен быть указан явно;js,css— какие ресурсы нужно подключить;relation— зависимости, которые должны быть загружены вместе с модулем.
Как проходит первичный поиск
После инициализации loader ждёт готовности страницы и выполняет несколько проверок:
- Ищет shortcodes в тексте страницы.
- Ищет custom elements по правилам
tags. - Ищет статические иконки.
- Проверяет атрибуты элементов по regex-правилам.
- Проверяет явные подключения через
sf-asset. - Выполняет общий regex-поиск по HTML.
- Запускает
MutationObserverдля динамических изменений DOM.
Если во время этих проверок найден новый модуль, loader добавляет его в очередь и вызывает загрузку ресурсов.
Поиск по tags
Правила с полем tags используются для компонентов, которые представлены в DOM отдельным тегом:
<sf-tooltip text="Подсказка"></sf-tooltip>
SF.RuleLoader['cl-tooltip'] = {
tags: ['sf-tooltip'],
type: 'smart',
mode: 'smart',
js: true,
relation: [{ name: 'tooltip' }],
};
Loader строит карту sf-* тег -> имя модуля, сканирует DOM и при встрече <sf-tooltip> отмечает модуль
cl-tooltip как необходимый. После загрузки JS браузер сам обновляет уже существующий custom element через
customElements.define(...).
Поиск через regex
Правила с regex используются, когда у компонента нет отдельного custom-element тега или модуль нужно определить по
классу, атрибуту либо другому фрагменту HTML:
<button data-fancybox="gallery">Открыть</button>
SF.RuleLoader['fancybox'] = {
regex: /data-fancybox/,
type: 'attribute',
mode: 'component',
js: true,
css: true,
relation: [{ name: 'jquery', mode: 'component', js: true }],
};
Regex-поиск работает по отфильтрованному HTML. Блоки, которые не должны влиять на загрузку, например pre, code и
элементы с игнорируемыми областями наблюдения, исключаются перед проверкой.
Явное подключение через sf-asset
Атрибут sf-asset остаётся поддерживаемым способом явно указать модуль:
<div sf-asset="modal"></div>
В этом случае loader напрямую добавит modal в список модулей. Этот механизм полезен для ручного подключения, но для
компонентов с устойчивым DOM-признаком обычно удобнее описывать правило в SF.RuleLoader.
Зависимости
Поле relation позволяет загрузить связанные модули вместе с найденным:
SF.RuleLoader['dropdown'] = {
regex: /sf-dropdown|sf-list-item/,
type: 'component',
js: true,
css: true,
relation: [{ name: 'icon-buttons' }],
};
Если на странице найден dropdown, loader также подготовит icon-buttons. Зависимости не являются отдельным способом
поиска: они расширяют список загрузки после того, как найден основной модуль.
Динамические изменения DOM
После первичной загрузки SFLoaderPlugin запускает MutationObserver. Он отслеживает добавленные узлы и изменения
атрибутов, затем повторяет нужные проверки только для изменившейся части DOM:
- ищет shortcodes;
- проверяет custom elements по
tags; - проверяет статические иконки;
- анализирует атрибуты и regex-правила;
- при необходимости запускает загрузку новых модулей.
Это позволяет подгружать компоненты, которые появились после AJAX-запроса, Turbo-перехода или ручной вставки HTML.
Внутренние методы
Основные методы текущего поиска:
prepare()— запускает первичный поиск и подготовку загрузки;scanCustomElements()— ищетsf-*теги по правиламtags;scanAttributes()— проверяет атрибуты элементов;searchAttr()— обрабатывает явныеsf-asset;searchRegexp()— выполняет общий regex-поиск по HTML;search()— подключаетMutationObserverи обрабатывает динамические изменения.
Особенности
- Один и тот же модуль не загружается повторно.
- Правила
component,smartиutilityживут в одномSF.RuleLoader, но обозначают разные смысловые наборы. tags,regexиsf-asset— это каналы обнаружения, а не типы компонентов.- Для динамически вставленных
sf-*тегов важно, чтобы они находились в живом DOM. - Дочерние
sf-*элементы внутри shadow DOM не обнаруживаются обычным сканированием страницы.