简述vue项目性能优化!!!

1、代码层面的优化

  • 使用 v-if 与 v-show 减少初始化渲染和切换渲染的性能开销;(v-if其实是重复的销毁与创建,v-show只是基于简单的CSS进行切换)
  • v-for 加上 key提高 Diff 算法的速度;
  • 图片的大小优化以及懒加载(vue-lazyload);
    • 不同格式的图片对比

                   

    • jpg图片常见的压缩工具:jpegtran  
    • png图片常见的压缩工具:tinypng、node-pngquant-native    
    • GIf图片支持完全透明与不透明,不适合存储彩色,适合动画与图标;
    • 为什么不使用base64?
      • 将css文件的体积失去控制;
      • 浏览器的资源缓存策略无用话;
      • 低版本浏览器的兼容问题;
      • 不利于进行开发和调试;
    • SVG最大的缺点就是渲染成本比较高;
  • 使用防抖(在一定时间内,连续触发,只会执行一次)与节流(在一定时间内,只会执行一次);

2、项目打包的优化

  • 优化对比工具:webpack有一种可视化的打包分析工具:webpack-bundle-analyzer ,在vue.config.js中引入,代码如下:npm run build的时候会出现打包分析图
    const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
    
    module.exports = {
    configureWebpack: {
            plugins: [
                new webpack.ProvidePlugin({
                    $: "jquery",
                    jQuery: "jquery",
                    "window.jQuery": "jquery",
                    _: "lodash"
                }),
                new BundleAnalyzerPlugin()
            ]
        }        
    }
  • 路由的懒加载
    • () =>import('url')  优点:每个组件的代码都被打包成对应的js文件,加载组件时会对应加载js文件,或许你看这些js文件名会感到混乱,不能和项目中的组件一一对上,现在教你一个小技巧。 webpackChunkName :chunk文件的名称。[request]表示实际解析的文件名。
      import(/* webpackChunkName: "home" */ '../views/Home.vue')
      • 遇到的问题,懒加载失效,加载一些不需要的css与js文件:
        原因:
        Webpack默认开启了“prefetch”选项,即预载功能,可以在配置中关闭
        
        prefetch空闲加载,
        prefetch会在页面加载完成后,利用空闲时间提前加载获取用户未来可能会访问的内容。
        
        preload:用来指定页面加载后很快会被用到的资源,所以在页面加载的过程中,我们希望在浏览器开始主体渲染之前尽早 preload
        
        关闭:vue.config.js文件中
        module.exports = {
          chainWebpack: config => {
                config.module
                    .rule('iview')
                    .test(/iview.src.*?js$/)
                    .use('babel')
                    .loader('babel-loader')
                    .end()
                Object.keys(pages).forEach(page => {
                    config.plugins.delete(`preload-${page}`)
                    config.plugins.delete(`prefetch-${page}`)
                })
            }
        }
    • resolve =>require(['url'],resolve)   缺点:异步引入组件,通过Webpack4打包,所有组件的代码被打包成一个js文件
  • 利用externals提取第三方依赖并用CDN引入,像vue.js 、vuex.js 、vue-router.js 等这些外部库,基本不会变的,如果将它们独立出来单独加载就能利于浏览器的缓存机制,不用每次都重新加载这些库js,并且大大的减少了打包的vendor.js文件。                                                                                                                                                                    但是需要注意的是:虽然可以优化首屏加载速度,但是由于静态资源分离,也会增加http请求数量。所以如果是小项目,最好就不要用externals属性,因为小项目打包的出来的vender.js体积不大,建议项目体量较大的项目再用比较合适。并且CDN具有不稳定性,如果挂了,我们的系统将会崩溃;
  • 使用SplitChunks
  • 使用mini-css-extract-plugin插件提取组件的CSS样式到一个单独的CSS文件中(加上此插件热更新失效,因为二者不兼容)
    module.exports = {
       
       css : {
           extract :true //在生产环境下默认为true,在开发环境下默认是false
     
       }
    
    }
  • 使用OptimizeCssnanoPlugin插件压缩和去重css样式文件
    安装:
       cnpm  i  --save-dev   @intervolga/optimize-cssnano-plugin
    
    使用:
       const OptimizeCssnanoPlugin = require('@intervolga/optimize-cssnano-plugin');
    module.exports={
        configureWebpack:config =>{
            return {
                plugins:[
                    new OptimizeCssnanoPlugin({
                        sourceMap: false,
                        cssnanoOptions: {
                            preset: [
                                'default',
                                {
                                  mergeLonghand: false,  //合并属性
                                  cssDeclarationSorter: false  //根据css的属性名称进行排序
                                }
                            ]
                        },
                    }),
                ]
            }
        }
    }
  • 开启optimization.minimize来压缩js代码

    使用
    module.exports={
        configureWebpack:config =>{
            return {
                optimization:{
                    minimize: true  //在生产环境中默认为 true ,开启压缩js代码,在开发环境中默认为false
                }
            }
        }
    }
  • 使用image-webpack-loader压缩图片
    module.exports = {
        chainWebpack: config =>{
            config.module
                .rule('images')
                .use('imageWebpackLoader')
                .loader('image-webpack-loader')
        },
    }

3、项目部署的优化

  • Gzip压缩
    • 查看gzip压缩是否开启方法:查看响应头部

                   

    • 在Nginx中开启gzip压缩,不然浏览器加载的还是未压缩的资源
      在nginx/conf/nginx.conf中配置
      
      http {
          gzip  on;
          gzip_min_length 1k;
          gzip_comp_level 5;
          gzip_types application/javascript image/png image/gif image/jpeg text/css text/plain;
          gzip_buffers 4 4k;
          gzip_http_version 1.1;
          gzip_vary on;
      }
    • webpack上开启gzip压缩
      安装
      npm/cnpm  i compression-webpack-plugin --save-dev
      
      使用
      const CompressionPlugin = require("compression-webpack-plugin")
      module.exports = {
         
          configureWebpack: config => {
           //生产环境,开启js\css压缩
          if (process.env.NODE_ENV === 'production') {
              config.plugin('compressionPlugin').use(new         
                     CompressionPlugin({
                        test: /\.js$|.\css|.\less/, // 匹配文件名
                        threshold: 10240, // 对超过10k的数据压缩
                        deleteOriginalAssets: false // 不删除源文件
                     }))
               }
          }
      
      }     

4、参考文档:

posted @ 2021-03-10 15:45  北栀女孩儿  阅读(874)  评论(0编辑  收藏  举报