Rails 7 - 在开发模式下自动获取资产无法正常工作

15

由于某些未知原因,Rails 7 (开发环境) 在我按 F5 刷新浏览器时无法自动检测到 application.js 中的更改。该文件位置为默认设置,且我的配置基本与默认设置相同。

当我启动服务器时,它会读取某个缓存版本的 JavaScript。我需要显式运行 rails assets:precompile 以使其正常工作。

Importmap 看起来很标准:

# Pin npm packages by running ./bin/importmap

pin "application", preload: true
...

布局文件似乎也非常标准:

<!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>
...

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

目前我非常绝望,不明白为什么需要在开发环境中运行rails assets:precompile

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

澄清一下:我不需要实时刷新功能,只需使用F5页面刷新即可。


你是严格使用 importmaps 处理 JavaScript,还是使用 jsbundling 或 webpack? - Joe Thor
只需使用importmaps。 - Roman Pushkin
4个回答

17

我有同样的问题,可以简单地使用:rails assets:clobber 来清除所有预编译的资源。之后,热重载将重新开始工作。

如果在 public/assets/ 目录下存在预编译的 JS 资源,Rails 会优先使用它们,即使在开发模式下(甚至当 esbuild 或 tsc-watch 等其他工具将你的源文件转换为 app/assets/buils/ 目录中的文件时,这与 Sprocket 保留其旧缓存无关)。


1
这个方法是有效的,但是需要运行 rails assets:precompile 并且重启服务器。但是对于开发 Stimulus 控制器来说,这是一种非常痛苦的方式。 - Jordan F
谢谢,我刚才执行了rails assets:clobber命令,这个命令将删除/public/assets文件夹,并且现在也会监控js文件(包括 stimulus controllers),这样我就不必进行预编译了。 - widjajayd
刷新后,我再次遇到了同样的问题。 - Jches

7
通常情况下,资产只在生产/部署环境中“预编译”。这意味着在开发过程中默认情况下不应该有一个名为public/assets/的文件夹(Sprockets会在开发模式下即时编译资产)。
如果你在开发中意外运行了rails assets:precompile命令,那么你将会有一个额外的文件夹public/assets/,它不会被提交到你的代码库中。
但是,如果存在这个文件夹,它将覆盖Sprocket的开发模式设置,强制浏览器从public/assets/加载已经编译(且过时的)资产...
具有讽刺意味的是,虽然运行rails assets:precompilerake assets:precompile可以强制重新编译并看起来能够提供最新的JS编译结果,但在开发环境中进行此操作通常会导致Sprockets出现问题。
接下来,你需要使用以下命令强制Sprockets删除public/assets/文件夹并清除缓存:
rails assets:clobber    

如果不行的话,可以运行 rails assets:clean 然后运行 touch tmp/restart.txt

如果需要更进一步的调试,可以在你的环境文件中设置assets.debug = true


我有些困难,但Jason建议的是正确的。从clobber中删除public/assets是正确的,不需要在本地运行预编译。 - Koppo

1

今天我也遇到了同样的问题,只需回退到Sprockets,安装宝石后一切都可以直接使用。看起来在Rails 7中Sprockets是可选的。不过我不知道Sprockets是否可以与Import Maps结合使用。


1

今天我遇到了这个问题,我使用propshaft替换了齿轮。然后它就正常工作了!你可以查看升级指南


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