如何使用 webpack 更改 `sourceMappingURL`

How to change `sourceMappingURL` by using webpack

我的生产 webpack 配置是:

{
  output: {
    publicPath: "https://cdn.example.com/sub-directory/",
    filename: '[name]-[chunkhash].min.js'
  },

  devtool: 'source-map',

  plugins: [
    new webpack.optimize.UglifyJsPlugin()
  ]
}

现在我有两个文件 app-12345.min.jsapp-12345.min.js.map

我也为主脚本自动生成CDN URL https://cdn.example.com/sub-directory/app-12345.min.js

但是 sourceMappingURL 仍然是相对路径 //# sourceMappingURL=app-12345.min.js.map 并且不能直接在浏览器中访问。

我的问题是如何将 sourceMappingURL 设置为自动生成的绝对路径?

SourceMapDevToolPlugin 插件是一个选项。

new webpack.SourceMapDevToolPlugin({
    filename: '[file].map',
    append: '\n//# sourceMappingURL=' + path + '[url]'
});

最后,这在 Webpack 3 中是可能的,使用 @omj 的响应指南和以下配置

  devtool: 'hidden-source-map', // SourceMap without reference in original file

  new webpack.SourceMapDevToolPlugin({
    filename: '[file].map',
    append: `\n//# sourceMappingURL=${path}[url]`
  })

更新(Webpack v3.10.0):

自 Webpack v3.10.0 以来添加了一个新选项。名为 publicPath 的选项:

new webpack.SourceMapDevToolPlugin({
  filename: '[file].map',
  publicPath: 'https://example.com/dev/'
});

在 Webpack 2 中,您可以使用 hidden-source-map 作为 devtool 和 banner-webpack-plugin 来自 https://github.com/lcxfs1991/banner-webpack-plugin 并设置如下:

new banner({
    chunks: {
        "main": {
            afterContent: "\n//# sourceMappingURL=custom/url/to/map\n"
         }
    }
})

注意开发工具:false。如果您想提供自定义值,则需要它。 这适用于 webpack 4.x:

module.exports = {
  // ...
  devtool: false,
  plugins: [
    new webpack.SourceMapDevToolPlugin({
       filename: 'sourcemaps/[file].map',
       publicPath: 'https://example.com/project/',
       fileContext: 'public'
  })
  ]
};