zoukankan      html  css  js  c++  java
  • vue.config.js 打包配置文件记录

    vue-cli3优化配置

    1.使用cdn引入不改变的第三方库

    复制代码
    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: []
    }
    
    module.exports = {
    
        chainWebpack: config => {
            // 配置cdn引入
            config.plugin('html').tap(args => {
              args[0].cdn = cdn
              return args
            })
        }
    
        configureWebpack: config => {
    
             // 忽略打包配置
            config.externals = cdn.externals
        }
            
    }
    复制代码

    1.1.public下的html页面引入

    复制代码
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
        <link rel="icon" href="<%= BASE_URL %>favicon.ico">
        <title><%= htmlWebpackPlugin.options.title %></title>
      </head>
      <body>
        <noscript>
          <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
        </noscript>
        <div id="app"></div>
        <!--循环引入-->
        <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
          <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>" crossorigin="anonymous"></script>
        <% } %>
      </body>
    </html>
    复制代码

    2.移除prefetch插件,避免加载多余的资源

    复制代码
    module.exports = {
    
        chainWebpack: config => {
    
            // 移除prefetch插件,避免加载多余的资源
            config.plugins.delete('prefetch')
        }
    }
    复制代码

    3.定义目录的简写路径

    复制代码
    function resolve (dir) {
      return path.join(__dirname, dir)
    }
    
    module.exports = {
    
    
        chainWebpack: config => {
    
            // 定义文件夹的路径
            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'))
        }
    }
    复制代码

    4.压缩图片

    复制代码
    module.exports = {
    
        chainWebpack: config => {
    
            // 压缩图片
            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'
                  }
                }
              })
            }
    } 
    复制代码

    5.使用gzip压缩

    复制代码
    // 需要安装插件
    
    npm i compression-webpack-plugin -D
    
    // 引入gzip压缩插件
    const CompressionWebpackPlugin = require('compression-webpack-plugin')
    
    
    module.exports = {
    
    
        configureWebpack: config => {
    
            // 开启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 // 删除原文件
                }
              )
            }
        },
    
        // 需要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()
          })
        }
      }
    }
    复制代码

    6.配置全局sass无需再组件中引入即可使用

    复制代码
    module.exports = {
    
        css: {
            extract: true,
            sourceMap: false,
            loaderOptions: {
              // 定义全局scss无需引入即可使用
              sass: {
                prependData: `
                  @import "@/assets/css/variable.scss";
                  @import "@/assets/css/common.scss";
                  @import "@/assets/css/mixin.scss";
                `
              }
            }
         },
    }
    复制代码

    7.公共代码抽离

    复制代码
    module.exports = {
    
        configureWebpack: config => {
        
            config.optimization = {
              splitChunks: {
                cacheGroups: {
                  vendor: {
                    chunks: 'all',
                    test: /node_modules/,
                    name: 'vendor',
                    minChunks: 1,
                    maxInitialRequests: 5,
                    minSize: 0,
                    priority: 100
                  }
                }
              }
            }
        }
    }
    复制代码

    8.代码压缩去除console.log

    复制代码
    module.exports = {
    
        configureWebpack: config => {
    
            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'] // 移除console
                        }
                      }
                    })
                  )
            }
        }
    }    
    复制代码

    ## 完整的代码

    复制代码
    // 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";
            `
          }
        }
      },
      // 需要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()
          })
        }
      }
    
    }
    复制代码
  • 相关阅读:
    2018-2019-2 20165232 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
    2018-2019 20165232 Exp5 MSF基础应用
    2018-2019-2 网络对抗技术 20165232 Exp4 恶意代码分析
    2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践
    2018-2019-2 网络对抗技术 20165232 Exp2 后门原理与实践
    2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验
    20165232 week1 kali安装
    2018-2019-2 20165205 网络对抗技术 Exp9 Web安全基础
    2018-2019-2 网络对抗技术 20165205 Exp8 Web基础
    2018-2019-2 20165205 网络对抗技术 Exp7 网络欺诈防范
  • 原文地址:https://www.cnblogs.com/1115changhao/p/14476011.html
Copyright © 2011-2022 走看看