| /* |
| * Copyright 2020, The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| 'use strict'; |
| |
| const webpack = require('webpack'); |
| const {merge} = require('webpack-merge'); |
| const path = require('path'); |
| const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); |
| const MiniCSSExtractPlugin = require('mini-css-extract-plugin'); |
| const CompressionPlugin = require('compression-webpack-plugin'); |
| const commonConfig = require('./webpack.config.common'); |
| const isProd = process.env.NODE_ENV === 'production'; |
| const environment = |
| isProd ? require('./env/prod.env') : require('./env/staging.env'); |
| |
| |
| const webpackConfig = merge(commonConfig, { |
| mode: 'production', |
| output: { |
| path: path.resolve(__dirname, 'dist'), |
| publicPath: '/', |
| filename: 'js/[hash].js', |
| chunkFilename: 'js/[id].[hash].chunk.js', |
| }, |
| optimization: { |
| runtimeChunk: 'single', |
| minimizer: [ |
| new OptimizeCSSAssetsPlugin({ |
| cssProcessorPluginOptions: { |
| preset: ['default', {discardComments: {removeAll: true}}], |
| }, |
| }), |
| ], |
| splitChunks: { |
| chunks: 'all', |
| maxInitialRequests: Infinity, |
| minSize: 0, |
| cacheGroups: { |
| vendor: { |
| test: /[\\/]node_modules[\\/]/, |
| name(module) { |
| const packageName = module.context |
| .match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]; |
| return `npm.${packageName.replace('@', '')}`; |
| }, |
| }, |
| styles: { |
| test: /\.css$/, |
| name: 'styles', |
| chunks: 'all', |
| enforce: true, |
| }, |
| }, |
| }, |
| }, |
| plugins: [ |
| new webpack.EnvironmentPlugin(environment), |
| new MiniCSSExtractPlugin({ |
| filename: 'css/[name].[hash].css', |
| chunkFilename: 'css/[id].[hash].css', |
| }), |
| new CompressionPlugin({ |
| filename: '[path].gz[query]', |
| algorithm: 'gzip', |
| test: new RegExp('\\.(js|css)$'), |
| threshold: 10240, |
| minRatio: 0.8, |
| }), |
| new webpack.HashedModuleIdsPlugin(), |
| ], |
| }); |
| |
| if (!isProd) { |
| webpackConfig.devtool = 'source-map'; |
| |
| if (process.env.npm_config_report) { |
| const BundleAnalyzerPlugin = |
| require('webpack-bundle-analyzer').BundleAnalyzerPlugin; |
| webpackConfig.plugins.push(new BundleAnalyzerPlugin()); |
| } |
| } |
| |
| module.exports = webpackConfig; |