/* * 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;