Stimulus — это лёгкий JavaScript-фреймворк, ориентированный на улучшение HTML через декларативные контроллеры. Основная цель интеграции с существующими проектами заключается в минимизации изменений в уже существующем коде, добавлении интерактивности без полной перестройки архитектуры и сохранении совместимости с текущими библиотеками и шаблонами.
Stimulus может быть добавлен в проект через npm, Yarn или напрямую через CDN. Для существующего проекта на Rails, Django или любом другом серверном фреймворке, минимальная установка через CDN выглядит следующим образом:
<script src="https://unpkg.com/@hotwired/stimulus/dist/stimulus.umd.js"></script>
<script>
const application = Stimulus.Application.start()
</script>
Для npm-проекта рекомендуется структура:
npm install @hotwired/stimulus
И инициализация в основном JavaScript-файле:
import { Application } from "@hotwired/stimulus"
const application = Application.start()
Контроллеры Stimulus хранятся в отдельных файлах и регистрируются
через application.register. Рекомендуемая структура для
существующего проекта:
/js/controllers/
hello_controller.js
dropdown_controller.js
modal_controller.js
Пример простого контроллера:
// hello_controller.js
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["name"]
greet() {
console.log(`Hello, ${this.nameTarget.value}!`)
}
}
Регистрация контроллера:
import HelloController from "./controllers/hello_controller"
application.register("hello", HelloController)
Stimulus работает через data- атрибуты, что позволяет
добавлять интерактивность без изменения существующей структуры DOM.
Пример:
<div data-controller="hello">
<input data-hello-target="name" type="text">
<button data-action="click->hello#greet">Приветствовать</button>
</div>
Ключевые моменты:
data-controller определяет контроллер для
элемента.data-<controller>-target определяет цель внутри
контроллера.data-action связывает событие DOM с методом
контроллера.Stimulus особенно удобен для постепенного внедрения в большие проекты:
Пример постепенного внедрения в существующий проект:
<!-- До Stimulus -->
<button id="old-button">Click</button>
<script>
document.getElementById("old-button").addEventListener("click", () => {
alert("Clicked!")
})
</script>
<!-- После внедрения Stimulus -->
<div data-controller="alert">
<button data-action="click->alert#show">Click</button>
</div>
// alert_controller.js
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
show() {
alert("Clicked!")
}
}
Stimulus отслеживает только существующие в DOM элементы при
инициализации. Для динамически добавляемых элементов необходимо
использовать MutationObserver или инициировать контроллер
вручную:
const newElement = document.createElement("div")
newElement.innerHTML = `<div data-controller="hello">
<input data-hello-target="name">
<button data-action="click->hello#greet">Привет</button>
</div>`
document.body.appendChild(newElement)
application.load(newElement) // Обновление Stimulus для нового элемента
Stimulus спроектирован так, чтобы сосуществовать с любыми библиотеками JavaScript. При интеграции:
data- атрибутов с другими
фреймворками.disconnect() метод контроллеров для
очистки событий при удалении элементов.Для крупных проектов рекомендуется выделять отдельную директорию для контроллеров и поддерживать строгую организацию:
/assets
/js
/controllers
index.js // регистрация всех контроллеров
/components
modal_controller.js
dropdown_controller.js
index.js автоматически регистрирует все контроллеры:
import { Application } from "@hotwired/stimulus"
const application = Application.start()
const context = require.context("./components", true, /_controller\.js$/)
context.keys().forEach((filename) => {
const controller = context(filename).default
const name = filename.replace(/^.*\/(.*)_controller\.js$/, "$1")
application.register(name, controller)
})
data-
атрибутами.Stimulus позволяет плавно и безопасно добавлять интерактивность к существующим проектам, сохраняя структуру HTML и совместимость с другими библиотеками, что делает его идеальным инструментом для постепенной модернизации фронтенда.