123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- const merge = require('webpack-merge');
- const common = require('./webpack.common.config.js');
- const HtmlWebpackPlugin = require('html-webpack-plugin');
- const { CleanWebpackPlugin } = require('clean-webpack-plugin');
- const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
- const MiniCssExtractPlugin = require('mini-css-extract-plugin');
- const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
- const TerserPlugin = require('terser-webpack-plugin');
- module.exports = merge(common, {
- mode: 'production',
- output: {
- filename: 'js/[name].[chunkhash:8].js',
- },
- module: {
- rules: [
- {
- test: /\.css$/,
- use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'],
- },
- {
- test: /\.less$/,
- use: [
- MiniCssExtractPlugin.loader,
- 'css-loader',
- 'less-loader',
- 'postcss-loader',
- ],
- },
- // {
- // test: /\.(scss|sass)$/,
- // use: [
- // MiniCssExtractPlugin.loader,
- // 'css-loader',
- // 'postcss-loader',
- // 'sass-loader'
- // ]
- // },
- ],
- },
- plugins: [
- new HtmlWebpackPlugin({
- filename: 'index.html',
- template: 'public/index.html',
- inject: 'body',
- minify: {
- removeComments: true,
- collapseWhitespace: true,
- },
- }),
- new CleanWebpackPlugin(),
- new MiniCssExtractPlugin({
- filename: 'css/[name].[hash].css',
- chunkFilename: 'css/[id].[hash].css',
- }),
- ],
- optimization: {
- minimizer: [
- new UglifyJsPlugin(),
- new OptimizeCssAssetsPlugin({
- assetNameRegExp: /\.css$/g,
- cssProcessor: require('cssnano'),
- cssProcessorPluginOptions: {
- preset: ['default', { discardComments: { removeAll: true } }],
- },
- canPrint: true,
- }),
- // This is only used in production mode
- new TerserPlugin({
- terserOptions: {
- parse: {
- // We want terser to parse ecma 8 code. However, we don't want it
- // to apply any minification steps that turns valid ecma 5 code
- // into invalid ecma 5 code. This is why the 'compress' and 'output'
- // sections only apply transformations that are ecma 5 safe
- // https://github.com/facebook/create-react-app/pull/4234
- ecma: 8,
- },
- compress: {
- ecma: 5,
- warnings: false,
- // Disabled because of an issue with Uglify breaking seemingly valid code:
- // https://github.com/facebook/create-react-app/issues/2376
- // Pending further investigation:
- // https://github.com/mishoo/UglifyJS2/issues/2011
- comparisons: false,
- // Disabled because of an issue with Terser breaking valid code:
- // https://github.com/facebook/create-react-app/issues/5250
- // Pending further investigation:
- // https://github.com/terser-js/terser/issues/120
- inline: 2,
- },
- mangle: {
- safari10: true,
- },
- // Added for profiling in devtools
- keep_classnames: true,
- keep_fnames: true,
- output: {
- ecma: 5,
- comments: false,
- // Turned on because emoji and regex is not minified properly using default
- // https://github.com/facebook/create-react-app/issues/2488
- ascii_only: true,
- },
- },
- sourceMap: true,
- }),
- ],
- splitChunks: {
- chunks: 'all',
- minSize: 30000,
- maxSize: 0,
- minChunks: 1,
- cacheGroups: {
- framework: {
- test: 'framework',
- name: 'framework',
- enforce: true,
- },
- vendors: {
- priority: -10,
- test: /node_modules/,
- name: 'vendor',
- enforce: true,
- },
- },
- },
- },
- });
|