仅为某些块生成源代码映射

5
我正在使用webpack构建我的应用程序。我生成了3个包:app.js、vendor.js和manifest.js。由于我在配置中添加了UglifyJsPlugin,因此还会生成3个sourcemap。
我只想为我的app.js包生成一个sourcemap,因为其他两个对我来说是无用的。 有没有办法告诉压缩器仅为我想要的块生成sourcemap,而不是全部生成?
以下是我目前的配置:
                               Asset       Size  Chunks                    Chunk Names
         app.1e1d20f5f417ed9df40d.js     901 kB    1, 2  [emitted]  [big]  app
     app.1e1d20f5f417ed9df40d.js.map    4.24 MB    1, 2  [emitted]         app
    manifest.05867db2f94981c04486.js    1.43 kB       2  [emitted]         manifest
manifest.05867db2f94981c04486.js.map    14.1 kB       2  [emitted]         manifest
     styles.1e1d20f5f417ed9df40d.css    42.3 kB    1, 2  [emitted]         app
 styles.1e1d20f5f417ed9df40d.css.map  108 bytes    1, 2  [emitted]         app
      vendor.2734c5cd65804c943c80.js    1.64 MB    0, 2  [emitted]  [big]  vendor
  vendor.2734c5cd65804c943c80.js.map    11.9 MB    0, 2  [emitted]         vendor

以下是我想要的内容:

                               Asset       Size  Chunks                    Chunk Names
         app.1e1d20f5f417ed9df40d.js     901 kB    1, 2  [emitted]  [big]  app
     app.1e1d20f5f417ed9df40d.js.map    4.24 MB    1, 2  [emitted]         app
    manifest.05867db2f94981c04486.js    1.43 kB       2  [emitted]         manifest
     styles.1e1d20f5f417ed9df40d.css    42.3 kB    1, 2  [emitted]         app
 styles.1e1d20f5f417ed9df40d.css.map  108 bytes    1, 2  [emitted]         app
      vendor.2734c5cd65804c943c80.js    1.64 MB    0, 2  [emitted]  [big]  vendor

如果需要的话,这是我的完整配置文件:

var ExtractTextPlugin = require("extract-text-webpack-plugin");
// var HtmlWebpackPlugin = require('html-webpack-plugin');
var path = require('path');
var webpack = require('webpack');

module.exports = {
  devtool: 'hidden-source-map',

  entry: {
    app: './src/scripts/app',
  },

  module: {
    rules: [
      {
        enforce: 'pre',
        exclude: /node_modules/,
        loader: "eslint-loader",
        options: {
          failOnWarning: false,
          failOnError: true,
        },
        test: /\.jsx?$/,
      },
      {
        exclude: /node_modules/,
        use: ['babel-loader'],
        test: /\.jsx?$/,
      },
      {
        exclude: /node_modules/,
        use: [
          'babel-loader',
          'style-loader',
          'css-loader',
          'sass-loader',
        ],
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: [
            'css-loader',
            'sass-loader',
          ],
        }),
        test: /\.scss$/,
      },
    ],
  },

  output: {
    filename: '[name].[chunkhash].js',
    path: path.join(__dirname, '/dist'),
  },

  plugins: [
    new ExtractTextPlugin('styles.[chunkhash].css'),

    // new HtmlWebpackPlugin({
    //   // favicon: paths.appFavicon,
    //   inject: 'body',
    //   minify: {
    //     collapseBooleanAttributes: true,
    //     collapseWhitespace: true,
    //     keepClosingSlash: true,
    //     removeComments: true,
    //     removeRedundantAttributes: true,
    //     removeScriptTypeAttributes: true,
    //     removeStyleLinkTypeAttributes: true,
    //     useShortDoctype: true,
    //   },
    //   showErrors: false,
    //   template: path.join(__dirname, '/src/index.html'),
    // }),

    new webpack.DefinePlugin({
      'process.env': {
        'NODE_ENV': JSON.stringify('production')
      },
      'ROLLBAR_ACCESS_TOKEN': JSON.stringify('e39dde52172a4b45a7d6039e5aa369eb'),
    }),

    new webpack.HashedModuleIdsPlugin(),

    new webpack.optimize.AggressiveMergingPlugin(),

    new webpack.optimize.OccurrenceOrderPlugin(true),

    // this is only be useful to extract common modules from multiple chunks
    // new webpack.optimize.CommonsChunkPlugin({
    //   minChunks: function (module, count) {
    //     return module.resource
    //       && module.resource.indexOf('node_modules') === -1
    //       && module.resource.match(/\.jsx?$/)
    //       && count > 2;
    //   },
    //   name: 'common',
    // }),

    new webpack.optimize.CommonsChunkPlugin({
      minChunks: function (module) {
        return module.resource
          && module.resource.indexOf('node_modules') !== -1;
      },
      name: 'vendor',
    }),

    new webpack.optimize.CommonsChunkPlugin({
      chunks: ['vendor'],
      name: 'manifest',
    }),

    new webpack.LoaderOptionsPlugin({
      debug: false,
      minimize: true,
    }),

    new webpack.optimize.UglifyJsPlugin({
      beautify: false,
      comments: false,
      compress: {
        screw_ie8: true,
        warnings: false,
      },
      mangle: {
        keep_fnames: true,
        screw_ie8: true,
      },
      sourceMap: true,
    }),

    new webpack.ProvidePlugin({
      $: 'jquery',
      'window.jQuery': 'jquery',
      Immutable: 'immutable',
      Fluxxor: 'fluxxor',
      jQuery: 'jquery',
      moment: 'moment',
      React: 'react',
      ReactDom: 'react-dom',
    }),
  ],

  resolve: {
    alias: {
      '~': path.join(__dirname, '/src/scripts'),
      '@': path.join(__dirname, '/src/stylesheets'),
    },
    extensions: [
      '.js',
      '.js.jsx',
      '.jsx',
      '.react.js.jsx',
    ],
  },
};

谢谢

1个回答

5

使用SourceMapDevToolPlugin代替devtool,您将能够排除以下文件:

new webpack.SourceMapDevToolPlugin({
    filename: "sourcemaps/[file].map",
    test: /\.(js|jsx|css)($|\?)/i,
    exclude: /vendor\..+\.js/
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接