繁体   English   中英

配置SourceMapDevToolPlugin生成“源映射”

[英]configure SourceMapDevToolPlugin to generate “source-map”

TL; DR

我需要在SourceMapDevToolPlugin中设置哪些配置选项来模拟devtool: 'source-map'

必须使用SourceMapDevToolPlugin来避免为我的供应商模块生成源映射....但我想要source-map样式映射,而不是inline-source-map

细节:

我正在使用webpack 4,并且不想浪费时间生成vendor.js.map ,所以我不能只设置devtool而是我这样做:

https://webpack.js.org/plugins/source-map-dev-tool-plugin/#exclude-vendor-maps

但我注意到这个评论:

您可以使用以下代码将配置选项devtool:inline-source-map替换为等效的自定义插件配置:

我,为了我的生活,无法弄清楚我需要传递给插件来复制devtool: 'source-map' ,而不是inline-source-map

我的package.json:

"scripts": {
   "build": "webpack -p --config webpack.prod.js",
   "start": "webpack-dev-server --debug --bail --config webpack.dev.js"
},

我的(相关)webpack配置:

module.exports = {
   devtool: false, // using SourceMapDevToolPlugin instead
   optimization: {
     splitChunks: {
       cacheGroups: {
         commons: {
           test: /[\\/]node_modules[\\/]/,
           name: 'vendors',
           chunks: 'all'
         },
         styles: {
           test: /\.css$/,
           name: 'styles',
           chunks: 'all'
         }
      }
   },
   plugins: [
     new webpack.SourceMapDevToolPlugin({
       filename: '[name].map',
       exclude: ['vendor.js']
     })
   ]
}

和我的开发配置:

module.exports = merge(common, {
  mode: 'development',
  devServer: {
    contentBase: './public',
    stats: 'minimal'
  }
});

和我的prod配置

module.exports = merge(common, {
  mode: 'production',
  stats: 'errors-only'
});

我试图从源地图中排除部分代码时面临同样的问题。 由于我无法在互联网上得到满意的答案,我查看了Webpack的源代码,发现Webpack使用了以下代码

https://github.com/webpack/webpack/blob/master/lib/WebpackOptionsApply.js

if (
            options.devtool &&
            (options.devtool.includes("sourcemap") ||
                options.devtool.includes("source-map"))
        ) {
            const hidden = options.devtool.includes("hidden");
            const inline = options.devtool.includes("inline");
            const evalWrapped = options.devtool.includes("eval");
            const cheap = options.devtool.includes("cheap");
            const moduleMaps = options.devtool.includes("module");
            noSources = options.devtool.includes("nosources");
            legacy = options.devtool.includes("@");
            modern = options.devtool.includes("#");
            comment =
                legacy && modern
                    ? "\n/*\n//@ source" +
                      "MappingURL=[url]\n//# source" +
                      "MappingURL=[url]\n*/"
                    : legacy
                    ? "\n/*\n//@ source" + "MappingURL=[url]\n*/"
                    : modern
                    ? "\n//# source" + "MappingURL=[url]"
                    : null;
            const Plugin = evalWrapped
                ? EvalSourceMapDevToolPlugin
                : SourceMapDevToolPlugin;
            new Plugin({
                filename: inline ? null : options.output.sourceMapFilename,
                moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
                fallbackModuleFilenameTemplate:
                    options.output.devtoolFallbackModuleFilenameTemplate,
                append: hidden ? false : comment,
                module: moduleMaps ? true : cheap ? false : true,
                columns: cheap ? false : true,
                lineToLine: options.output.devtoolLineToLine,
                noSources: noSources,
                namespace: options.output.devtoolNamespace
            }).apply(compiler);
        }

所以你可以看到,SourceMapDevToolPlugin的选项可能依赖于你的一些输出webpack配置(sourceMapFilename,devtoolModuleFilenameTemplate,devtoolFallbackModuleFilenameTemplate,devtoolLineToLine,devtoolNamespace - 参见https://webpack.js.org/configuration/output )。

对于我的webpack配置,当我使用devtool时,进入SourceMapDevToolPlugin的最终选项:'source-map'如下:

{
    "filename": "[file].map[query]",
    "append": null,
    "module": true,
    "columns": true,
    "lineToLine": false,
    "noSources": false,
    "namespace": ""
}

如果您没有使用任何上述输出选项,那么上述内容应该没问题。 否则,您需要考虑它们。 您可以修改node_modules / webpack / lib / WebpackOptionsApply.js以添加带有JSON.stringify()的console.log,以查看Webpack配置使用的确切参数。

希望这可以帮助。

从文档中,强调我的:

filenamestring ):定义SourceMap的输出文件名( 如果没有提供值,则将内联 )。

这意味着如果指定filename选项,则与devtool: 'source-map'具有相同的行为devtool: 'source-map'

devtool: 'inline-source-map' === new webpack.SourceMapDevToolPlugin({})

devtool: 'source-map' === new webpack.SourceMapDevToolPlugin({ filename: '[file].map' })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM