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
。
我最近将我的应用程序从 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
。