siegel
Version:
Web application development ecosystem
107 lines (106 loc) • 3.7 kB
JavaScript
import path from 'path';
import { COMMONS, DEPENDENCIES, pluginsKeysMap } from '../constants.js';
const { webpack, plugins: { HTMLPlugin, fileCopyPlugin, compressionPlugin, miniCssExtract, reactRefresh, serviceWorkerPlugin, eslint } } = DEPENDENCIES;
const { ESLintExtensions } = COMMONS;
function getDefaultPluginsConfig(config) {
const { build, server, runMode, publicDir } = config;
const { isProd, isServer } = runMode;
const { serveCompressionsPriority } = server;
const { input, output } = build;
const outputFilenames = output.filenames;
const compressionTypesSet = new Set(serveCompressionsPriority);
const compressionInstanceCommonOptions = {
test: /\.*$/,
threshold: 10240,
deleteOriginalAssets: false
};
return {
[pluginsKeysMap.compression]: {
plugin: compressionPlugin,
enabled: !!compressionTypesSet.size && isProd,
instances: {
br: {
enabled: compressionTypesSet.has('br'),
options: {
...compressionInstanceCommonOptions,
filename: outputFilenames.brotli,
algorithm: 'brotliCompress',
compressionOptions: {
level: 11
}
}
},
gzip: {
enabled: compressionTypesSet.has('gzip'),
options: {
...compressionInstanceCommonOptions,
filename: outputFilenames.gzip
}
}
}
},
[pluginsKeysMap.copy]: {
plugin: fileCopyPlugin,
enabled: !!input.copyFiles,
options: {
patterns: typeof input.copyFiles == 'string'
? [{
from: input.copyFiles,
to: path.join(publicDir, path.relative(path.dirname(input.html || input.js), input.copyFiles))
}]
: input.copyFiles
}
},
[pluginsKeysMap.sw]: {
plugin: serviceWorkerPlugin,
enabled: !!input.sw,
options: {
swPath: input.sw
}
},
[pluginsKeysMap.cssExtract]: {
plugin: miniCssExtract,
enabled: isProd || !isServer,
options: {
experimentalUseImportModule: true,
filename: outputFilenames.styles,
chunkFilename: outputFilenames.styles_chunk
}
},
[pluginsKeysMap.html]: {
plugin: HTMLPlugin,
enabled: !!input.html,
options: {
// scriptLoading: 'defer',
template: input.html,
minify: {
collapseWhitespace: true
}
}
},
[pluginsKeysMap.hot]: {
plugin: webpack.HotModuleReplacementPlugin,
enabled: !isProd
},
[pluginsKeysMap.reactRefresh]: {
plugin: reactRefresh,
enabled: !isProd,
options: {
overlay: {
sockIntegration: 'whm'
}
}
},
[pluginsKeysMap.eslint]: {
plugin: eslint,
enabled: false,
options: {
extensions: ESLintExtensions,
configType: 'flat',
emitWarning: true,
failOnError: false
}
}
};
}
export default getDefaultPluginsConfig;