'use strict' const path = require('path') const utils = require('./utils') const webpack = require('webpack') const config = require('../config') const { merge } = require('webpack-merge') const baseWebpackConfig = require('./webpack.base.conf') const CopyWebpackPlugin = require('copy-webpack-plugin') const HtmlWebpackPlugin = require('html-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') const TerserPlugin = require('terser-webpack-plugin') const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') function resolve(dir) { return path.join(__dirname, '..', dir) } const env = require('../config/prod.env') const webpackConfig = merge(baseWebpackConfig, { mode: 'production', devtool: config.build.productionSourceMap ? config.build.devtool : false, output: { path: config.build.assetsRoot, filename: utils.assetsPath('js/[name].[contenthash:8].js'), chunkFilename: utils.assetsPath('js/[name].[contenthash:8].chunk.js'), publicPath: config.build.assetsPublicPath }, plugins: [ new webpack.DefinePlugin({ 'process.env': env }), new MiniCssExtractPlugin({ filename: utils.assetsPath('css/[name].[contenthash:8].css'), chunkFilename: utils.assetsPath('css/[name].[contenthash:8].css') }), new HtmlWebpackPlugin({ filename: config.build.index, template: 'index.html', inject: true, favicon: resolve('favicon.ico'), title: '信息管理系统', minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true, minifyCSS: true, minifyJS: true } }), new CopyWebpackPlugin({ patterns: [ { from: path.resolve(__dirname, '../static'), to: config.build.assetsSubDirectory, globOptions: { ignore: ['.*'] } } ] }) ], optimization: { minimize: true, minimizer: [ new TerserPlugin({ parallel: true, terserOptions: { compress: { drop_console: true } } }), new CssMinimizerPlugin() ], splitChunks: { chunks: 'all', cacheGroups: { libs: { name: 'chunk-libs', test: /[\\/]node_modules[\\/]/, priority: 10, chunks: 'initial' }, elementUI: { name: 'chunk-elementUI', priority: 20, test: /[\\/]node_modules[\\/]element-ui[\\/]/ }, commons: { name: 'chunk-commons', test: resolve('src/components'), minChunks: 3, priority: 5, reuseExistingChunk: true } } }, runtimeChunk: { name: 'runtime' } }, performance: { hints: 'warning', maxEntrypointSize: 512000, maxAssetSize: 512000 } }) if (config.build.productionGzip) { const CompressionWebpackPlugin = require('compression-webpack-plugin') webpackConfig.plugins.push( new CompressionWebpackPlugin({ filename: '[path][base].gz', algorithm: 'gzip', test: new RegExp(`\\.(${config.build.productionGzipExtensions.join('|')})$`), threshold: 10240, minRatio: 0.8 }) ) } if (config.build.bundleAnalyzerReport) { webpackConfig.plugins.push( new BundleAnalyzerPlugin({ analyzerPort: 8888 }) ) } module.exports = webpackConfig