webpack.prod.babel.js 4.2 KB
Newer Older
Julien Benchetrit's avatar
Julien Benchetrit committed
1 2 3 4
// Important modules this config uses
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const WebpackPwaManifest = require('webpack-pwa-manifest');
邓超's avatar
邓超 committed
5 6
// const OfflinePlugin = require('offline-plugin');
// const { HashedModuleIdsPlugin } = require('webpack');
Julien Benchetrit's avatar
Julien Benchetrit committed
7 8 9 10 11 12 13
const TerserPlugin = require('terser-webpack-plugin');
const CompressionPlugin = require('compression-webpack-plugin');

module.exports = require('./webpack.base.babel')({
  mode: 'production',

  // In production, we skip all hot-reloading stuff
14
  entry: [require.resolve('react-app-polyfill/ie11'), path.join(process.cwd(), 'src/app.js')],
Julien Benchetrit's avatar
Julien Benchetrit committed
15 16

  // Utilize long-term caching by adding content hashes (not compilation hashes) to compiled assets
tianfen's avatar
tianfen committed
17
  // [chunkhash:8] [chunkhash:8]
Julien Benchetrit's avatar
Julien Benchetrit committed
18
  output: {
邓晓峰's avatar
邓晓峰 committed
19 20
    filename: 'static/[name].[chunkhash:8].js',
    chunkFilename: 'static/[name].[chunkhash:8].chunk.js',
Julien Benchetrit's avatar
Julien Benchetrit committed
21 22 23 24
  },

  optimization: {
    minimize: true,
25 26 27
    minimizer: [
      new TerserPlugin({
        terserOptions: {
28 29 30 31 32 33 34
          // warnings: false,
          // compress: {
          //   comparisons: false,
          //   drop_console: true,
          //   drop_debugger: true,
          //   pure_funcs: ['console.log'], //移除console
          // },
35 36 37 38 39 40 41 42 43 44 45 46
          parse: {},
          mangle: true,
          output: {
            comments: false,
            ascii_only: true,
          },
        },
        parallel: true,
        cache: true,
        sourceMap: true,
      }),
    ],
Julien Benchetrit's avatar
Julien Benchetrit committed
47 48 49 50 51 52
    nodeEnv: 'production',
    sideEffects: true,
    concatenateModules: true,
    runtimeChunk: 'single',
    splitChunks: {
      chunks: 'all',
53 54 55 56 57 58 59 60 61 62 63
      maxInitialRequests: 10,
      minSize: 0,
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name(module) {
            const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
            return `npm.${packageName.replace('@', '')}`;
          },
        },
      },
Julien Benchetrit's avatar
Julien Benchetrit committed
64 65 66 67 68 69
    },
  },

  plugins: [
    // Minify and optimize the index.html
    new HtmlWebpackPlugin({
dengxiaofeng's avatar
dengxiaofeng committed
70
      template: 'src/index.html',
Julien Benchetrit's avatar
Julien Benchetrit committed
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
      minify: {
        removeComments: true,
        collapseWhitespace: true,
        removeRedundantAttributes: true,
        useShortDoctype: true,
        removeEmptyAttributes: true,
        removeStyleLinkTypeAttributes: true,
        keepClosingSlash: true,
        minifyJS: true,
        minifyCSS: true,
        minifyURLs: true,
      },
      inject: true,
    }),

    // Put it in the end to capture all the HtmlWebpackPlugin's
    // assets manipulations and do leak its manipulations to HtmlWebpackPlugin
邓超's avatar
邓超 committed
88 89 90 91
    // new OfflinePlugin({
    //   relativePaths: false,
    //   publicPath: '/',
    //   appShell: '/',
Julien Benchetrit's avatar
Julien Benchetrit committed
92

邓超's avatar
邓超 committed
93 94 95
    //   // No need to cache .htaccess. See http://mxs.is/googmp,
    //   // this is applied before any match in `caches` section
    //   excludes: ['.htaccess'],
Julien Benchetrit's avatar
Julien Benchetrit committed
96

邓超's avatar
邓超 committed
97 98
    //   caches: {
    //     main: [':rest:'],
Julien Benchetrit's avatar
Julien Benchetrit committed
99

邓超's avatar
邓超 committed
100 101 102 103 104
    //     // All chunks marked as `additional`, loaded after main section
    //     // and do not prevent SW to install. Change to `optional` if
    //     // do not want them to be preloaded at all (cached only when first loaded)
    //     additional: ['*.chunk.js'],
    //   },
Julien Benchetrit's avatar
Julien Benchetrit committed
105

邓超's avatar
邓超 committed
106 107 108
    //   // Removes warning for about `additional` section usage
    //   safeToUseOptionalCaches: true,
    // }),
Julien Benchetrit's avatar
Julien Benchetrit committed
109 110 111 112 113 114 115 116 117

    new CompressionPlugin({
      algorithm: 'gzip',
      test: /\.js$|\.css$|\.html$/,
      threshold: 10240,
      minRatio: 0.8,
    }),

    new WebpackPwaManifest({
dengxiaofeng's avatar
dengxiaofeng committed
118 119 120
      name: '运维管理平台',
      short_name: '运维管理平台',
      description: '运维管理平台',
Julien Benchetrit's avatar
Julien Benchetrit committed
121 122 123 124 125 126
      background_color: '#fafafa',
      theme_color: '#b1624d',
      inject: true,
      ios: true,
      icons: [
        {
dengxiaofeng's avatar
dengxiaofeng committed
127
          src: path.resolve('src/images/icon-512x512.png'),
Julien Benchetrit's avatar
Julien Benchetrit committed
128 129 130
          sizes: [72, 96, 128, 144, 192, 384, 512],
        },
        {
dengxiaofeng's avatar
dengxiaofeng committed
131
          src: path.resolve('src/images/icon-512x512.png'),
Julien Benchetrit's avatar
Julien Benchetrit committed
132 133 134 135 136 137
          sizes: [120, 152, 167, 180],
          ios: true,
        },
      ],
    }),

邓超's avatar
邓超 committed
138 139 140 141 142
    // new HashedModuleIdsPlugin({
    //   hashFunction: 'sha256',
    //   hashDigest: 'hex',
    //   hashDigestLength: 20,
    // }),
Julien Benchetrit's avatar
Julien Benchetrit committed
143 144 145
  ],

  performance: {
146
    assetFilter: assetFilename => !/(\.map$)|(^(main\.|favicon\.))/.test(assetFilename),
Julien Benchetrit's avatar
Julien Benchetrit committed
147 148
  },
});