Stimulus — это легковесный JavaScript-фреймворк, который обеспечивает структурирование поведения веб-приложений через контроллеры. Для эффективного использования Stimulus важно правильно настроить сборку проекта, будь то с Webpack, Vite или другими сборщиками модулей.
Первым шагом является установка Stimulus как зависимости проекта:
npm install @hotwired/stimulus
После установки пакет становится доступным для импорта в
JavaScript-файлах проекта. Для проектов с Webpack обычно создают файл
index.js или application.js, где
инициализируется Stimulus:
import { Application } from "@hotwired/stimulus";
import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers";
const application = Application.start();
const context = require.context("./controllers", true, /\.js$/);
application.load(definitionsFromContext(context));
Здесь используется require.context для
автоматического подключения всех контроллеров, расположенных в папке
controllers.
Контроллеры Stimulus организуются в отдельной директории, обычно
controllers. Каждому контроллеру соответствует отдельный
файл, имя которого совпадает с именем контроллера:
controllers/
├── hello_controller.js
├── modal_controller.js
└── tabs_controller.js
Пример базового контроллера:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["output"];
connect() {
this.outputTarget.textContent = "Stimulus контроллер подключен!";
}
greet() {
alert("Привет от Stimulus!");
}
}
Ключевые моменты:
static targets — декларация элементов DOM, на которые
контроллер будет ссылаться.connect() — метод, вызываемый при подключении
контроллера к DOM.data-action.Для проектов на Webpack важно правильно настроить обработку
JavaScript и папки с контроллерами. Стандартный
webpack.config.js может выглядеть так:
const path = require('path');
module.exports = {
entry: './app/javascript/application.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'public/packs'),
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
},
resolve: {
extensions: ['.js']
}
};
Особенности:
babel-loader обеспечивает совместимость с
современным JavaScript.require.context позволяет динамически подгружать новые
файлы без изменений в конфигурации Webpack.public/packs может быть интегрирована в шаблоны
HTML или Rails-приложения.Stimulus также легко интегрируется с Vite. Для этого создают файл
main.js:
import { Application } from "@hotwired/stimulus";
import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers";
const application = Application.start();
const context = import.meta.glob("./controllers/**/*.js", { eager: true });
Object.values(context).forEach(module => application.load(module));
Отличия от Webpack:
require.context используется
import.meta.glob, поддерживаемый Vite и современными
сборщиками.{ eager: true } позволяет сразу загрузить все
модули.Stimulus может подключаться не только через npm, но и через CDN:
<script src="https://unpkg.com/@hotwired/stimulus/dist/stimulus.umd.js"></script>
<script>
const application = Stimulus.Application.start();
</script>
Такой подход удобен для небольших проектов, где нет необходимости в
сборке модулей, но требует явного подключения всех контроллеров через
<script> или import.
В Rails-проектах Stimulus интегрируется через Webpacker или jsbundling-rails. Стандартная структура:
app/javascript/controllers/
app/javascript/application.js
Инициализация в application.js выглядит аналогично:
import { Application } from "@hotwired/stimulus";
import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers";
const application = Application.start();
const context = require.context("./controllers", true, /\.js$/);
application.load(definitionsFromContext(context));
Rails автоматически компилирует ассеты и подключает
bundle.js в шаблонах через
javascript_pack_tag.
Stimulus с современными сборщиками обеспечивает чистую архитектуру контроллеров, быструю загрузку и простую поддержку динамической логики интерфейса. Правильная настройка Webpack, Vite или аналогичных инструментов является ключевым моментом в организации масштабируемого проекта.