我无法获取激励和导入映射来从应用程序引擎读取文件。 我目前要做的项目涉及升级所有旧版引擎以使用导入映射和刺激 JS。 该文档有点误导,因为它不按照任何文档规定的使用方式工作。
注意 :: 我没有选择应用程序结构,我正在处理给定的内容,这不是我决定当前结构正确或不正确的地方,所以请假设这是我唯一的结构选择.
主应用程序(Rails ==> gem 'Engine 1'、gem 'Engine 2')仅作为嵌套 Rails 应用程序工作。
-- 发动机 1
-- 引擎 2
-- 3号引擎
<%= javascript_importmap_tags %>
时,正在加载主要应用程序控件,但没有引擎 JavaScript 控制器。文档说它需要一个导入映射并且需要自己的清单等。//= link_tree ../../images/appetite
//= link_directory ../../stylesheets/appetite .css
//= link_directory ../../stylesheets/appetite .scss
//= link_tree ../../../javascript
pin_all_from "app/javascript/controllers", under: "controllers/myengine"
# engines/appetite/lib/appetite/engine.rb
module MyEngine
class Engine < ::Rails::Engine
isolate_namespace MyEngine
initializer :importmap, before: :importmap do |app|
app.config.importmap.paths << root.join('config/importmap.rb')
end
end
end
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
connect() {
console.log("Example controller connected");
}
}
这通常会导致崩溃,提示我们需要将其设为路径,但是如果导入映射工作正常,则不会这样说。
import "controllers/myengine"
控制器内的预加载也不起作用
eagerLoadControllersFrom("controllers/myengine", application);
我已经尝试了很多步骤,甚至尝试只是从主应用程序链接固定文件,但似乎没有任何效果。 任何想法和帮助将不胜感激。
发动机配置中缺少一些东西;
module MyEngine
class Engine < ::Rails::Engine
isolate_namespace MyEngine
initializer :importmap, before: "importmap" do |app|
# https://github.com/rails/importmap-rails#composing-import-maps
app.config.importmap.paths << root.join("config/importmap.rb")
# https://github.com/rails/importmap-rails#sweeping-the-cache-in-development-and-test
app.config.importmap.cache_sweepers << root.join("app/javascript")
end
initializer "my_engine.assets" do |app|
# my_engin/app/javascript needs to be in the asset path
app.config.assets.paths << root.join("app/javascript")
# manifest has to be precompiled
app.config.assets.precompile += %w[myengine/manifest.js]
end
end
end
修复引擎的导入映射:
pin_all_from MyEngine::Engine.root.join("app/javascript/controllers"), under: "controllers"
第一个参数必须是绝对路径,否则假设相对于
Rails.root
。 :under
选项是相对于myengine/app/javascript
(资产路径)的。
清单:
//= link_tree ../../../javascript
控制器位于
my_engine/app/javascript/controllers/example_controller.js
测试:
$ bin/importmap json
{
"imports": {
"application": "/assets/application-b1b2b9a824f2a0f16175e1498e5f1ddf1a923fde046d6832e2e0a9526545ab04.js",
"@hotwired/turbo-rails": "/assets/turbo.min-cd3ce4205eaa3eb1f80c30fedaf47bccb15a7668eb53b1cb1a5e0dda16009d4d.js",
"@hotwired/stimulus": "/assets/stimulus.min-dd364f16ec9504dfb72672295637a1c8838773b01c0b441bd41008124c407894.js",
"@hotwired/stimulus-loading": "/assets/stimulus-loading-3576ce92b149ad5d6959438c6f291e2426c86df3b874c525b30faad51b0d96b3.js",
"controllers/example_controller": "/assets/controllers/example_controller-66b44365679431ba15f4a290f152a294517a1be03220a946ed215a6601e33a5e.js",
"controllers/application": "/assets/controllers/application-368d98631bccbf2349e0d4f8269afb3fe9625118341966de054759d96ea86c7e.js",
"controllers": "/assets/controllers/index-2db729dddcc5b979110e98de4b6720f83f91a123172e87281d5a58410fc43806.js"
}
}