前端性能优化之vue-cli打包

27 篇文章 4 订阅
新建vue.config.js
  • vue.config.js
  • npm i uglifyjs-webpack-plugin -D
  • cnpm i uglifyjs-webpack-plugin -D
  • yarn add uglifyjs-webpack-plugin -D
    (推荐使用yarn)
const path = require("path");
const CompressionPlugin = require("compression-webpack-plugin"); // 开启gzip压缩, 按需引用
const UglifyJsPlugin = require('uglifyjs-webpack-plugin') // js压缩,附带去除console
module.exports = {
  publicPath: './',
  productionSourceMap: false, // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建
  outputDir: 'dist',
  assetsDir: 'assets',
  chainWebpack: config => {
    // sass引入全局的变量
    const oneOfsMap = config.module.rule('scss').oneOfs.store
    oneOfsMap.forEach(item => {
      item.use('sass-resources-loader').loader('sass-resources-loader').options({
        // Provide path to the file with resources
        // 要公用的scss的路径
        resources: './src/assets/common.scss'
      }).end()
    });
    // js和css生成hash文件,这个也可以不用配置,vuecli底层也进行了配置,根据需要吧
    config.output.filename('./js/[name].[chunkhash:6].js');
    config.output.chunkFilename('./js/[name].[chunkhash:6].js');
    config.plugin('extract-css').tap(args => [{
        filename: 'css/[name].[contenthash:6].css',
        chunkFilename: 'css/[name].[contenthash:6].css'
    }]);
    // 图片压缩,这个一般不需要配置,vue-cli封装了,默认自动会转小图片为base64
    config.module.rule('images').use('url-loader')
    .tap(options => ({
        name: './assets/images/[name].[ext]',
        quality: 85,
        limit: 20000, //配置线上图片转base64
        esModule: false,
    }));
    // 压缩文件
    config.plugin("compression").use(CompressionPlugin, [
      {
        test: /\.(js|css)?$/i, // 哪些文件要压缩
        filename: "[path].gz[query]", // 压缩后的文件名
        algorithm: "gzip", // 使用gzip压缩
        minRatio: 0.8, // 压缩率小于0.8才会压缩
        deleteOriginalAssets: false, // 删除未压缩的文件,谨慎设置,如果希望提供非gzip的资源,可不设置或者设置为false
      },
    ]);
    // 排除npm包
    config.externals({
      vue: "Vue",
      "vue-router": "VueRouter",
      vuex: "Vuex",
      axios: "axios",
    });
  },
  // 压缩 去除console.log
  configureWebpack: config => { 
    if (process.env.NODE_ENV === 'production') {
      config.plugins.push(
        new UglifyJsPlugin({
          uglifyOptions: {
            compress: {
              // warnings: false,
              drop_debugger: true, // console
              drop_console: true,
              pure_funcs:['console.log'] // 移除console
            },
          },
          sourceMap: false,
          parallel: true,
        })
      )
    }
  },
  devServer: {
    // 前端解决跨域的问题
    host: "localhost",
    port: 8080, // 端口号
    https: false, // https:{type:Boolean}
    // open: false, //配置自动启动浏览器
    hotOnly: true, // 热更新
    proxy: {
      "/api": {
        target: "http://localhost:5000",
        changeOrigin: true,
        secure: false,
        pathRewrite: {
          "^/api": ""
        }
      },
    }
  },
  // 配合sass-resources-loader,防止报错
  pluginOptions: {
    'style-resources-loader': {
      preProcessor: 'sass',
      patterns: []
    }
  }
}

未使用uglifyjs-webpack-plugin插件的时候,显示921kb,很大的体积

2-1.png

使用uglifyjs-webpack-plugin插件的时候,是151kb,为原来的六分之一

2-2.png

使用externals之后,剔除第三方包,大小之后49.5kb,为使用uglifyjs之后的三分之一

2-3.png

<!DOCTYPE html>
<html lang="">
  <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>
    <div id="app"></div>
    <!-- cdn的地址: https://www.jsdelivr.com/ -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue-router@3.5.3/dist/vue-router.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vuex@3.6.2/dist/vuex.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios@0.24.0/dist/axios.min.js"></script>
  </body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxslxskxs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值