Rails+React Heroku部署中gzip压缩文件数量持续增加问题排查
问题分析与解决方案
可能的原因
- 静态资源指纹缺失:Rails生产环境未启用资源哈希指纹(
config.assets.digest),导致每次部署的资源文件名重复,旧资源未被清理,heroku-deflator持续压缩新旧资源。 - heroku-deflator配置不全:未覆盖默认压缩类型,或未跳过已压缩文件(如React打包时生成的
.gz/.br文件),导致重复压缩。 - React打包未清理旧产物:
npm run build前未清空build目录,新老打包文件共存,被heroku-deflator批量压缩。 - Heroku预编译缓存残留:Rails资产预编译启用了缓存,旧资源被保留到新部署的slug中,持续生成新的压缩文件。
解决步骤
1. 修复Rails静态资源配置
打开config/environments/production.rb,确保以下配置正确:
config.assets.digest = true # 强制生成带哈希的资源文件名 config.assets.clean = true # 预编译时自动清理旧资源 config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=31536000, immutable' } # 给静态资源设置强缓存,避免冗余请求
若React打包产物存放在自定义路径,在config/application.rb中添加asset路径:
config.assets.paths << Rails.root.join('client', 'build', 'static')
2. 调整heroku-deflator配置
新建或修改config/initializers/heroku_deflator.rb:
HerokuDeflator.configure do |config| # 明确指定需要压缩的文件类型,覆盖默认配置 config.compressed_content_types = [ 'text/html', 'text/css', 'text/javascript', 'application/javascript', 'application/json', 'image/svg+xml' ] # 跳过已压缩的文件,避免重复处理 config.skip_compression = ->(file) { file.extname == '.gz' || file.extname == '.br' } # 部署后自动清理旧的压缩文件 config.clean_old_compressed_files = true end
3. 修复React打包脚本
在项目根目录的package.json中,给build命令添加清理步骤:
"scripts": { "build": "rimraf build && react-scripts build" // 若未安装rimraf,可替换为:"rm -rf build && react-scripts build"(仅Linux/macOS环境) }
确保create-react-app默认的哈希文件名功能未被修改,避免新老资源重名。
4. 清理Heroku构建缓存
执行命令禁用资产预编译缓存或清空构建缓存:
# 禁用资产预编译缓存 heroku config:set SKIP_ASSET_COMPILATION_CACHE=true # 手动清空所有构建缓存 heroku builds:cache:purge
5. 验证部署结果
部署后登录Heroku控制台,检查静态文件目录:
heroku run bash ls -la public/assets # 或React打包对应的目录路径
确认无大量重复文件名、旧资源已被清理,压缩文件数量不再异常增长。
内容的提问来源于stack exchange,提问作者Jim Lagattuta
相关产品推荐
相关产品推荐

