const webpack = require('webpack'); const { merge } = require('webpack-merge'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const { WebpackManifestPlugin } = require('webpack-manifest-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const commonConfig = require('./common.js'); module.exports = merge(commonConfig, { output: { filename: '[name].js', }, mode: 'production', devtool: 'source-map', optimization: { minimize: true, minimizer: [ new TerserPlugin({ parallel: true, terserOptions: { output: { comments: false, }, }, extractComments: false, }), ], }, plugins: [ new MiniCssExtractPlugin(), new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify('production'), }, }), new WebpackManifestPlugin({ fileName: 'manifest.json', sort: (file1, file2) => file1.path.localeCompare(file2.path), }), ], module: { rules: [ { enforce: 'pre', test: /\.js$/, loader: 'eslint-loader', exclude: /node_modules/, }, { test: /\.js$/, exclude: /(node_modules)/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], }, }, }, { test: /\.(sa|sc|c)ss$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { importLoaders: 1, }, }, { loader: 'postcss-loader', options: { postcssOptions: { plugins: ['autoprefixer'], }, }, }, 'sass-loader', ], }, { test: /\.(jpg|png|gif|svg|ico)$/, include: /node_modules/, use: { loader: 'file-loader', options: { name: 'img/[name].[ext]', }, }, }, { test: /\.(jpg|png|gif|svg|ico)$/, exclude: /node_modules/, use: { loader: 'file-loader', options: { context: 'app/Resources/static', name: '[path][name].[ext]', }, }, }, { test: /\.(eot|ttf|woff|woff2)$/, use: { loader: 'file-loader', options: { name: 'fonts/[name].[ext]', }, }, }, ], }, });