Files
payload/src/webpack/getProdConfig.ts

73 lines
1.9 KiB
TypeScript

import TerserJSPlugin from 'terser-webpack-plugin';
import MiniCSSExtractPlugin from 'mini-css-extract-plugin';
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import path from 'path';
import { Configuration } from 'webpack';
import { SanitizedConfig } from '../config/types';
import getBaseConfig from './getBaseConfig';
export default (payloadConfig: SanitizedConfig): Configuration => {
const baseConfig = getBaseConfig(payloadConfig) as any;
let config: Configuration = {
...baseConfig,
output: {
publicPath: `${payloadConfig.routes.admin}/`,
path: path.resolve(process.cwd(), 'build'),
filename: '[name].[chunkhash].js',
chunkFilename: '[name].[chunkhash].js',
},
mode: 'production',
stats: 'errors-only',
optimization: {
minimizer: [new TerserJSPlugin({}), new CssMinimizerPlugin()],
splitChunks: {
cacheGroups: {
styles: {
name: 'styles',
test: /\.(sa|sc|c)ss$/,
chunks: 'all',
enforce: true,
},
},
},
},
plugins: [
...baseConfig.plugins,
new MiniCSSExtractPlugin({
filename: '[name].css',
ignoreOrder: true,
}),
],
};
config.module.rules.push({
test: /\.(scss|css)$/,
sideEffects: true,
use: [
MiniCSSExtractPlugin.loader,
require.resolve('css-loader'),
{
loader: require.resolve('postcss-loader'),
options: {
postcssOptions: {
plugins: [require.resolve('postcss-preset-env')],
},
},
},
require.resolve('sass-loader'),
],
});
if (process.env.PAYLOAD_ANALYZE_BUNDLE) {
config.plugins.push(new BundleAnalyzerPlugin());
}
if (payloadConfig.admin.webpack && typeof payloadConfig.admin.webpack === 'function') {
config = payloadConfig.admin.webpack(config);
}
return config;
};