Stimulus — это минималистичный JavaScript-фреймворк, ориентированный на улучшение HTML через поведение, а не полную замену фронтенд-архитектуры. Эффективная работа с ним требует правильно настроенной среды разработки и инструментов отладки.
Stimulus можно подключать несколькими способами: через пакетный менеджер или напрямую через CDN. Наиболее современный подход — использование npm или Yarn в сочетании с современным бандлером (Webpack, Vite, Parcel).
Через npm:
npm install @hotwired/stimulus
Инициализация приложения Stimulus в проекте:
import { Application } from "@hotwired/stimulus"
import ExampleController from "./controllers/example_controller"
const application = Application.start()
application.register("example", ExampleController)
Ключевой момент: каждый контроллер регистрируется по уникальному
идентификатору, соответствующему атрибуту data-controller в
HTML.
Подключение через CDN (для быстрых прототипов):
<script src="https://unpkg.com/@hotwired/stimulus/dist/stimulus.umd.js"></script>
<script>
const application = Stimulus.Application.start()
</script>
Этот способ удобен для экспериментов, но для крупных проектов предпочтительнее npm-подход, так как он обеспечивает совместимость с бандлерами и модульной системой.
Рекомендуемая структура контроллеров и подключаемых скриптов:
/app
/javascript
/controllers
example_controller.js
application.js
application.js — точка входа, где инициализируется
Stimulus и регистрируются все контроллеры. Контроллеры должны содержать
строго одну ответственность, что упрощает поддержку и тестирование.
Для полноценной разработки важно настроить горячую перезагрузку и Source Maps.
Пример настройки Webpack:
module.exports = {
mode: 'development',
devtool: 'inline-source-map',
entry: './app/javascript/application.js',
output: {
filename: 'bundle.js',
path: __dirname + '/public/packs'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
}
Source Maps позволяют отслеживать исходный код при отладке в браузере, что особенно полезно при сложных контроллерах Stimulus.
Vite упрощает процесс настройки:
import { defineConfig } from 'vite'
export default defineConfig({
root: 'app/javascript',
build: {
outDir: '../. ./public/packs',
sourcemap: true
}
})
Vite обеспечивает быструю перезагрузку при изменении файлов и корректно работает с модульной системой ES.
Stimulus интегрируется с DevTools браузера напрямую, благодаря чему можно:
console.log,
debugger);this.element,
this.targets);connect,
disconnect, initialize).Для удобства можно включить debug-режим Stimulus:
import { Application } from "@hotwired/stimulus"
import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers"
const application = Application.start()
application.debug = true
const context = require.context("./controllers", true, /\.js$/)
application.load(definitionsFromContext(context))
В этом режиме все вызовы контроллеров и события будут логироваться в консоли, что позволяет точно определить порядок их срабатывания.
Stimulus хорошо сочетается с тестовыми фреймворками:
Пример теста контроллера с Jest:
import { Application } from "@hotwired/stimulus"
import ExampleController from "../example_controller"
document.body.innerHTML = `<div data-controller="example"></div>`
const application = Application.start()
application.register("example", ExampleController)
const element = document.querySelector("[data-controller='example']")
expect(element).not.toBeNull()
console.log или debugger прямо в
методы контроллера.document.addEventListener("DOMContentLoaded", async () => {
const { default: ExampleController } = await import("./controllers/example_controller")
application.register("example", ExampleController)
})
data-action.Эта конфигурация позволяет создать мощную, масштабируемую среду разработки Stimulus, где контроллеры легко тестируются, отлаживаются и поддерживаются без излишней сложности.