添加 js 压缩组件
npm install compression-webpack-plugin@1.1.12 --save-dev
配置 vue.config.js
// vue.config.js配置 const path = require('path') // gzip压缩插件 const CompressionWebpackPlugin = require('compression-webpack-plugin') // 代码打包之后取出console.log压缩代码 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' }, // 通过cdn方式使用 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 = { // 是否触发eslint检查 lintOnSave: false, publicPath: '/', // 打包文件的出口 outputDir: 'dist', // 放置生成的css和js和img和fonts的目录 // assetsDir: 'static', // 存放index.html模板的路径 // indexPath: 'static/index.html', productionSourceMap: false, chainWebpack: config => { // 配置cdn引入 config.plugin('html').tap(args => { args[0].cdn = cdn return args }) // 移除prefetch插件,避免加载多余的资源 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' } } }) // 压缩响应的app.json返回的代码压缩 config.optimization.minimize(true) }, // webpack的配置 configureWebpack: config => { // 忽略打包配置 config.externals = cdn.externals // 生产环境配置 if (process.env.NODE_ENV === 'production') { // 代码压缩去除console.log config.plugins.push( new TerserPlugin({ terserOptions: { ecma: undefined, warnings: false, parse: {}, compress: { drop_console: true, drop_debugger: false, pure_funcs: ['console.log'] // 移除console } } }) ) } // 开启gzip压缩 config.plugins.push( new CompressionWebpackPlugin( { filename: info => { return `${info.path}.gz${info.query}` }, algorithm: 'gzip', threshold: 10240, // 只有大小大于该值的资源会被处理 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: { // 定义全局scss无需引入即可使用 sass: { prependData: ` @import "@/assets/css/variable.scss"; @import "@/assets/css/common.scss"; @import "@/assets/css/mixin.scss"; ` }, scss: { prependData: ` @import "~@/variables.scss"; ` } } } // 需要gzip压缩的文件 // 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() // }) // } // } }
配置 nginx
server { listen 80 default_server; listen [::]:80 default_server; # SSL configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Note: You should disable gzip for SSL traffic. # See: https://bugs.debian.org/773332 # # Read up on ssl_ciphers to ensure a secure configuration. # See: https://bugs.debian.org/765782 # # Self signed certs generated by the ssl-cert package # Don't use them in a production server! # # include snippets/snakeoil.conf; server_name *.demo.com;
gzip on; # 开启Gzip gzip_static on; # 开启静态文件压缩 gzip_min_length 1k; # 不压缩临界值,大于1K的才压缩 gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; # 进行压缩的文件类型 gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\."; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # rewrite index.html permanent; try_files $uri $uri/ /index.html; root /opt/web; index index.html index.htm index.nginx-debian.html; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # pass PHP scripts to FastCGI server # #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php-fpm (or other unix sockets): # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }