/* eslint-disable no-process-env, no-console */ const path = require('path'); const config = require('./config'); const utils = require('./utils'); const webpack = require('webpack'); const merge = require('webpack-merge'); const baseWebpackConfig = require('./webpack.base.conf'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const env = process.env.NODE_ENV === 'test' ? require('./config/test.env') : config.build.env; const webpackConfig = merge(baseWebpackConfig, { module: { rules: utils.styleLoaders({ sourceMap: config.build.productionSourceMap, extract: true }), }, devtool: config.build.productionSourceMap ? '#source-map' : false, output: { path: config.build.assetsRoot, filename: utils.assetsPath('js/[name].[chunkhash].js'), chunkFilename: utils.assetsPath('js/[id].[chunkhash].js'), }, plugins: [ // http://vuejs.github.io/vue-loader/workflow/production.html new webpack.DefinePlugin({ 'process.env': env, }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false, }, sourceMap: true, }), // extract css into its own file new ExtractTextPlugin({ filename: utils.assetsPath('css/[name].[contenthash].css'), }), // 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: process.env.NODE_ENV === 'test' ? 'index.html' : config.build.index, template: './website/client/index.html', inject: true, 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', }), // split vendor js into its own file new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks (scriptModule) { // any required modules inside node_modules are extracted to vendor return ( scriptModule.resource && /\.js$/.test(scriptModule.resource) && scriptModule.resource.indexOf( path.join(__dirname, '../node_modules') ) === 0 ); }, }), // extract webpack runtime and module manifest to its own file in order to // prevent vendor hash from being updated whenever app bundle is updated new webpack.optimize.CommonsChunkPlugin({ name: 'manifest', chunks: ['vendor'], }), ], }); if (config.build.productionGzip) { const CompressionWebpackPlugin = require('compression-webpack-plugin'); // eslint-disable-line global-require 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; // eslint-disable-line global-require webpackConfig.plugins.push(new BundleAnalyzerPlugin()); } module.exports = webpackConfig;