Rails 7:加载所有 Stimulus 控制器

Rails 7: Loading all Stimulus controllers

我最近将我的应用程序从 Rails 6 升级到 Rails 7,但是一些项目似乎随着从 javascript/controllers.[=19 加载 Stimulus 控制器的方式发生了变化=]

I Rails 6 我能够从 javascript/controllers 目录中的 index.js 文件执行此操作:

const context = require.context("controllers", true, /_controller\.js$/)
application.load(definitionsFromContext(context))

但是在 Rails 7 中这会引发(在我的浏览器 js 控制台中):

Uncaught TypeError: __require.context is not a function

所以我一直在为我的每个 Stimulus 控制器调用它:

import FooBarController from "./foo_bar_controller"
application.register("foo_bar_controller", FooBarController)

在 Rails 7 中导入和注册所有 Stimulus 控制器的正确方法是什么?我在文档中找不到关于此的任何详细信息。

更新:

我 运行 stimulus:install rake 任务,它确实改变了我以前不正确的一些文件。但是现在当我构建应用程序时,我得到了这个:

✘ [ERROR] Could not resolve "controllers/application"
    app/javascript/controllers/index.js:3:28:
      3 │ import { application } from "controllers/application"
        ╵                             ~~~~~~~~~~~~~~~~~~~~~~~~~
  You can mark the path "controllers/application" as external to exclude it from the bundle, which will remove this error.
✘ [ERROR] Could not resolve "@hotwired/stimulus-loading"
    app/javascript/controllers/index.js:6:41:
      6 │ import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
        ╵                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  You can mark the path "@hotwired/stimulus-loading" as external to exclude it from the bundle, which will remove this error.

这也是我 importmap.rb 文件中的内容:

pin "application", preload: true
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
pin_all_from "app/javascript/controllers", under: "controllers"

这取决于您当前使用的 JavaScript bundler/builder。

Stimulus Handbook 解释了 Rails 中安装和自动加载控制器的不同方法。

require.context 只能通过 webpack 获得。这已在 Rails 7 中替换为 Hotwire+Stimulus(以及可选的 importmap)。

听起来您目前正在使用 esbuild,因此您应该能够使用命令 rails stimulus:manifest:update.

更新 index.js 控制器导入

这可能需要您先 运行 rails stimulus:install