const path = require('path'); const HtmlWebPackPlugin = require('html-webpack-plugin'); const getFilesFromDir = require('./config/files'); const PAGE_DIR = path.join('src', 'pages', path.sep); const htmlPlugins = getFilesFromDir(PAGE_DIR, ['.html', '.css']).map((filePath) => { const fileName = filePath.replace(PAGE_DIR, ''); return new HtmlWebPackPlugin({ chunks: [fileName.replace(path.extname(fileName), ''), 'vendor'], template: filePath, filename: fileName, }); }); const entry = getFilesFromDir(PAGE_DIR, ['.js']).reduce((obj, filePath) => { const entryChunkName = filePath.replace(path.extname(filePath), '').replace(PAGE_DIR, ''); obj[entryChunkName] = `./${filePath}`; return obj; }, {}); module.exports = (env, argv) => ({ entry, output: { path: path.join(__dirname, 'build'), filename: '[name].[hash:4].js', }, devtool: argv.mode === 'production' ? false : 'eval-source-maps', plugins: [ ...htmlPlugins, ], resolve: { alias: { src: path.resolve(__dirname, 'src'), components: path.resolve(__dirname, 'src', 'components'), }, }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: [ '@babel/preset-env', '@babel/preset-react', ], }, }, }, { test: /\.css$/, use: ['style-loader', 'css-loader'], exclude: /node_modules/, }], }, optimization: { minimize: argv.mode === 'production', splitChunks: { cacheGroups: { vendor: { test: /node_modules/, chunks: 'initial', name: 'vendor', enforce: true, }, }, }, }, });