• Vue首屏加载过慢出现白屏的六种优化方案


    公司业务展示官网开发,构建版本后在测试环境下,发下首屏加载损耗高达几十秒(服务器在国外,所以也导致加载时间变长),于是采用了以下方法来达到提速目的。 

    1. 采用懒加载的方式

    路由懒加载和组件懒加载:const One = ()=>import("./one");

    图片懒加载:使用vue-lazyload插件

    1. //引入vue懒加载
    2. import VueLazyload from 'vue-lazyload'
    3. //方法一: 没有页面加载中的图片和页面图片加载错误的图片显示
    4. // Vue.use(VueLazyload)
    5. //方法二: 显示页面图片加载中的图片和页面图片加载错误的图片
    6. //引入图片
    7. import loading from '@/assets/images/load.jpg'
    8. //注册图片懒加载
    9. Vue.use(VueLazyload, {
    10. // preLoad: 1.3,
    11. error: '@/assets/images/error.jpg',//图片错误的替换图片路径(可以使用变量存储)
    12. loading: loading,//正在加载的图片路径(可以使用变量存储)
    13. // attempt: 1
    14. })

    2.webpack开启gzip压缩文件传输模式

    gizp压缩是一种http请求优化方式,通过减少文件体积来提高加载速度。html、js、css文件甚至json数据都可以用它压缩,可以减小60%以上的体积。

     webpack打包时借助 compression webpack plugin实现gzip压缩,安装插件如下:npm i -D compression-webpack-plugin

    在vue-cli 3.0 中,vue.config.js配置如下:

    1. const CompressionPlugin = require('compression-webpack-plugin');//引入gzip压缩插件
    2. module.exports = {
    3. plugins:[
    4. new CompressionPlugin({//gzip压缩配置
    5. test:/\.js$|\.html$|\.css/,//匹配文件名
    6. threshold:10240,//对超过10kb的数据进行压缩
    7. deleteOriginalAssets:false,//是否删除原文件
    8. })
    9. ]
    10. }

    服务器nginx开启gzip:

     

    3.依赖模块采用第三方cdn资源 

    修改vue.config.js

    1. module.exports = {
    2. ...
    3. externals: {
    4. 'vue': 'Vue',
    5. 'vuex': 'Vuex',
    6. 'vue-router': 'VueRouter',
    7. 'element-ui': 'ELEMENT'
    8. }
    9. ...
    10. }

    4.禁止生成map文件

    vue.config.js配置:

    1. module.exports = {
    2. productionSourceMap: false, // 生产环境是否生成 sourceMap 文件,一般情况不建议打开
    3. }

    在设置了productionSourceMap: false之后,就不会生成map文件,map文件的作用在于:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得知是哪里的代码报错。也就是说map文件相当于是查看源码的一个东西。如果不需要定位问题,并且不想被看到源码,就把productionSourceMap 置为false,既可以减少包大小,也可以加密源码。

    5.去掉代码中的console和debugger

    打包之后控制台很干净,部署正式环境之前最好这样做。

    1. configureWebpack: config => {
    2. if (process.env.NODE_ENV === 'production') {
    3. config.optimization.minimizer[0].options.terserOptions.compress.warnings = false
    4. config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true
    5. config.optimization.minimizer[0].options.terserOptions.compress.drop_debugger = true
    6. config.optimization.minimizer[0].options.terserOptions.compress.pure_funcs = ['console.log']
    7. }
    8. },

    6. 预渲染配置

    使用插件:prerender-spa-plugin 

    vue.config.js中配置如下:

    1. const PrerenderSpaPlugin = require('prerender-spa-plugin');
    2. const Render = PrerenderSpaPlugin.PuppeteerRenderer;
    3. const path = require('path');
    4. configureWebpack: () => {
    5. if (process.env.NODE_ENV !== 'production') return;
    6. return {
    7. plugins: [
    8. new PrerenderSPAPlugin({
    9. // 生成文件的路径,也可以与webpakc打包的一致。
    10. // 下面这句话非常重要!!!
    11. // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。
    12. staticDir: path.join(__dirname, 'dist'),
    13. // 对应自己的路由文件,比如a有参数,就需要写成 /a/param1
    14. routes: ['/', '/Login', '/Home'],
    15. // 这个很重要,如果没有配置这段,也不会进行预编译
    16. renderer: new Renderer({
    17. inject: {
    18. foo: 'bar'
    19. },
    20. headless: false,
    21. // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
    22. renderAfterDocumentEvent: 'render-event'
    23. })
    24. })
    25. ]
    26. };
    27. }
  • 相关阅读:
    性能测试 —— Jmeter 常用三种定时器
    java基于Android studio的校园通设计
    Socket.io实时通信的一些杂论
    react仿照antd progress实现可自定义颜色的直角矩形进度条
    Unity制作一个小星球
    微信3.7版小程序数据分析
    4. 【containerd】pull image 如何配置密码
    About Simple Data Visualization
    java计算机毕业设计新生报到管理系统源程序+mysql+系统+lw文档+远程调试
    【云原生】Spring Cloud微服务学习路线汇总
  • 原文地址:https://blog.csdn.net/weixin_44786530/article/details/126936033