Я не могу получить стимул и карты импорта для чтения файлов из движка приложения. Текущий проект, который мне поручили, включает в себя обновление всех устаревших движков для использования карт импорта и стимулирующего 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.info("Example controller connected");
}
}
Обычно это вызывает сбой, в котором говорится, что нам нужно указать путь, однако, если бы карта импорта работала правильно, этого не было бы.
import "controllers/myengine"
Нетерпеливая загрузка внутри контроллера тоже не работает
eagerLoadControllersFrom("controllers/myengine", application);
Я пробовал много промежуточных шагов и даже пытался просто связать и закрепить файлы из основного приложения, но, похоже, ничего не работает. Любые идеи и помощь будут оценены по достоинству.
В конфигурации двигателя не хватает нескольких вещей;
module MyEngine
class Engine < ::Rails::Engine
isolate_namespace MyEngine
# `before:` option has to be a string as it has to match
# a named initializer exaclty as a String or a Symbol
# "importmap" is a string, you can see this list to check
# the order of initializers:
# Rails.application.initializers.tsort.map(&:name)
initializer "my_engine.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_engine/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"
}
}
@DavidJ.Davis из основного приложения
Эй, спасибо. Кажется, это работает!
Где мы запускаем команду
bin/importmap json
? Похоже, что движок не имеет понятия о bin-файле.