Stimulus — это минималистичный JavaScript-фреймворк, разработанный для улучшения пользовательского интерфейса без радикального изменения структуры HTML. Основная философия Stimulus строится на концепции прогрессивного улучшения: веб-страница работает в базовом виде без JavaScript, а фреймворк добавляет интерактивность там, где это необходимо.
Stimulus ориентирован на связку HTML и контроллеров. Контроллер — это класс JavaScript, который управляет поведением одного или нескольких элементов DOM. Связь между HTML и контроллером осуществляется через data-атрибуты:
<div data-controller="hello">
<button data-action="click->hello#greet">Say Hello</button>
</div>
data-controller="hello" подключает контроллер с именем
hello.data-action="click->hello#greet" задает действие:
при клике вызывается метод greet контроллера
hello.Контроллер — это обычный класс, наследуемый от
Stimulus.Controller. Он имеет жизненный
цикл, позволяющий реагировать на события DOM:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["name"];
connect() {
console.log("Контроллер подключен");
}
greet() {
const element = this.nameTarget;
alert(`Hello, ${element.value}!`);
}
}
connect(), можно использовать для начальной настройки.Data-атрибуты в Stimulus выполняют несколько ключевых функций:
data-controller="имя"data-action="событие->контроллер#метод"data-имя-target="имя"data-имя-value="значение"Пример использования значений:
<div data-controller="counter" data-counter-count-value="0">
<button data-action="click->counter#increment">Increment</button>
<span data-counter-target="output"></span>
</div>
export default class extends Controller {
static targets = ["output"];
static values = { count: Number };
connect() {
this.updateOutput();
}
increment() {
this.countValue++;
this.updateOutput();
}
updateOutput() {
this.outputTarget.textContent = this.countValue;
}
}
countValue автоматически синхронизируется с
data-counter-count-value.Stimulus использует декларативную модель событий,
которая позволяет избежать прямого добавления слушателей через
addEventListener. Синтаксис
событие->контроллер#метод облегчает отслеживание
интерактивных элементов на странице. Можно задавать множественные
действия через пробел:
<button data-action="click->controller#method1 click->controller#method2"></button>
Главная сила Stimulus заключается в том, что страница остаётся функциональной без JavaScript. Например, форма может отправляться обычным POST-запросом, а контроллер добавляет динамическую проверку и интерактивные подсказки:
<form data-controller="form-validation">
<input type="text" name="email" required>
<button type="submit">Submit</button>
</form>
Контроллер может проверять введённые данные и добавлять подсказки пользователю, но даже при отключенном JS форма остаётся рабочей. Такой подход повышает доступность, производительность и надёжность.
Stimulus поддерживает модульную архитектуру:
Stimulus легко интегрируется с серверными фреймворками и современными сборщиками:
import { Application } from "@hotwired/stimulus";
import HelloController from "./controllers/hello_controller";
const application = Application.start();
application.register("hello", HelloController);
Это обеспечивает гибкость в динамическом добавлении интерактивности и позволяет прогрессивно расширять функционал без кардинальных изменений HTML или серверной логики.
Stimulus реализует минималистичное, но мощное управление интерактивностью, придерживаясь принципа прогрессивного улучшения:
Stimulus обеспечивает плавный путь от статического HTML к богатым интерфейсам, сохраняя при этом простоту и стабильность кода.