| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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 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 OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') |
| const { VueLoaderPlugin } = require('vue-loader') |
| |
| function resolve(dir) { |
| return path.join(__dirname, '..', dir) |
| } |
| |
| const env = require('../config/prod.env') |
| |
| const webpackConfig = merge(baseWebpackConfig, { |
| mode: 'production', |
| module: { |
| rules: utils.styleLoaders({ |
| sourceMap: config.build.productionSourceMap, |
| extract: true, |
| usePostCSS: true |
| }) |
| }, |
| devtool: config.build.productionSourceMap ? config.build.devtool : false, |
| output: { |
| path: config.build.assetsRoot, |
| filename: utils.assetsPath('js/[name].[chunkhash].js'), |
| chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') |
| }, |
| optimization: { |
| providedExports: true, |
| usedExports: true, // tree shaking |
| sideEffects: true, |
| concatenateModules: true, |
| noEmitOnErrors: true, |
| splitChunks: { |
| chunks: 'all', |
| minSize: 30000, |
| maxSize: 0, |
| minChunks: 1, |
| maxAsyncRequests: 5, |
| maxInitialRequests: 3, |
| automaticNameDelimiter: '~', |
| name: true, |
| cacheGroups: { |
| vendors: { |
| test: /[\\/]node_modules[\\/]/, |
| priority: -10 |
| }, |
| default: { |
| priority: -20, |
| reuseExistingChunk: true |
| } |
| } |
| }, |
| runtimeChunk: { |
| name: 'manifest' |
| } |
| }, |
| plugins: [ |
| // http://vuejs.github.io/vue-loader/en/workflow/production.html |
| new webpack.DefinePlugin({ |
| 'process.env': env |
| }), |
| new VueLoaderPlugin(), |
| new MiniCssExtractPlugin({ |
| filename: utils.assetsPath('css/[name].[contenthash].css') |
| }), |
| // Compress extracted CSS. We are using this plugin so that possible |
| // duplicated CSS from different components can be deduped. |
| new OptimizeCSSPlugin({ |
| cssProcessorOptions: config.build.productionSourceMap |
| ? { safe: true, map: { inline: false }} |
| : { safe: true } |
| }), |
| // generate dist index.html with correct asset hash for caching. |
| // you can customize output by editing /index.html |
| // see https://github.com/ampedandwired/html-webpack-plugin |
| new HtmlWebpackPlugin({ |
| filename: config.build.index, |
| template: 'index.html', |
| inject: true, |
| favicon: resolve('static/favicon.png'), |
| title: 'shardingsphere-ui', |
| minify: { |
| removeComments: true, |
| collapseWhitespace: true, |
| removeAttributeQuotes: true |
| // more options: |
| // https://github.com/kangax/html-minifier#options-quick-reference |
| }, |
| // necessary to consistently work with multiple chunks via CommonsChunkPlugin |
| chunksSortMode: 'dependency' |
| }), |
| // keep module.id stable when vendor modules does not change |
| new webpack.HashedModuleIdsPlugin(), |
| // copy custom static assets |
| new CopyWebpackPlugin([ |
| { |
| from: path.resolve(__dirname, '../static'), |
| to: config.build.assetsSubDirectory, |
| ignore: ['.*'] |
| } |
| ]) |
| ] |
| }) |
| |
| if (config.build.productionGzip) { |
| const CompressionWebpackPlugin = require('compression-webpack-plugin') |
| |
| webpackConfig.plugins.push( |
| new CompressionWebpackPlugin({ |
| asset: '[path].gz[query]', |
| algorithm: 'gzip', |
| test: new RegExp( |
| '\\.(' + config.build.productionGzipExtensions.join('|') + ')$' |
| ), |
| threshold: 10240, |
| minRatio: 0.8 |
| }) |
| ) |
| } |
| |
| if (config.build.bundleAnalyzerReport) { |
| const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') |
| .BundleAnalyzerPlugin |
| webpackConfig.plugins.push(new BundleAnalyzerPlugin()) |
| } |
| |
| module.exports = webpackConfig |