d9f99f65a5dbd8c8e69561b73168440c461f2a1e
[bottlenecks.git] / testing-scheduler / ui / build / webpack.prod.conf.js
1 'use strict'
2 const path = require('path')
3 const utils = require('./utils')
4 const webpack = require('webpack')
5 const config = require('../config')
6 const merge = require('webpack-merge')
7 const baseWebpackConfig = require('./webpack.base.conf')
8 const CopyWebpackPlugin = require('copy-webpack-plugin')
9 const HtmlWebpackPlugin = require('html-webpack-plugin')
10 const ExtractTextPlugin = require('extract-text-webpack-plugin')
11 const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
12 const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
13
14 const env = require('../config/prod.env')
15
16 const webpackConfig = merge(baseWebpackConfig, {
17   module: {
18     rules: utils.styleLoaders({
19       sourceMap: config.build.productionSourceMap,
20       extract: true,
21       usePostCSS: true
22     })
23   },
24   devtool: config.build.productionSourceMap ? config.build.devtool : false,
25   output: {
26     path: config.build.assetsRoot,
27     filename: utils.assetsPath('js/[name].[chunkhash].js'),
28     chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
29   },
30   plugins: [
31     // http://vuejs.github.io/vue-loader/en/workflow/production.html
32     new webpack.DefinePlugin({
33       'process.env': env
34     }),
35     new UglifyJsPlugin({
36       uglifyOptions: {
37         compress: {
38           warnings: false
39         }
40       },
41       sourceMap: config.build.productionSourceMap,
42       parallel: true
43     }),
44     // extract css into its own file
45     new ExtractTextPlugin({
46       filename: utils.assetsPath('css/[name].[contenthash].css'),
47       // Setting the following option to `false` will not extract CSS from codesplit chunks.
48       // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
49       // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
50       // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
51       allChunks: true,
52     }),
53     // Compress extracted CSS. We are using this plugin so that possible
54     // duplicated CSS from different components can be deduped.
55     new OptimizeCSSPlugin({
56       cssProcessorOptions: config.build.productionSourceMap
57         ? { safe: true, map: { inline: false } }
58         : { safe: true }
59     }),
60     // generate dist index.html with correct asset hash for caching.
61     // you can customize output by editing /index.html
62     // see https://github.com/ampedandwired/html-webpack-plugin
63     new HtmlWebpackPlugin({
64       filename: config.build.index,
65       template: 'index.html',
66       inject: true,
67       minify: {
68         removeComments: true,
69         collapseWhitespace: true,
70         removeAttributeQuotes: true
71         // more options:
72         // https://github.com/kangax/html-minifier#options-quick-reference
73       },
74       // necessary to consistently work with multiple chunks via CommonsChunkPlugin
75       chunksSortMode: 'dependency'
76     }),
77     // keep module.id stable when vendor modules does not change
78     new webpack.HashedModuleIdsPlugin(),
79     // enable scope hoisting
80     new webpack.optimize.ModuleConcatenationPlugin(),
81     // split vendor js into its own file
82     new webpack.optimize.CommonsChunkPlugin({
83       name: 'vendor',
84       minChunks (module) {
85         // any required modules inside node_modules are extracted to vendor
86         return (
87           module.resource &&
88           /\.js$/.test(module.resource) &&
89           module.resource.indexOf(
90             path.join(__dirname, '../node_modules')
91           ) === 0
92         )
93       }
94     }),
95     // extract webpack runtime and module manifest to its own file in order to
96     // prevent vendor hash from being updated whenever app bundle is updated
97     new webpack.optimize.CommonsChunkPlugin({
98       name: 'manifest',
99       minChunks: Infinity
100     }),
101     // This instance extracts shared chunks from code splitted chunks and bundles them
102     // in a separate chunk, similar to the vendor chunk
103     // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
104     new webpack.optimize.CommonsChunkPlugin({
105       name: 'app',
106       async: 'vendor-async',
107       children: true,
108       minChunks: 3
109     }),
110
111     // copy custom static assets
112     new CopyWebpackPlugin([
113       {
114         from: path.resolve(__dirname, '../static'),
115         to: config.build.assetsSubDirectory,
116         ignore: ['.*']
117       }
118     ])
119   ]
120 })
121
122 if (config.build.productionGzip) {
123   const CompressionWebpackPlugin = require('compression-webpack-plugin')
124
125   webpackConfig.plugins.push(
126     new CompressionWebpackPlugin({
127       asset: '[path].gz[query]',
128       algorithm: 'gzip',
129       test: new RegExp(
130         '\\.(' +
131         config.build.productionGzipExtensions.join('|') +
132         ')$'
133       ),
134       threshold: 10240,
135       minRatio: 0.8
136     })
137   )
138 }
139
140 if (config.build.bundleAnalyzerReport) {
141   const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
142   webpackConfig.plugins.push(new BundleAnalyzerPlugin())
143 }
144
145 module.exports = webpackConfig