ruby-on-rails 在我运行rails assets:precompile之前,Rails应用程序不会加载对Javascript文件的更新

rm5edbpk  于 2023-01-18  发布在  Ruby
关注(0)|答案(1)|浏览(127)

我有一个旧的Rails应用程序,我试图升级到Rails 7。在升级过程中,我破坏了资产管道。当我更新javascript文件时,除非我运行rails assets:precompile并重新启动服务器,否则更改是不可见的。
当我运行rails assets:precompile时,我在public/assets文件夹中得到了一堆编译过的JS和CSS资产,这看起来像是资产管道流程的过时版本。
这个项目是我的一个个人项目,我已经做了很多年了,它跨越了从Rails 4到7的版本。它从来没有一个用户基础,它只是一个想法,我经常回去工作。所以我有可能有一个旧版本的资产管道在运行。
我从头开始创建了一个新的Rails 7项目,它的工作和预期的一样。我一直试图让新项目尽可能接近我现有的项目,以查看我当前的项目在哪里失败,但这变得非常困难,而且还没有产生任何结果。
我肯定我一定有一些旧的配置仍然在地方,但我不知道在哪里寻找。我不记得以前有过这个问题。我希望任何建议,在哪里寻找旧的坏应用程序和新的工作之间的差异。

azpvetkf

azpvetkf1#

我是这样开始的:

rails _6.1.4.4_ new rails_upgrade
cd rails_upgrade

bundle remove webpacker  # obsolete
bundle remove turbolinks # obsolete
bundle remove sass-rails # outdated
bundle remove rails
bundle add rails --version "~> 7.0"

bin/rails app:update
bin/rails db:migrate
  • Gemfile* 未触及,你怎么知道新的默认值,除非你运行rails new .深入挖掘应用生成器,你可以只生成必要的文件:
require "rails/generators/rails/app/app_generator"

Rails::Generators::AppGenerator.new(["rails"],
  {javascript: "esbuild", force: true}, # `rails new` options
  destination_root: "tmp")              # don't mess up the root directory
    .template("Gemfile")                # or `.send(:build, :gemfile)`

puts File.read("tmp/Gemfile")

但你可能想做:

bundle add jsbundling-rails turbo-rails stimulus-rails sprockets-rails

bin/rails javascript:install:esbuild
bin/rails turbo:install
bin/rails stimulus:install

删除app/javascript/packs和webpacker相关的东西,比如javascript_pack_tag
新的javascript条目是app/javascript/application.js。您必须使用esbuild构建它才能在您的布局中使用:

# this every time
bin/dev

编译后的文件存放在app/assets/builds/中,这个目录在app/assets/config/manifest.js中,所以每个文件都可以在生产环境中预编译。
您的布局中应该包含以下内容:

<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
# NOTE: no turbolinks                      ^^^^^^^^^^^^^^^^

不要预编译,它不是解决方案。也运行此命令以撤消,这不是可选的:

bin/rails assets:clobber

bin/rails assets:precompile用于生产,而不是开发。
就javascript而言,如果编译无误,它应该可以工作并重新加载。这些是简化的升级步骤,但人们说资产无法重新加载的次数太多了,我无法重现。大多数情况下,这些是解决方案:

bin/rails assets:clobber
bin/dev # if you have it, and you should unless you're using importmap-rails

相关问题