从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目录,需解决:
- 如何让系统检索该目录?
- 这能否解决当前错误?
- 是否需要彻底移除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文件。
验证步骤
- 重启Rails服务器,确保所有配置变更生效
- 访问页面,检查
myjavascript.js中的弹窗是否正常显示 - 运行
bin/importmap json,确认无文件找不到的错误提示
内容的提问来源于stack exchange,提问作者Bazley

