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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:14