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

从Rails 6升级到Rails 8后Importmaps下JS无法运行问题

问题描述

将Rails 6项目升级到Rails 8后,Importmaps环境下JavaScript无法正常运行,出现以下错误:

Sprockets::FileNotFound in Posts#show
Showing /Users/Bazley/Rails/myapp_8/app/views/layouts/application.html.erb where line # raised:
couldn't find file 'jquery.fileupload-process' with type 'application/javascript'
Checked in these paths: 
  /Users/Bazley/Rails/myapp_8/app/assets/config
  /Users/Bazley/Rails/myapp_8/app/assets/images
  /Users/Bazley/Rails/myapp_8/app/assets/stylesheets
  /Users/Bazley/Rails/myapp_8/vendor/assets/javascripts
  /Users/Bazley/Rails/myapp_8/vendor/assets/stylesheets
  /Users/Bazley/Rails/myapp_8/app/javascript
  /Users/Bazley/Rails/myapp_8/vendor/javascript

CSS仍保留在app/assets/stylesheets,但所有JavaScript已迁移至app/javascript。运行$ bin/importmap json时也报类似错误(jquery.fileupload-process位于custom目录,与其他JS文件在一起):

couldn't find file 'jquery.fileupload-process' with type 'application/javascript'
Checked in these paths: 
  /Users/Bazley/Rails/myapp_8/app/assets/config
  /Users/Bazley/Rails/myapp_8/app/assets/images
  /Users/Bazley/Rails/myapp_8/app/assets/stylesheets
  /Users/Bazley/Rails/myapp_8/vendor/assets/javascripts
  /Users/Bazley/Rails/myapp_8/vendor/assets/stylesheets
  /Users/Bazley/Rails/myapp_8/app/javascript
  /Users/Bazley/Rails/myapp_8/vendor/javascript

系统未检索/Users/Bazley/Rails/myapp_8/app/javascript/custom目录,需解决:

  1. 如何让系统检索该目录?
  2. 这能否解决当前错误?
  3. 是否需要彻底移除Sprockets?

相关配置如下:

Gemfile

gem 'importmap-rails', '2.1.0'

app/javascript/application.js

import "custom/myjavascript"
alert("This works");       // 此弹窗正常显示

app/javascript/custom/myjavascript.js

alert("Hello from myjavascript");     // 此弹窗未显示

app/assets/config/manifest.js

//= link_tree ../images
//= link_directory ../stylesheets .css
//= link_tree ../../javascript .js
//= link_tree ../../../vendor/javascript .js

config/importmap.rb

pin "application"
pin_all_from "app/javascript/custom"

app/views/layouts/application.html.erb

<head>
  .
  .
  .
    <%= javascript_importmap_tags %>
  </head>

app/javascript/application.js中的弹窗正常工作,但app/javascript/custom/myjavascript.js中的弹窗未显示,所有存放在app/javascript/custom的JS均未加载生效,需调整哪些配置?


解决方案

1. 修复Importmap路径导入问题

当前custom目录下的JS未加载,核心是导入路径配置错误。修改app/javascript/application.js中的导入语句,使用基于app/javascript根目录的相对路径:

import "./custom/myjavascript"

或者在config/importmap.rb中明确指定pin的命名空间:

pin_all_from "app/javascript/custom", under: "custom"

之后在application.js中保持import "custom/myjavascript"即可。

2. 解决Sprockets与Importmap的冲突

错误提示Sprockets找不到JS文件,是因为manifest.js中保留了让Sprockets处理JS的配置,导致和Importmap功能重叠。删除app/assets/config/manifest.js中的以下两行:

//= link_tree ../../javascript .js
//= link_tree ../../../vendor/javascript .js

此举让Sprockets专注处理CSS和静态图片,JS完全交给Importmap管理,即可解决jquery.fileupload-process找不到的问题。

3. 无需彻底移除Sprockets

因为你仍在使用app/assets/stylesheets管理CSS,保留Sprockets即可,只需通过修改manifest.js让它不再处理JS文件。

验证步骤

  1. 重启Rails服务器,确保所有配置变更生效
  2. 访问页面,检查myjavascript.js中的弹窗是否正常显示
  3. 运行bin/importmap json,确认无文件找不到的错误提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 17:28:26