Rails - Turbo - 链接预加载但未在窗口加载事件后的几秒钟内使用

13

这是一个网站上常见的问题,但我没有找到任何解决方法...

当我点击链接到另一页时,我的所有Rails应用程序控制台都会显示相同的警告消息

现在只需要找到解决方案...

资源http://localhost:3000/assets/application-eda55435df3b9385974c23342a8ac80ac010272673a829df638338aed54fe933.css已使用链接预加载(preload)方式预加载,但从窗口(load)事件后的几秒钟内未被使用。请确保它具有适当的as值,并且是故意预加载的。

我的application.html.erb文件中没有head标签,但如果可以的话,我使用Turbo

application.html.erb

<head>
<title>XXXX</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>

<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbo-track': 'reload' %>

<%= javascript_pack_tag 'application', 'data-turbo-track': 'reload', defer: true %>
</head>

应用程序.js

import Rails from "@rails/ujs"
import "@hotwired/turbo-rails"
import * as ActiveStorage from "@rails/activestorage"
import "channels"

Rails.start()
ActiveStorage.start()

import "controllers"
import "bootstrap"

这个警告显示在开发和生产环境中


也许这个线程可以帮助你:https://dev59.com/-VUL5IYBdhLWcg3w3LQH。另外,说实话,在你的问题中引用的.erb文件中我没有看到任何“Preload”。检查一下你的实际视图,看看它来自哪里。 - Maxence
@Maxence 谢谢,但我看到了很多这种解决方案,但正如你所说,我的代码中没有预加载标签,也没有任何页面中的预加载标签,头标签是由我的 application.html.erb 给出的。 - Loris_R
2个回答

17

我遇到了同样的问题,我们的应用程序是从Rails 6.0默认配置升级到 Rails 7.0 的(我们在升级到6.1时没有更新 config.load_defaults 版本)。似乎这是在6.1中引入的一个默认行为,它会自动向浏览器发送一个 "Link" 标头以指示预加载资产。如果您在浏览器控制台中检查"响应标头"部分,您应该会看到这个。

这似乎旨在提高页面加载性能,可以查看这个指南中的第16项(链接),但并不总是合适的。有些讨论和链接在添加禁用选项的PR此Twitter线程中。

未来访问者请注意:这也可能会导致CSP处理方面的问题,特别是使用javascript_include_tagnonce: true加载的脚本。我发现Firefox仍允许这些脚本,但Safari和Chrome都阻止了它们,可能是因为它们被加载的顺序不同。


4
感谢您的解释!只需在development.rb文件中添加以下内容: config.action_view.preload_links_header = false。 该设置可以禁用Rails应用程序在开发环境下预加载链接的功能。 - Loris_R
@Loris_R,你在生产环境中也这样做了吗?我在两个环境中都收到了警告。 - user137717
@user137717 这个项目还没有推到生产环境,你在生产环境上有什么问题吗? - Loris_R
只返回翻译文本:仅是同样的警告 - user137717

3
一个临时/懒惰的解决方案,我不确定这会对性能产生什么影响,但以下方法可以消除所有环境中的错误:
config.action_view.preload_links_header = false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接