Stimulus — это легковесный JavaScript-фреймворк, ориентированный на
улучшение HTML за счет добавления интерактивности без кардинальной
перестройки структуры приложения. Он строится вокруг
контроллеров, которые связывают элементы DOM с
поведением через атрибуты data-*. Контроллеры в Stimulus
обеспечивают реактивность, но не заменяют полноценную архитектуру SPA, а
служат для постепенного добавления динамики на страницах.
Каждый контроллер имеет жизненный цикл с методами
connect, disconnect и initialize,
что позволяет точно контролировать момент привязки логики к DOM. Связь
контроллера с HTML происходит через data-controller, а
динамическое управление свойствами и действиями — через
data-action и data-target.
Контроллер в Stimulus создается как класс, наследуемый от
Controller. Основные моменты:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["name", "output"]
greet() {
this.outputTarget.textContent = `Привет, ${this.nameTarget.value}!`
}
}
Использование Targets уменьшает количество прямых
querySelector и повышает производительность за счет
кэширования ссылок на элементы.
Actions связывают события с методами
контроллера. Атрибут
data-action="event->controller#method" регистрирует
слушатель на нужное событие. Stimulus автоматически управляет
добавлением и удалением этих слушателей при подключении и отключении
контроллера.
Stimulus отличается небольшим размером и минимальными накладными расходами на обработку DOM. Основные показатели, влияющие на производительность:
Инициализация контроллеров
connect всех контроллеров.Обработка событий
data-action создает виртуальное связывание с
методом контроллера, без явного навешивания отдельных обработчиков на
каждый элемент.Доступ к Targets
this.targetNameTarget не вызывают повторный
querySelector.DOM-модификации
application.load() или
динамического подключения контроллеров.Минимизация количества Targets и Actions
Lazy-load контроллеров
import { Application } from "@hotwired/stimulus"
const application = Application.start()
document.addEventListener("turbo:load", async () => {
if (document.querySelector("[data-controller='comments']")) {
const { default: CommentsController } = await import("./controllers/comments_controller")
application.register("comments", CommentsController)
}
})
Контроллеры только для интерактивных блоков
Использование disconnect
disconnect, что позволяет очищать
таймеры, слушатели и кэш Targets.Для измерения производительности можно использовать:
connect, disconnect и обработку
событий.performance.mark("controller-connect-start")
this.connect()
performance.mark("controller-connect-end")
performance.measure("connect-duration", "controller-connect-start", "controller-connect-end")
Количество контроллеров на странице — прямой индикатор потенциальной нагрузки на DOM.
Частота событий — важно оценивать, как часто вызываются методы контроллера при быстром взаимодействии пользователя (например, ввод текста, прокрутка).
Stimulus хорошо масштабируется для страниц с умеренным количеством интерактивных элементов. Основные рекомендации:
Эти подходы снижают время инициализации, уменьшают накладные расходы на обработку событий и ускоряют работу интерфейса в целом.
Stimulus сочетает простоту и эффективность: правильно спроектированные контроллеры и Targets позволяют поддерживать производительность даже на страницах с сотнями интерактивных элементов.