UNPKG

siegel

Version:

Web application development ecosystem

107 lines (106 loc) 3.7 kB
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;