Rails 7中用Importmap整合Stimulus JS时控制器自动加载失败求助
解决Rails 7 Importmap + Stimulus的
exports is not defined错误 核心问题
Failed to autoload controller: flash ReferenceError: exports is not defined这个错误的根源是你的flash_controller.js使用了CommonJS模块语法(比如module.exports),但Rails 7的Importmap和Stimulus默认采用**ES模块(ESM)**规范,浏览器无法识别CommonJS的exports变量。
修复步骤
修正控制器的导出语法
打开app/javascript/controllers/flash_controller.js,将CommonJS写法替换为ES模块的默认导出:// 正确的ES模块写法 import { Controller } from "@hotwired/stimulus" export default class extends Controller { // 控制器逻辑示例 connect() { console.log("Flash控制器已连接") } }避免使用以下错误的CommonJS写法:
// 错误写法(会触发exports未定义) import { Controller } from "@hotwired/stimulus" module.exports = class extends Controller { // ... }验证Importmap配置
你的config/importmap.rb配置是正常的,pin_all_from 'app/javascript/controllers', under: 'controllers'会自动将所有控制器映射为合法的ES模块路径,无需额外调整。清理缓存并重启服务
执行命令清理资产缓存,确保修改生效:bin/rails assets:clobber bin/rails server生产环境需额外执行
bin/rails assets:precompile。
额外排查点
- 如果问题仍存在,检查其他控制器(如
shopify_controller.js)是否也使用了CommonJS语法; - 确认控制器中没有引入非ES模块的第三方依赖,若有需在
importmap.rb中指定正确的ESM入口地址。
内容的提问来源于stack exchange,提问作者rony36
相关产品推荐
相关产品推荐

