@rockpack/compiler
Version:
The easiest webpack config generator.
102 lines (94 loc) • 2.49 kB
JavaScript
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const { isArray } = require('valid-types');
const makeOptimization = (mode, conf) => {
const optimization = {};
if (mode === 'development') {
Object.assign(optimization, {
checkWasmTypes: false,
chunkIds: 'named',
concatenateModules: false,
emitOnErrors: true,
flagIncludedChunks: false,
minimize: false,
moduleIds: 'named',
nodeEnv: mode,
removeAvailableModules: false,
splitChunks: {
hidePathInfo: false,
maxAsyncRequests: Infinity,
maxInitialRequests: Infinity,
minSize: 10000,
},
});
}
if (mode === 'production') {
Object.assign(optimization, {
checkWasmTypes: true,
chunkIds: 'total-size',
concatenateModules: true,
emitOnErrors: false,
flagIncludedChunks: true,
minimize: true,
minimizer: [
new ImageMinimizerPlugin({
minimizer: {
implementation: ImageMinimizerPlugin.sharpMinify,
options: {
encodeOptions: {
jpeg: {
quality: 80,
},
png: {
adaptiveFiltering: true,
force: true,
quality: 80,
},
},
},
},
}),
new TerserPlugin({
terserOptions: {
compress: {
drop_console: !conf.debug,
drop_debugger: !conf.debug,
},
mangle: true,
output: {
comments: /banner/,
},
},
}),
new CssMinimizerPlugin(),
],
moduleIds: 'size',
nodeEnv: mode,
removeAvailableModules: true,
removeEmptyChunks: true,
sideEffects: true,
splitChunks: {
hidePathInfo: true,
maxAsyncRequests: 5,
maxInitialRequests: 3,
minSize: 30000,
},
usedExports: true,
});
}
if (isArray(conf.vendor)) {
Object.assign(optimization.splitChunks, {
cacheGroups: {
defaultVendors: {
chunks: 'initial',
enforce: true,
name: 'vendor',
test: 'vendor',
},
},
});
}
return optimization;
};
module.exports = makeOptimization;