You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至Rails 7.0.5.1后,能否在资产管道中使用Turbo?

解决Rails 7资产管道引入Turbo避开Importmaps的问题

核心思路

跳过Rails 7默认的Importmaps/Webpacker方案,直接通过传统资产管道引入Turbo,适配现有遗留JavaScript代码。

具体步骤

  • 下载Turbo静态文件
    从Turbo官方发布包中获取turbo.min.js,将文件放入项目的vendor/assets/javascripts/目录下。

  • 配置资产管道加载Turbo
    在app/assets/javascripts/application.js中,用Sprockets的require语法引入Turbo,替换掉Importmaps的import语句:

    //= require rails-ujs
    //= require turbo.min
    //= require_tree .
    

    注:如果遗留代码仍依赖Turbolinks,需注意Turbo与Turbolinks功能重叠,建议只保留其中一个,避免冲突。

  • 手动初始化Turbo
    在application.js末尾添加初始化代码,确保页面加载时启动Turbo:

    document.addEventListener('DOMContentLoaded', () => {
      Turbo.start()
    })
    
  • 关闭Importmaps相关配置

    1. 移除config/importmap.rb中所有Turbo相关的映射(如pin "turbo")
    2. 若项目之前启用了Importmaps,在config/application.rb中注释掉相关加载配置:
      # require "importmap-rails"
      
    3. 在config/initializers/assets.rb中添加vendor目录到资产路径,确保Sprockets能识别Turbo文件:
      Rails.application.config.assets.paths << Rails.root.join("vendor", "assets", "javascripts")
      
  • 适配遗留JS与Turbo的页面切换机制
    Turbo的页面替换会导致依赖DOMContentLoaded的遗留代码在导航后无法触发,需调整为监听Turbo专属事件:

    // 替代DOMContentLoaded,适配每次Turbo导航后的页面渲染
    document.addEventListener('turbo:load', () => {
      // 你的遗留JS初始化逻辑
    })
    

    仅需初始页面加载执行的代码,可保留DOMContentLoaded监听;需每次页面切换后执行的逻辑,改用turbo:load或turbo:render事件。

注意事项

  • 不要同时加载Turbolinks和Turbo,两者会引发路由跳转、DOM操作等异常问题。
  • 部署前运行rails assets:precompile测试生产环境下的资产编译与加载情况,确保Turbo文件被正确打包。

内容的提问来源于stack exchange,提问作者Muhammad Ans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:16:03