You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 7以esbuild为JS打包器时如何自动加载Stimulus控制器文件

esbuild环境下Rails 7实现Stimulus控制器自动加载方案

完全可以实现,不需要手动逐个注册控制器,借助esbuild原生支持的import.meta.glob批量导入能力即可完成配置,整体实现和官方importmap、Webpacker场景的自动加载行为完全一致,无额外第三方依赖。

具体配置步骤

  • 编写控制器统一加载入口
    在app/javascript/controllers/index.js中写入以下代码:
// app/javascript/controllers/index.js
import { Application } from "@hotwired/stimulus"

const application = Application.start()

// 递归匹配controllers目录下所有符合*_controller.js命名规则的文件,eager模式表示构建时直接打包引入
const controllerModules = import.meta.glob("./**/*_controller.js", { eager: true })

Object.entries(controllerModules).forEach(([filePath, module]) => {
  // 按照Stimulus官方命名规则转换控制器注册名
  const controllerName = filePath
    .replace(/^\.\//, "") // 移除路径开头的./
    .replace(/_controller\.js$/, "") // 移除_controller.js后缀
    .replace(/\//g, "--") // 子目录分隔符替换为--
    .replace(/_/g, "-") // 文件名内的下划线替换为横杠

  application.register(controllerName, module.default)
})

window.Stimulus = application
export { application }
  • 在应用入口引入加载逻辑
    在JS打包入口文件app/javascript/application.js中引入上述控制器入口文件即可:
// app/javascript/application.js
// 保留你原有的其他导入配置,比如@hotwired/turbo-rails等
import "./controllers"

匹配规则说明

配置完成后,控制器文件和注册名的映射关系和官方自动加载规则完全对齐:

  • 根目录下的hello_controller.js注册为hello
  • 子目录下的users/avatar_controller.js注册为users--avatar
  • 文件名含下划线的clipboard_copy_controller.js注册为clipboard-copy

方案说明

  • 该实现完全基于esbuild原生API,不需要安装额外的NPM包,构建性能无额外损耗
  • 新增控制器时只需要按照命名规范放入对应目录,构建时会被自动识别加载,不需要手动修改注册代码
  • 如果使用TypeScript编写控制器,只需要将glob匹配规则修改为./**/*_controller.ts即可,其余逻辑无需调整
  • 之前importmap场景使用的@hotwired/stimulus-loading、Webpack场景使用的@hotwired/stimulus-webpack-helpers本质都是对应打包工具下的批量模块加载封装,当前方案和二者实现的功能完全对等。

内容的提问来源于stack exchange,提问作者Yurii Stefaniuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:30:54