134 lines
3.4 KiB
JavaScript
134 lines
3.4 KiB
JavaScript
'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
|