Stimulus представляет собой легковесный фреймворк для управления поведением HTML с помощью контроллеров, обеспечивая динамику страниц без полной перезагрузки. Одним из важных аспектов при работе с динамическими веб-приложениями является кэширование стратегии, позволяющее повысить производительность и снизить количество повторных вычислений или загрузок данных.
Кэширование в контексте Stimulus часто связано с хранением состояния контроллеров, DOM-элементов и данных, полученных через AJAX-запросы или другие асинхронные источники. Оно позволяет повторно использовать уже вычисленные значения без необходимости повторного обращения к источнику.
Ключевые концепции кэширования в Stimulus:
Одной из самых частых стратегий является кэширование ссылок на
DOM-элементы с помощью this.targets или локальных свойств
контроллера:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["output"];
connect() {
// Кэширование ссылки на элемент
this.cachedOutput = this.outputTarget;
}
updateContent(text) {
// Используем кэшированную ссылку вместо поиска в DOM
this.cachedOutput.textContent = text;
}
}
Преимущества:
querySelector или
getElementById.В приложениях, где контроллеры получают данные с сервера, важна стратегия хранения этих данных, чтобы избежать повторных запросов:
export default class extends Controller {
static values = { dataUrl: String }
async fetchData() {
if (!this._cachedData) {
const response = await fetch(this.dataUrlValue);
this._cachedData = await response.json();
}
return this._cachedData;
}
async renderData() {
const data = await this.fetchData();
console.log(data);
}
}
Ключевые моменты:
_cachedData для
хранения результата.Для более крупных приложений кэширование может быть многоуровневым:
export default class extends Controller {
async fetchData() {
const now = Date.now();
if (!this._cachedData || (now - this._cachedTime) > 60000) {
const response = await fetch(this.dataUrlValue);
this._cachedData = await response.json();
this._cachedTime = now;
}
return this._cachedData;
}
}
Особенности TTL:
Stimulus позволяет легко управлять событиями через
data-action. При активном кэшировании можно уменьшить
количество лишних подписок на события:
export default class extends Controller {
static targets = ["button"]
connect() {
this.cachedHandler = this.handleClick.bind(this);
this.buttonTarget.addEventListener("click", this.cachedHandler);
}
disconnect() {
this.buttonTarget.removeEventListener("click", this.cachedHandler);
}
handleClick() {
console.log("Кнопка нажата");
}
}
Преимущества:
connect и disconnect.Stimulus предоставляет механизм values, который
позволяет автоматически реагировать на изменения данных. Кэширование в
этом контексте позволяет хранить промежуточные вычисления для ускорения
реактивных обновлений:
export default class extends Controller {
static values = { items: Array }
get itemCount() {
if (!this._cachedCount) {
this._cachedCount = this.itemsValue.length;
}
return this._cachedCount;
}
itemsValueChanged() {
// Сброс кэша при изменении данных
this._cachedCount = null;
}
}
Особенности такого подхода:
Кэширование в Stimulus является универсальной стратегией оптимизации, применимой как к DOM-элементам, так и к данным и событиям. Оно позволяет создавать динамичные и отзывчивые интерфейсы без лишней нагрузки на браузер и сервер.