diff --git a/actionview/lib/action_view/helpers/asset_tag_helper.rb b/actionview/lib/action_view/helpers/asset_tag_helper.rb
index ec2856e93e..e0aea7757a 100644
--- a/actionview/lib/action_view/helpers/asset_tag_helper.rb
+++ b/actionview/lib/action_view/helpers/asset_tag_helper.rb
@@ -325,16 +325,17 @@ module ActionView
crossorigin = "anonymous" if crossorigin == true || (crossorigin.blank? && as_type == "font")
integrity = options[:integrity]
nopush = options.delete(:nopush) || false
+ rel = mime_type == "module" ? "modulepreload" : "preload"
link_tag = tag.link(**{
- rel: "preload",
+ rel: rel,
href: href,
as: as_type,
type: mime_type,
crossorigin: crossorigin
}.merge!(options.symbolize_keys))
- preload_link = "<#{href}>; rel=preload; as=#{as_type}"
+ preload_link = "<#{href}>; rel=#{rel}; as=#{as_type}"
preload_link += "; type=#{mime_type}" if mime_type
preload_link += "; crossorigin=#{crossorigin}" if crossorigin
preload_link += "; integrity=#{integrity}" if integrity
diff --git a/actionview/test/template/asset_tag_helper_test.rb b/actionview/test/template/asset_tag_helper_test.rb
index 65f375adf6..44a5135dc5 100644
--- a/actionview/test/template/asset_tag_helper_test.rb
+++ b/actionview/test/template/asset_tag_helper_test.rb
@@ -246,6 +246,7 @@ class AssetTagHelperTest < ActionView::TestCase
}
PreloadLinkToTag = {
+ %(preload_link_tag '/application.js', type: 'module') => %(),
%(preload_link_tag '/styles/custom_theme.css') => %(),
%(preload_link_tag '/videos/video.webm') => %(),
%(preload_link_tag '/posts.json', as: 'fetch') => %(),
@@ -605,6 +606,14 @@ class AssetTagHelperTest < ActionView::TestCase
end
end
+ def test_should_set_preload_early_hints_with_rel_modulepreload
+ with_preload_links_header do
+ preload_link_tag("http://example.com/all.js", type: "module")
+ expected = "; rel=modulepreload; as=script; type=module"
+ assert_equal expected, @response.headers["Link"]
+ end
+ end
+
def test_should_set_preload_links_with_integrity_hashes
with_preload_links_header do
stylesheet_link_tag("http://example.com/style.css", integrity: "sha256-AbpHGcgLb+kRsJGnwFEktk7uzpZOCcBY74+YBdrKVGs")