Ruby on Rails中如何通过Asset Pipeline正确引入自定义JS文件?
你的问题出在Rails 6+默认使用JS Bundling(如esbuild、Webpack)处理JavaScript,而非传统Sprockets的Asset Pipeline指令逻辑,//= require init这种Sprockets语法在ES模块格式的application.js里不会生效。
解决步骤:
修改application.js的引入方式
把原来的//= require init替换为ES模块的import语句,因为application.js是JS bundler的入口文件,所有导入的模块都会被打包到最终的application.jsbundle中:import "@hotwired/turbo-rails" import "controllers" import "./init" // 替换原来的//= require init这里
./init是相对路径,对应app/javascript/init.js文件,确保路径匹配即可。理解打包后的文件表现
用这种方式打包后,init.js的代码会被合并到application.js中,所以浏览器Sources标签里不会看到单独的init.js文件(开发环境下可通过source map找到对应代码,默认已开启source map)。这才是Asset Pipeline(当前JS Bundling)的正确工作模式——合并压缩资源。验证配置正确性
你的app/assets/config/manifest.js配置没问题,它确保Sprockets能定位到JS资源,但核心的JS打包逻辑由bundler处理,所以重点是application.js里的import语句。重启开发服务器
修改完成后重启Rails服务器,刷新页面即可生效。
内容的提问来源于stack exchange,提问作者mozhayka

