home chevron_right
Загрузчик chevron_right
Фронтенд chevron_right
Кэширование

1.4 Кэширование и ускорение загрузкиlink

SFLoaderPlugin использует несколько уровней кэша, чтобы быстрее восстанавливать список нужных модулей, не повторять заведомо неудачные загрузки и переиспользовать данные Smart-компонентов. Основное хранилище на frontend — браузерный localStorage.

Важно различать два вида кэша:

  • кэш loader-а в localStorage, где хранятся списки модулей, Smart-шаблоны и missing state;
  • HTTP-кэш браузера для уже загруженных JS/CSS файлов.

SF_PLUGIN_LIST-* не хранит сами JS/CSS файлы. Он хранит список модулей, которые loader должен считать нужными для страницы.

Основные ключиlink

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 hashlink

pageHash нужен, чтобы разделять кэш между страницами. Loader берёт текущий URL без query-параметров. Для динамических страниц он может отбросить последний сегмент пути, чтобы страницы одного типа использовали общий ключ. После этого URL хэшируется через md5() и обрезается до 16 символов.

Упрощённо:

const pageHash = md5(pageUrl).substring(0, 16);

Итоговый ключ:

SF_PLUGIN_LIST-<pageHash>

Если в окружении есть window.BUNDLE_ID, loader может использовать его как fallback-ключ для списка модулей.

Кэш списка модулейlink

При запуске загрузки loader сохраняет текущий this.module:

localStorage.setItem(
  `SF_PLUGIN_LIST-${pageHash}`,
  compressToUTF16(JSON.stringify(this.module))
);

this.module содержит имена модулей, которые были найдены через discovery и relations. Это не обязательно список уже успешно подключенных файлов. Он отражает, какие модули нужны странице.

При следующем открытии страницы loader:

  1. Читает SF_PLUGIN_LIST-<pageHash>.
  2. Распаковывает список через decompressFromUTF16().
  3. Восстанавливает this.module.
  4. Сразу запускает getLoader() по кэшированному списку.

В standAlone-режиме это позволяет не ждать полного повторного discovery перед стартом загрузки. При этом сами JS/CSS файлы всё равно должны быть доступны: они могут прийти из HTTP-кэша браузера или быть подключены повторно, если их ещё нет на странице.

Кэш Smart-шаблоновlink

Smart-данные сохраняются отдельно:

SF_SMART_LIST-<pageHash>

Внутри хранится сжатый JSON:

{
  templates,
  cache
}

При старте loader читает этот ключ и помещает данные во внутренний smartCache. Это позволяет Smart runtime использовать ранее полученные шаблоны и fake-content без лишнего обращения к серверу, если кэш всё ещё валиден.

Missing files cachelink

Если 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.

Версии кэшаlink

Loader поддерживает две версии:

cacheVersionlink

Используется для общего сброса SF-кэша. Если текущая версия отличается от сохранённой в SF_CACHE_VERSION, loader очищает все ключи, начинающиеся с SF_, и сохраняет новую версию.

Если cacheVersion не задан, loader тоже очищает общий SF-кэш, чтобы не держать потенциально устаревшие данные.

pluginListVersionlink

Используется для более узкого сброса списков модулей, 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 ассетовlink

Версия кэша также используется при подключении JS/CSS. Перед вставкой <script> или <link> loader добавляет к URL параметр sf_v:

/component/dropdown/js/dropdown.js?sf_v=<version>

Если параметр уже есть, он обновляется. Для data:, blob: и javascript: URL версия не добавляется.

Предзагруженные модулиlink

Если на странице есть window.SF_PRELOADED, loader использует его как уже подготовленное состояние:

window.SF_PRELOADED = {
  modules: ['dropdown', 'icons'],
  loadedPlugins: {
    dropdown: { js: true, css: true }
  }
};

В этом случае loader переносит модули в this.module, обновляет loadedPlugins и может сразу отправить sf-loader-ready, если уже есть загруженные модули.

Очистка кэшаlink

Принудительно очистить frontend-кэш можно через URL:

?loader_clear=Y

Или из консоли:

SF.Loader.clearCache();

Для полной очистки всех SF-ключей используется:

SF.Loader.clearAllSfCache();

clearCache() удаляет только loader cache, Smart cache и missing files. clearAllSfCache() удаляет все ключи localStorage, начинающиеся с SF_.

Что кэш не гарантируетlink

Кэш loader-а ускоряет восстановление состояния, но не означает, что сеть совсем не используется:

  • JS/CSS файлы не лежат внутри SF_PLUGIN_LIST-*;
  • серверный режим всё равно может обращаться к /simai/loader/loader.php;
  • browser HTTP cache отвечает за повторное получение самих ассетов;
  • изменение cacheVersion или pluginListVersion инвалидирует старые записи;
  • динамически добавленные DOM-элементы могут расширить список модулей после первичной загрузки.