I'm trying to configure Rails 7 app to load all js Stimulus controllers automatically.
I use esbuild
as JavaScript bundler.
If we're using Stimulus for Rails together with an import map, the integration will automatically load all controller files from app/javascript/controllers
.
// app/javascript/controllers/index.js
import { application } from "controllers/application"
import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
eagerLoadControllersFrom("controllers", application)
This @hotwired/stimulus-loading
package comes from importmap
# config/importmap.rb
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
But it looks like @hotwired/stimulus-loading
has not been published to NPM yet and is meant to be used only with importmaps
in Rails.
When we're using Webpacker as JavaScript bundler we can use @hotwired/stimulus-webpack-helpers
package to get the same form of autoloading behavior.
// app/javascript/application.js
import { Application } from "@hotwired/stimulus"
import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers"
window.Stimulus = Application.start()
const context = require.context("./controllers", true, /\.js$/)
Stimulus.load(definitionsFromContext(context))
But when we're using esbuild
JavaScript bundler on the official Stimulus page recommended to import each controller individually.
Stimulus works with other build systems too, but without support for controller autoloading. Instead, you must explicitly load and register controller files with your application instance:
// app/javascript/application.js
import { Application } from "@hotwired/stimulus"
import HelloController from "./controllers/hello_controller"
import ClipboardController from "./controllers/clipboard_controller"
window.Stimulus = Application.start()
Stimulus.register("hello", HelloController)
Stimulus.register("clipboard", ClipboardController)
So my question is:
Is it possible to configure Rails 7 with esbuild
as JavaScript bundler to load all js Stimulus controller files from app/javascript/controllers
automatically?