如何在 Rails 7 引擎中设置 importmap-rails?

2023-11-23

我在 importmap-rails gem github 存储库中提出了一个问题here关于这一点,但我想我会在这里提出这个问题,以防有人有解决方法

这是我迄今为止发现的

使用 Rails 7 alpha 2 或 Rails 7.0 生成的新引擎rails plugin new custom_page --mountable --full生成一个新引擎,其中包含捆绑的 gem 中的 importmap-rails gem,但无法使用它。添加spec.add_dependency 'importmap-rails'到 enginename.gemspec 没有区别,添加require importmap-rails到engine.rb。 bin 目录中没有 importmap 可执行文件。 致电bundle info importmap-rails产生一个有希望的结果,表明默认情况下安装了 gem

* importmap-rails (0.8.1)
    Summary: Use ESM with importmap to manage modern JavaScript in Rails without transpiling or bundling.
    Homepage: https://github.com/rails/importmap-rails
    Source Code: https://github.com/rails/importmap-rails
    Path: /home/jamie/.rvm/gems/ruby-3.0.0@custom_page/gems/importmap-rails-0.8.1

致电rails --tasks shows

rails app:importmap:install # Setup Importmap for the app

但我相信这是来自 --full 选项生成的测试应用程序,而不是可供引擎的 Rails 命令使用。 我期望在没有 app: 前缀的情况下看到相同的结果 对此任务的调用将解决模板错误,如图所示

rails app:importmap:install

不知道如何构建任务“app:template”(请参阅​​可用列表 任务与rails --tasks) 你的意思?应用程序:tmp:创建

如果有解决此问题的解决方案,我将很高兴听到它,并且我相信其他人也会这样做。我想要这个的原因是我完全未能在 Rails 6.1.4 引擎中引入 webpacker,我希望这将是我的、改进的解决方案

更新响应亚历克斯

Running bin/importmap json在引擎目录中导致

importmap-rails-1.2.1/lib/importmap/commands.rb:63:injson': undefined method join' for nil:NilClass (NoMethodError)

require Rails.root.join("config/environment")
                  ^^^^^
from /home/jamie/.rvm/gems/ruby-3.2.2@custom_page/gems/thor-1.2.2/lib/thor/command.rb:27:in `run'
from /home/jamie/.rvm/gems/ruby-3.2.2@custom_page/gems/thor-1.2.2/lib/thor/invocation.rb:127:in `invoke_command'
from /home/jamie/.rvm/gems/ruby-3.2.2@custom_page/gems/thor-1.2.2/lib/thor.rb:392:in `dispatch'
from /home/jamie/.rvm/gems/ruby-3.2.2@custom_page/gems/thor-1.2.2/lib/thor/base.rb:485:in `start'
from /home/jamie/.rvm/gems/ruby-3.2.2@custom_page/gems/importmap-rails-1.2.1/lib/importmap/commands.rb:147:in `<top (required)>'
from <internal:/home/jamie/.rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
from <internal:/home/jamie/.rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
from bin/importmap:24:in `<main>'

该引擎功能尚未出现在应用程序中

我的日志中没有 importmap 错误消息,搜索了“Importmap 跳过了丢失的路径”和“跳过”和“importmap”,最后一个确实抛出了早期错误的错误,但自从该错误得到解决后没有任何消息

我有一个标准的资产设置,我确实有一个更新 css 文件的功能,这可能就是您所想到的。

我没有已编译的资源,所有文件都以单数形式命名为 import 和 import.rb

我的application.js中的代码如下

// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails

我的清单

//= link_directory ../stylesheets/ccs_cms/custom_page .css
//= link_tree ../javascripts/ccs_cms/custom_page .js
//= link_tree ../javascripts/new_ckeditor
//= link ccs_cms/custom_page/jqtree.css
//= link ccs_cms/custom_page/public.css

我的 application.js 看起来像

// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails

//= require ccs_cms/custom_page/jquery-3.6.0.min
//= require ccs_cms/custom_page/jquery-ui.min
//= require ccs_cms/custom_page/tree.jquery
//= require ccs_cms/custom_page/sortable
//= require ccs_cms/custom_page/nested_fields/addFields
//= require_tree .

//require("./nested-forms/addFields");
//require("./nested-forms/removeFields");

// do some javascript
document.querySelector("h1").innerText = "Hi!, i'm your engine";
console.log("hi, again");

importmap.rb 包含以下内容

# my_engine/config/importmap.rb

# NOTE: this pin works because `my_engine/app/assets/javascripts
#       is in the `Rails.application.config.assets.paths`
pin "ccs_cms/custom_page/application"

头部生成如下

<script type="importmap" data-turbo-track="reload">{
  "imports": {
  }
}</script>

随着

<script type="module">import "application"</script>

<script type="module">import "ccs_cms/custom_page/application"</script>

进一步更新:我确实在控制台中看到了 hi Again 消息,所以console.log("hi, again");有效,但是document.querySelector("h1").innerText = "Hi!, i'm your engine";没有效果

最后,添加

  initializer :append_importmap_paths do |app|
    app.config.importmap.paths << root.join("config/importmap.rb")
  end

到engine.rb解决了拼图的最后一块


您不需要使用安装任务来设置导入映射。它所做的只是一些复制粘贴操作,无论如何它对引擎设置并没有真正的帮助。

将 importmaps 添加到引擎的 gemspec 文件中:

# my_engine/my_engine.gemspec

spec.add_dependency "importmap-rails"

Update 引擎.rb:

# my_engine/lib/my_engine/engine.rb

require "importmap-rails"

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine
    
    initializer "my-engine.importmap", before: "importmap" do |app|
      # NOTE: this will add pins from this engine to the main app
      # https://github.com/rails/importmap-rails#composing-import-maps
      app.config.importmap.paths << root.join("config/importmap.rb")

      # NOTE: something about cache; I did not look into it.
      # https://github.com/rails/importmap-rails#sweeping-the-cache-in-development-and-test
      app.config.importmap.cache_sweepers << root.join("app/assets/javascripts")
    end

    # NOTE: add engine manifest to precompile assets in production
    initializer "my-engine.assets" do |app|
      app.config.assets.precompile += %w[my_engine_manifest]
    end
  end
end

更新资产清单:

# my_engine/app/assets/config/my_engine_manifest.js

//= link_tree ../javascripts/my_engine .js

如果需要,为我们的引擎添加 javascript 入口点。无需此文件即可使用 Pin 图。

# my_engine/app/assets/javascripts/my_engine/application.js

// do some javascript
document.querySelector("h1").innerText = "hi, i'm your engine";
console.log("hi, again");

更新引擎的布局:

# my_engine/app/views/layouts/my_engine/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <!--
      NOTE: This loads/imports main app `application.js` and all the pins from
            the main app and from the engine (because we set it up in the engine.rb).
    -->
    <%= javascript_importmap_tags %>

    <!--
      NOTE: To add engine's javascript functionality we have to load the
            entrypoint here or `import` it in the main app `application.js`
    -->
    <%= javascript_import_module_tag "my_engine/application" %>
  </head>
  <body> <%= yield %> </body>
</html>

Create 导入映射.rb和别针my_engine/application,这个名字必须匹配javascript_import_module_tag。它不能与主应用程序中的任何其他名称冲突,因此您不能只使用application:

# my_engine/config/importmap.rb

# NOTE: this pin works because `my_engine/app/assets/javascripts
#       is in the `Rails.application.config.assets.paths`
pin "my_engine/application"

用于测试设置的一些额外内容:

# config/routes.rb
Rails.application.routes.draw do
  mount MyEngine::Engine => "/"
end

# my_engine/config/routes.rb
MyEngine::Engine.routes.draw do
  get "home", to: "homes#index"
end

# my_engine/app/controllers/my_engine/homes_controller.rb
module MyEngine
  class HomesController < ApplicationController
    def index; end
  end
end

# my_engine/app/views/my_engine/homes/index.html.erb
<h1>Home</h1>

此时,您的渲染布局中应该包含此内容<head>标签,除其他外:

<script type="importmap" data-turbo-track="reload">{
  "imports": {
    "application": "/assets/application-66ce7505c61e3e4910ff16e7c220e1fbfb39251cd82e4bab8d325b3aae987cf9.js",
    "my_engine/application": "/assets/my_engine/application-31ce493e8376b4c20703a50f38d419ae309ffe410b7ab7fec47440e02eef08a8.js",
  }
}</script>

<script type="module">import "application"</script>
<script type="module">import "my_engine/application"</script>

H1标签应更改为<h1>hi, i'm your engine</h1>重新加载时。

可以手动添加额外的导入映射https://generator.jspm.io/.

对于奖励积分,bin/importmap可以定制以在引擎内部工作。创建一个新的importmap里面的文件bin目录。

# my_engine/bin/importmap

#!/usr/bin/env ruby

# NOTE: don't forget to `chmod u+x bin/importmap` to make it executable.

# make sure we are loading the correct versions of things
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])

# NOTE: importmap requires some rails goodness that we don't have in the engine,
#       because we don't have `config/application.rb` that loads the environment.
require "rails"

# importmap-rails is not loaded automatically
require "importmap-rails"

# the actual command runner
require "importmap/commands"

从引擎目录内部运行:

$ bin/importmap pin react  
Pinning "react" to https://ga.jspm.io/npm:[email protected]/index.js

$ cat config/importmap.rb 
pin "my_engine/application"
pin "react", to: "https://ga.jspm.io/npm:[email protected]/index.js"

我还没有对其进行太多测试,因此欢迎任何反馈。如果某些内容没有出现,请重新启动服务器,我不知道重新加载的行为如何。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Rails 7 引擎中设置 importmap-rails? 的相关文章

  • ruby 中的树结构,父子采用数组格式,没有 gem?

    我有一个数组 其中包含这样的项目列表 arr id gt 1 title gt A parent id gt nil id gt 2 title gt B parent id gt nil id gt 3 title gt A1 paren
  • 遏制gem安装:捆绑安装失败,但正常gem安装有效[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions solve
  • 使用 prawnto_2 gem 加载图像时,RAILS_ROOT 不再有效

    我正在将我的应用程序从 Rails 3 0 升级到 Rails 3 1 我已经尽可能地将旧插件转为 gems 其中包括用这个漂亮闪亮的新插件替换旧的 prawnto 插件对虾 2 https github com forrest prawn
  • 如何使用回形针对多页 pdf 进行缩略图

    我想让 Paperclip 为上传的多页 PDF 文件的每一页创建 2 个缩略图 我正在运行 Paperclip 2 3 1 1 并在我的资产模型中使用它 has attached file asset styles gt medium g
  • 2015 年重新审视 Ember Handling 401

    我可以在 Ember Ember Data 中找到大量询问 回答如何从 Rails 后端处理 401 的老问题 许多 如果不是全部的话 在这一点上似乎已经过时了 我已经尝试了我能找到的一切 Ember 数据处理 401 https stac
  • 如何在 Rails 2.3.5 中从模型渲染部分

    我有一个 Rails 2 3 5 应用程序 我试图从模型中渲染几个部分 我知道 我知道 我不应该这样做 我这样做的原因是我将 Comet 服务器 APE 集成到我的 Rails 应用程序中 并且需要根据模型的事件 例如 after crea
  • 使用pluginaweek的state_machine,我可以在事件期间引用activerecord对象吗?

    我正在尝试实现一个 挂起 事件 将对象转换为 挂起状态 但我需要能够 取消暂停 并返回到之前的状态 我向模型添加了 previous state 字段 但我看不到如何在事件块内访问它 这是我试图实现的基本逻辑 event suspend d
  • 如何对 mongodb/mongoid 脚本进行基准测试,以比较两种不同的查询技术

    您对如何测试两种不同的 mongoid mongodb 查询实现的性能有什么建议吗 要比较的实现与以前的相关 问答 https stackoverflow com questions 10121977 extracting modellin
  • “array.map”是否保留原始顺序?

    我有一个User类has many Jobs 我使用以下代码映射作业 def ranges user jobs map u u start at u end at end 我有一个比较两个数组的规范 my array start1 end1
  • 删除嵌套属性不起作用

    我似乎无法使用删除项目accepts nested attributes for命令 但我已经按照本教程 http railscasts com episodes 196 nested model form revised以及相关的git
  • 向 Rails 应用程序中的内置类添加方法

    我想向 Rails 应用程序中的 Array 类添加一个方法 我应该把这个方法放在哪里 编辑得更清楚 显然我把它放在某个文件中 但是我如何告诉 Rails 应用程序在哪里可以找到它 执行此操作的一种方法是在以下位置创建一个文件lib rai
  • Guard 不会加载 WDM

    我正在学习 Michael Hartl 的 Rails 教程 到目前为止该教程非常出色 我在高级设置一章中 他以有利于 TDD 的方式配置 Rails 环境 我安装了 Guard 并且通过运行我在 spec 文件夹中的测试 它一直正常运行
  • 如何设置管理员批准模型的编辑

    我需要一个普通用户可以编辑模型的系统 但编辑实际上只有在管理员批准后才会发生 我发现了一颗宝石 叫做纸迹 https github com airblade paper trail它确实有模型版本控制 但不具体支持我想要做的事情 我想知道其
  • 尝试使用 Rails 和 PostgreSQL 生成模型时,命令挂起且没有错误

    使用该命令时 rails generate model Event name string 什么也没发生 我必须按 CTRL c 我使用的版本是 红宝石 2 1 1p76 导轨4 1 0 PostgreSQL 9 3 4 Mac OS X
  • 无法验证 CSRF 令牌的真实性 Rails/React

    我的 Rails 应用程序中有一个 React 组件 我正在尝试使用它fetch 发送一个POST对于我在本地主机上托管的 Rails 应用程序 这给了我错误 ActionController InvalidAuthenticityToke
  • Rails:页面加载时间很长

    我有一个 Rails 项目 我在一个控制器中遇到了非常奇怪的事情 浏览器需要大约 3 分钟来加载页面 但 Rails 在日志中写入 Completed 200 OK in 20563ms Views 17144 2ms ActiveReco
  • 使用 SASS 切换用户主题 - Ruby on Rails

    所以我有一个 Rails 管理系统 允许用户选择一个主题 基本上是一组 SASS 颜色变量 它将使用新颜色重新编译 application css scss 当用户从下拉菜单中选择并提交时 更改此设置的最佳方法是什么 我阅读了一些有关缓存和
  • 如何在控制器内部使用 auto_link

    在我的控制器中 我需要构建一个 JSON 对象 如何在控制器内使用 auto link 现在它错误 NoMethodError undefined method mail to for
  • Bootstrap shown.bs.tab 事件不起作用

    我正在使用灵活的模板 http the8guild com themes html flexy v1 7 stylesPage html 使用引导程序 并且我无法让选项卡上的 shown bs tab 事件正常工作 我已经成功让它发挥作用J
  • Mongoid 命名范围比较同一文档中的两个时间字段

    我需要在 Mongoid 中创建一个命名范围来比较同一文档中的两个时间字段 例如 scope foo where gt updated at gt gt checked at 这显然不会像它对待的那样起作用 checked at作为一个符号

随机推荐