将刺激和导入图添加到现有 Rails 6.1 应用
Adding stimulus and importmaps to an existing Rails 6.1 app
我有一个 Rails 6.1 应用程序,它已从 Rails 4 -> 5 -> 6 升级,所以它很成熟。
它仍然使用资产管道,并且随着 Rails 7.0 的未来,我将保持这种方式。我想开始使用 stimulus + importmaps,所以我跟着安装。
通过 hotwire 安装 importmaps 和 stimulus 后,我在 Firefox 91 中加载我的应用程序时遇到以下错误;
Uncaught SyntaxError: import declarations may only appear at top level of a module
Uncaught TypeError: Error resolving module specifier “application”. Relative module specifiers must start with “./”, “../” or “/”.
我的importmap.rb
Rails.application.config.importmap.draw do
pin "@hotwired/stimulus", to: "stimulus.js"
pin "@hotwired/stimulus-importmap-autoloader", to: "stimulus-importmap-autoloader.js"
pin_all_from "app/javascript/controllers", under: "controllers"
pin "application"
# Use libraries available via the asset pipeline (locally or via gems). # Rails 7.0 required
# pin "@rails/actioncable", to: "actioncable.esm.js"
# pin "@rails/activestorage", to: "activestorage.esm.js"
# Use libraries directly from JavaScript CDNs (see https://www.skypack.dev, https://esm.sh, https://www.jsdelivr.com/esm)
# pin "vue", to: "https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.esm.browser.js"
# pin "d3", to: "https://esm.sh/d3?bundle"
# Pin vendored modules by first adding the following to app/assets/config/manifest.js:
# //= link_tree ../../../vendor/assets/javascripts .js
# pin_all_from "vendor/assets/javascripts"
end
我将所有 javascript 保存在 app/assets/javascripts 目录中,该目录仍应由资产管道处理。
我有以下app/assets/javascripts/importmap.json.erb
{
"imports": {
"turbo": "<%= asset_path "turbo" %>",
<%= importmap_list_with_stimulus_from "app/assets/javascripts/controllers", "app/assets/javascripts/libraries" %>
}
}
application.js 是;
// This is the main application.js, there can only be one.
//
// Configure your import map in config/importmap.rb
// import "@rails/actioncable" // Rails 7.0 required
// import "@rails/activestorage" // Rails 7.0 required
import "@hotwired/stimulus-importmap-autoloader"
我的 application.html.erb
中也有以下行
<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
<%= javascript_include_tag "turbo", type: "module-shim" %>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%= yield :head %>
<%= javascript_importmap_tags %>
manifest.js是;
//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
//= link_tree ../javascripts
编辑
检查 Chrome 中的“元素”选项卡,我已经加载了 es-module-shims,但在 Firefox 中我仍然遇到错误;
Uncaught SyntaxError: import declarations may only appear at top level of a module
Uncaught TypeError: Error resolving module specifier “application”. Relative module specifiers must start with “./”, “../” or “/”.
这是加载 es-module-shim 的代码
<script src="/assets/es-module-shims-e320a414bc4656be79c9c722c91afd9bc40140edf48616fbf72fb2da3c1fdcaa.js" async="async" data-turbo-track="reload"></script>
<script type="module">import "application"</script>
编辑
可以安全地忽略以下错误;
Uncaught TypeError: Error resolving module specifier “application”. Relative module specifiers must start with “./”, “../” or “/”.
参考:https://github.com/rails/importmap-rails#expected-errors-from-using-the-es-module-shim
编辑
当我将 application.html.erb 头更改为以下
时,另一个错误消失了
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag "application" %>
<%= javascript_importmap_tags %>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%= yield :head %>
Firefox 本身不支持导入映射。您需要从 https://github.com/guybedford/es-module-shims.
添加一个 polyfill
我有一个 Rails 6.1 应用程序,它已从 Rails 4 -> 5 -> 6 升级,所以它很成熟。
它仍然使用资产管道,并且随着 Rails 7.0 的未来,我将保持这种方式。我想开始使用 stimulus + importmaps,所以我跟着安装。
通过 hotwire 安装 importmaps 和 stimulus 后,我在 Firefox 91 中加载我的应用程序时遇到以下错误;
Uncaught SyntaxError: import declarations may only appear at top level of a module
Uncaught TypeError: Error resolving module specifier “application”. Relative module specifiers must start with “./”, “../” or “/”.
我的importmap.rb
Rails.application.config.importmap.draw do
pin "@hotwired/stimulus", to: "stimulus.js"
pin "@hotwired/stimulus-importmap-autoloader", to: "stimulus-importmap-autoloader.js"
pin_all_from "app/javascript/controllers", under: "controllers"
pin "application"
# Use libraries available via the asset pipeline (locally or via gems). # Rails 7.0 required
# pin "@rails/actioncable", to: "actioncable.esm.js"
# pin "@rails/activestorage", to: "activestorage.esm.js"
# Use libraries directly from JavaScript CDNs (see https://www.skypack.dev, https://esm.sh, https://www.jsdelivr.com/esm)
# pin "vue", to: "https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.esm.browser.js"
# pin "d3", to: "https://esm.sh/d3?bundle"
# Pin vendored modules by first adding the following to app/assets/config/manifest.js:
# //= link_tree ../../../vendor/assets/javascripts .js
# pin_all_from "vendor/assets/javascripts"
end
我将所有 javascript 保存在 app/assets/javascripts 目录中,该目录仍应由资产管道处理。
我有以下app/assets/javascripts/importmap.json.erb
{
"imports": {
"turbo": "<%= asset_path "turbo" %>",
<%= importmap_list_with_stimulus_from "app/assets/javascripts/controllers", "app/assets/javascripts/libraries" %>
}
}
application.js 是;
// This is the main application.js, there can only be one.
//
// Configure your import map in config/importmap.rb
// import "@rails/actioncable" // Rails 7.0 required
// import "@rails/activestorage" // Rails 7.0 required
import "@hotwired/stimulus-importmap-autoloader"
我的 application.html.erb
中也有以下行<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
<%= javascript_include_tag "turbo", type: "module-shim" %>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%= yield :head %>
<%= javascript_importmap_tags %>
manifest.js是;
//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
//= link_tree ../javascripts
编辑
检查 Chrome 中的“元素”选项卡,我已经加载了 es-module-shims,但在 Firefox 中我仍然遇到错误;
Uncaught SyntaxError: import declarations may only appear at top level of a module
Uncaught TypeError: Error resolving module specifier “application”. Relative module specifiers must start with “./”, “../” or “/”.
这是加载 es-module-shim 的代码
<script src="/assets/es-module-shims-e320a414bc4656be79c9c722c91afd9bc40140edf48616fbf72fb2da3c1fdcaa.js" async="async" data-turbo-track="reload"></script>
<script type="module">import "application"</script>
编辑
可以安全地忽略以下错误;
Uncaught TypeError: Error resolving module specifier “application”. Relative module specifiers must start with “./”, “../” or “/”.
参考:https://github.com/rails/importmap-rails#expected-errors-from-using-the-es-module-shim
编辑
当我将 application.html.erb 头更改为以下
时,另一个错误消失了<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag "application" %>
<%= javascript_importmap_tags %>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%= yield :head %>
Firefox 本身不支持导入映射。您需要从 https://github.com/guybedford/es-module-shims.
添加一个 polyfill