如何通过Sprockets加载Webpack构建的application.js?
兄弟,我太懂你升级老Rails项目碰到这种文件冲突的糟心了!咱们一步步把这个问题理顺解决:
首先得明确你现在的情况:一个是app/assets/javascripts/application.js——这是原来Sprockets用的清单文件;另一个是Webpack通过jsbundling-rails构建出来的,默认会放在app/assets/builds/application.js。我们要做的就是让Sprockets放弃自己编译JS,转而加载Webpack打包好的那个文件。
步骤1:修改Sprockets的清单文件
打开app/assets/javascripts/application.js,把原来那些require_*相关的注释和代码替换成下面的内容:
// 让Sprockets识别Webpack的构建目录并加载打包后的文件 //= link_tree ../builds //= link application.js
这里的link_tree ../builds是告诉Sprockets去扫描app/assets/builds目录下的所有文件,link application.js就是指定要加载Webpack生成的那个打包文件。
步骤2:确认Webpack的输出目录配置
检查你的package.json里的build命令,确保它把Webpack的输出文件放到app/assets/builds目录下。比如用Webpack的话,命令大概是这样的:
"scripts": { "build": "webpack --mode production --output-path app/assets/builds" }
这个目录是jsbundling-rails的默认输出目录,和Sprockets的配置对应上才不会出问题。
步骤3:保留布局里的JS引用
你的布局文件(比如app/views/layouts/application.html.erb)里的<%= javascript_include_tag 'application', 'data-turbo-track': 'reload' %>不用改,现在Sprockets会自动去加载app/assets/builds/application.js,也就是Webpack打包好的完整JS代码。
步骤4:清理缓存避免干扰
最后记得清理一下旧的资产缓存,运行这两个命令:
rails assets:clobber rails assets:precompile
这样能确保不会有旧的编译文件残留导致加载异常。
额外注意点
- 原来
app/assets/javascripts里的旧JS文件,如果已经迁移到app/javascript(jsbundling-rails的默认源码目录),可以慢慢删掉了,避免重复加载。 - 之前通过Sprockets引入的第三方库(比如jQuery),现在要转到Webpack的方式:先通过npm安装依赖,然后在
app/javascript/application.js里用import引入,比如import $ from 'jquery'。
备注:内容来源于stack exchange,提问作者PascalTurbo

