настроить SourceMapDevToolPlugin для генерации «карты-источника» - PullRequest
0 голосов
/ 07 сентября 2018

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

my package.json:

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

мой (релевантный) конфиг веб-пакета:

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']
     })
   ]
}

и мой конфиг dev:

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

и мой prod config

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

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Я столкнулся с тем же вопросом, пытаясь исключить часть кода из исходной карты. Поскольку я не мог получить ответы на свои вопросы в Интернете, я посмотрел исходные коды 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 могут зависеть от некоторых ваших конфигураций выходного веб-пакета (sourceMapFilename, devtoolModuleFilenameTemplate, devtoolFallbackModuleFilenameTemplate, devtoolLineToLine, devtoolNamespace - см. https://webpack.js.org/configuration/output).

Для моей конфигурации веб-пакета последние параметры, которые входили в SourceMapDevToolPlugin, когда я использовал devtool: 'source-map', были следующими:

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

Если вы не используете ни одну из упомянутых опций вывода, то вышеприведенное должно подойти вам. В противном случае вам нужно будет принять их во внимание. Вы можете изменить node_modules / webpack / lib / WebpackOptionsApply.js, добавив console.log с JSON.stringify (), чтобы увидеть, какие именно параметры были использованы для вашей конфигурации Webpack.

Надеюсь, это поможет.

0 голосов
/ 08 марта 2019

Из документов, акцент мой:

filename (string): Определяет имя выходного файла SourceMap (будет встроенным, если значение не указано ).

, что означает, что если вы укажете опцию filename, у вас будет поведение, идентичное devtool: 'source-map'

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

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

...