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

如何携source-map部署应用至Heroku?本地正常线上失效排查

解决本地正常但Heroku部署后Source-map失效的问题

我之前碰到这么个头疼的情况:本地环境下webpack配置了source-map,生成的.map文件也正常,代码调试完全没问题,但把应用推到Heroku之后,打开浏览器审查元素发现source-map根本没生效——代码全是压缩后的,连个能定位的地方都没有。

我的配置信息

先给大家看看我的webpack生产环境配置:

devtool: 'source-map',
module: {
  rules: [
    {
      test: /\.(js|jsx)$/,
      loader: 'babel-loader',
      exclude: /node_modules|dist|build/,
      options: {
        babelrc: true,
      },
    },
    {
      test: /\.local\.(css|scss)$/,
      use: ExtractLocal.extract({
        fallback: 'style-loader?sourceMap',
        use: [
          {
            loader: 'css-loader',
            options: {
              sourceMap: true,
              minimize: true,
              modules: true,
              importLoaders: 1,
              localIdentName: '[local]___[name]__[hash:base64:5]',
            },
          },
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true,
            },
          },
          {
            loader: 'sass-loader',
            options: {
              sourceMap: true,
            },
          },
          {
            loader: 'sass-resources-loader',
            options: {
              resources: [
                path.resolve(__dirname, './src/client/styling/styles/variables.scss'),
              ],
            },
          },
        ],
      }),
    },
  ],
},
plugins: [
  // new BundleAnalyzerPlugin(),
  new webpack.optimize.UglifyJsPlugin({
    sourceMap: true,
  }),
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
  }),
]

还有package.json里的构建和启动脚本:

"build-client": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js",
"start": "cross-env NODE_ENV=production node ./src/build/bundle.js",

排查过程

一开始我以为是Heroku的问题,刷新应用后去看heroku logs,发现了和source-map相关的H12请求超时错误——这说明.map文件其实是存在的,但浏览器根本拿不到它。

最终解决方案

折腾了半天,才发现问题根本不在Heroku,而是我在Heroku应用和服务器之间加的Nginx配置!原来的Nginx静态资源规则里没包含.map扩展名:

location ~* \.(js|css|gif|png|jpg|ico|svg|eot|ttf|otf|woff|woff2|json|xml)$ {
  root "/app/src/dist/";
  add_header Pragma public;
  add_header Cache-Control public;
  expires 1y;
  gzip_static on;
  gzip off;
  log_not_found off;
  access_log off;
}

只要把map加到扩展名列表里,改成下面这样:

location ~* \.(js|css|gif|png|jpg|ico|svg|eot|ttf|otf|woff|woff2|json|xml|map)$ {
  root "/app/src/dist/";
  add_header Pragma public;
  add_header Cache-Control public;
  expires 1y;
  gzip_static on;
  gzip off;
  log_not_found off;
  access_log off;
}

重新部署后,source-map就正常生效了,终于能愉快地调试压缩后的代码啦!

内容的提问来源于stack exchange,提问作者Igor-Vuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:48:39