1.4 Кэширование и ускорение загрузки
SFLoaderPlugin использует несколько уровней кэша, чтобы быстрее восстанавливать список нужных модулей, не повторять
заведомо неудачные загрузки и переиспользовать данные Smart-компонентов. Основное хранилище на frontend — браузерный
localStorage.
Важно различать два вида кэша:
- кэш loader-а в
localStorage, где хранятся списки модулей, Smart-шаблоны и missing state; - HTTP-кэш браузера для уже загруженных JS/CSS файлов.
SF_PLUGIN_LIST-* не хранит сами JS/CSS файлы. Он хранит список модулей, которые loader должен считать нужными для
страницы.
Основные ключи
Loader использует несколько ключей:
SF_PLUGIN_LIST-<pageHash>— список найденных модулей для страницы;SF_SMART_LIST-<pageHash>— данные Smart-шаблонов;SF_MISSING_PLUGINS— информация о файлах, которые не удалось загрузить;SF_CACHE_VERSION— версия общего SF-кэша;SF_PLUGIN_LIST_VERSION— версия кэша списков модулей и Smart-данных.
Данные, которые могут быть объёмными, сохраняются через compressToUTF16() и читаются через
decompressFromUTF16().
Page hash
pageHash нужен, чтобы разделять кэш между страницами. Loader берёт текущий URL без query-параметров. Для динамических
страниц он может отбросить последний сегмент пути, чтобы страницы одного типа использовали общий ключ. После этого URL
хэшируется через md5() и обрезается до 16 символов.
Упрощённо:
const pageHash = md5(pageUrl).substring(0, 16);
Итоговый ключ:
SF_PLUGIN_LIST-<pageHash>
Если в окружении есть window.BUNDLE_ID, loader может использовать его как fallback-ключ для списка модулей.
Кэш списка модулей
При запуске загрузки loader сохраняет текущий this.module:
localStorage.setItem(
`SF_PLUGIN_LIST-${pageHash}`,
compressToUTF16(JSON.stringify(this.module))
);
this.module содержит имена модулей, которые были найдены через discovery и relations. Это не обязательно список уже
успешно подключенных файлов. Он отражает, какие модули нужны странице.
При следующем открытии страницы loader:
- Читает
SF_PLUGIN_LIST-<pageHash>. - Распаковывает список через
decompressFromUTF16(). - Восстанавливает
this.module. - Сразу запускает
getLoader()по кэшированному списку.
В standAlone-режиме это позволяет не ждать полного повторного discovery перед стартом загрузки. При этом сами JS/CSS
файлы всё равно должны быть доступны: они могут прийти из HTTP-кэша браузера или быть подключены повторно, если их ещё
нет на странице.
Кэш Smart-шаблонов
Smart-данные сохраняются отдельно:
SF_SMART_LIST-<pageHash>
Внутри хранится сжатый JSON:
{
templates,
cache
}
При старте loader читает этот ключ и помещает данные во внутренний smartCache. Это позволяет Smart runtime использовать
ранее полученные шаблоны и fake-content без лишнего обращения к серверу, если кэш всё ещё валиден.
Missing files cache
Если JS или CSS файл не удалось загрузить, loader сохраняет информацию в:
SF_MISSING_PLUGINS
Значение — сжатый JSON с состоянием по модулю:
{
"dropdown": {
"css": true,
"missingMin": true
}
}
Это нужно, чтобы не повторять заведомо неудачные запросы. Для CSS loader сначала пробует обычный файл, затем .min.css.
Если обе попытки неудачны, состояние фиксируется в SF_MISSING_PLUGINS.
При следующем запуске loader перечитывает этот ключ. Также выполняется revalidate: если модуль теперь есть в
SF.RuleLoader или уже отмечен как загруженный, запись может быть удалена из missing cache.
Версии кэша
Loader поддерживает две версии:
cacheVersion
Используется для общего сброса SF-кэша. Если текущая версия отличается от сохранённой в SF_CACHE_VERSION, loader очищает
все ключи, начинающиеся с SF_, и сохраняет новую версию.
Если cacheVersion не задан, loader тоже очищает общий SF-кэш, чтобы не держать потенциально устаревшие данные.
pluginListVersion
Используется для более узкого сброса списков модулей, Smart-кэша и missing files. Если версия изменилась, вызывается
clearCache().
clearCache() удаляет:
SF_PLUGIN_LIST-*;SF_SMART_LIST-*;SF_MISSING_PLUGINS.
Версии могут приходить из:
- параметров loader;
- сборочных констант;
SF_BOOT_CONFIG;- глобальных
SF_CACHE_VERSIONиSF_PLUGIN_LIST_VERSION.
Версионирование URL ассетов
Версия кэша также используется при подключении JS/CSS. Перед вставкой <script> или <link> loader добавляет к URL
параметр sf_v:
/component/dropdown/js/dropdown.js?sf_v=<version>
Если параметр уже есть, он обновляется. Для data:, blob: и javascript: URL версия не добавляется.
Предзагруженные модули
Если на странице есть window.SF_PRELOADED, loader использует его как уже подготовленное состояние:
window.SF_PRELOADED = {
modules: ['dropdown', 'icons'],
loadedPlugins: {
dropdown: { js: true, css: true }
}
};
В этом случае loader переносит модули в this.module, обновляет loadedPlugins и может сразу отправить
sf-loader-ready, если уже есть загруженные модули.
Очистка кэша
Принудительно очистить frontend-кэш можно через URL:
?loader_clear=Y
Или из консоли:
SF.Loader.clearCache();
Для полной очистки всех SF-ключей используется:
SF.Loader.clearAllSfCache();
clearCache() удаляет только loader cache, Smart cache и missing files. clearAllSfCache() удаляет все ключи
localStorage, начинающиеся с SF_.
Что кэш не гарантирует
Кэш loader-а ускоряет восстановление состояния, но не означает, что сеть совсем не используется:
- JS/CSS файлы не лежат внутри
SF_PLUGIN_LIST-*; - серверный режим всё равно может обращаться к
/simai/loader/loader.php; - browser HTTP cache отвечает за повторное получение самих ассетов;
- изменение
cacheVersionилиpluginListVersionинвалидирует старые записи; - динамически добавленные DOM-элементы могут расширить список модулей после первичной загрузки.