const path = require('path')
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const TerserPlugin = require('terser-webpack-plugin')
const BundleAnalyzer = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const cdn = { externals: { vue: 'Vue', vuex: 'Vuex', 'vue-router': 'VueRouter', axios: 'axios' }, js: [ 'https://cdn.bootcss.com/vue/2.6.11/vue.runtime.min.js', 'https://cdn.bootcss.com/vue-router/3.1.2/vue-router.min.js', 'https://cdn.bootcss.com/vuex/3.1.2/vuex.min.js', 'https://cdn.bootcss.com/axios/0.19.2/axios.min.js', 'https://cdn.bootcss.com/moment.js/2.24.0/moment.min.js', 'https://cdn.bootcss.com/echarts/3.7.1/echarts.min.js' ], css: [] }
function resolve (dir) { return path.join(__dirname, dir) }
module.exports = { lintOnSave: false, publicPath: '/', outputDir: 'dist', assetsDir: 'static', indexPath: 'static/index.html', productionSourceMap: false, chainWebpack: config => { config.plugin('html').tap(args => { args[0].cdn = cdn return args })
config.plugins.delete('prefetch')
config.resolve.alias .set('@', resolve('src')) .set('assets', resolve('src/assets')) .set('components', resolve('src/components')) .set('router', resolve('src/router')) .set('store', resolve('src/store')) .set('views', resolve('src/views'))
const imagesRule = config.module.rule('images') imagesRule.uses.clear() imagesRule.use('file-loader') .loader('url-loader') .options({ limit: 10240, fallback: { loader: 'file-loader', options: { outputPath: 'static/images' } } })
config.optimization.minimize(true) }, configureWebpack: config => { config.externals = cdn.externals if (process.env.NODE_ENV === 'production') { config.plugins.push( new TerserPlugin({ terserOptions: { ecma: undefined, warnings: false, parse: {}, compress: { drop_console: true, drop_debugger: false, pure_funcs: ['console.log'] } } }) ) }
config.plugins.push( new CompressionWebpackPlugin( { filename: info => { return `${info.path}.gz${info.query}` }, algorithm: 'gzip', threshold: 10240, test: new RegExp('\\.(' + ['js'].join('|') + ')$' ), minRatio: 0.8, deleteOriginalAssets: false } ) )
config.plugins.push( new BundleAnalyzer() )
config.optimization = { splitChunks: { cacheGroups: { vendor: { chunks: 'all', test: /node_modules/, name: 'vendor', minChunks: 1, maxInitialRequests: 5, minSize: 0, priority: 100 } } } } }, css: { extract: true, sourceMap: false, loaderOptions: { sass: { prependData: ` @import "@/assets/css/variable.scss"; @import "@/assets/css/common.scss"; @import "@/assets/css/mixin.scss"; ` } } }, devServer: { host: 'localhost', port: 8080, open: false, before (app, server) { app.get(/.*.(js)$/, (req, res, next) => { req.url = req.url + '.gz' res.set('Content-Encoding', 'gzip') next() }) } }
}
|