const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const path = require('path'); const commonPaths = require('./paths'); module.exports = { output: { filename: `${commonPaths.jsFolder}/[name].[hash].js`, path: commonPaths.outputPath, publicPath: '/', chunkFilename: `${commonPaths.jsFolder}/[name].[chunkhash].js`, }, optimization: { minimizer: [ new TerserPlugin({ // Use multi-process parallel running to improve the build speed // Default number of concurrent runs: os.cpus().length - 1 parallel: true, // Enable file caching cache: true, sourceMap: true, }), new OptimizeCSSAssetsPlugin(), ], // Automatically split vendor and commons // https://twitter.com/wSokra/status/969633336732905474 // https://medium.com/webpack/webpack-4-code-splitting-chunk-graph-and-the-splitchunks-optimization-be739a861366 splitChunks: { cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'initial', }, async: { test: /[\\/]node_modules[\\/]/, name: 'async', chunks: 'async', minChunks: 4, }, }, }, // Keep the runtime chunk seperated to enable long term caching // https://twitter.com/wSokra/status/969679223278505985 runtimeChunk: true, }, module: { rules: [ { test: /\.(css|scss)$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { sourceMap: false, localsConvention: 'camelCase', modules: { localIdentName: '[local]___[hash:base64:5]', }, }, }, 'sass-loader', ], }, ], }, resolve: { modules: ['node_modules', 'app'], alias: { app: path.resolve(__dirname, '../', 'app'), }, }, plugins: [ new CleanWebpackPlugin(), new MiniCssExtractPlugin({ filename: `${commonPaths.cssFolder}/[name].css`, chunkFilename: `${commonPaths.cssFolder}/[name].css`, }), ], devtool: 'source-map', };