Rails 7 - 在开发中自动获取资源不起作用

Rom*_*kin 16 ruby-on-rails ruby-on-rails-7

application.js由于某些未知原因,当我在浏览器中按 F5 时,Rails 7(开发环境)不会自动获取更改。该位置application.js是默认的。我几乎使用默认设置。

当我运行服务器时,它从某个缓存版本中获取 JavaScript。我需要明确地rails assets:precompile使其发挥作用。

导入映射看起来标准:

# Pin npm packages by running ./bin/importmap

pin "application", preload: true
...
Run Code Online (Sandbox Code Playgroud)

布局文件似乎也很标准:

<!DOCTYPE html>
<html>
  <head>
    <title>Whatever</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" href="<%= image_path('favicon.svg') %>">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
    <%= javascript_importmap_tags %>
  </head>
...
Run Code Online (Sandbox Code Playgroud)

config.importmap.sweep_cache = true我尝试在我的(根据 importmap 文档)中进行设置development.rb,但似乎没有效果。

此时我非常绝望,无法理解为什么我需要rails assets:precompile在我的开发环境中这样做。

另外,我没有在“localhost”域上运行我的应用程序,它是在类似dev.server-somewhere.com(因此可以从任何地方访问)的 SSH 重定向上运行我的应用程序,类似于 ngrok。不确定这是否是问题的原因。

澄清一下:我正在寻找没有实时刷新功能的功能,只需使用 F5 页面刷新的标准方法即可。

小智 19

我有同样的问题,只需使用:rails assets:clobber清除所有预编译资产。之后热重载将再次开始工作。

如果 Rails 中存在现有的预编译 JS 资源,public/assets/即使在开发模式下也会赋予它们优先级(甚至当 esbuild 或 tsc-watch 正在将源文件转译为 时app/assets/buils/,这与 Sprocket 挂在其旧缓存上无关)


Jas*_* FB 9

通常,资产仅在生产/部署环境中“预编译”。这意味着默认情况下,您开发时不应该有文件夹public/assets/(Sprockets 在开发模式下为您即时编译资源)。

如果您不小心在开发中运行rails assets:precompile,您将在此处有一个额外的文件夹 ( public/assets/),该文件夹不会签入您的存储库。

但如果它确实存在,那么它的存在会覆盖 Sprocket 的开发模式设置,在每次页面加载时重新编译,迫使您的浏览器从...加载已编译(且过时)的资源。public/assets/

(具有讽刺意味的是,运行rails assets:precompilerake assets:precompile,虽然它确实强制进行一次性重新编译,并且似乎为您提供了最新的 JS 编译,但在开发中执行此操作通常是导致Sprockets 问题首先陷入困境的原因)

接下来,强制 Sprockets 删除该public/assets/文件夹,然后使用以下命令破坏指纹缓存:

rails assets:clobber    
Run Code Online (Sandbox Code Playgroud)

(或者,先运行rails assets:clean然后touch tmp/restart.txt

要进一步调试,请assets.debug = true在环境文件中进行设置。


小智 1

我今天遇到了这个问题,我用传动轴更换了链轮。然后就成功了!你可以看看升级指南