vue 项目首页加载速度优化以及解决首页白屏问题

2023-10-29

前言


最近再接手一个vue项目的时候,公司运营部就说首页加载要10秒以上时间,这谁能忍受,老板也说时间太久,技术部老大说之前的同事优化过一次,时间还是这么久,重担就落在我身上了,于是我就开始着手优化,最终的结果呢就是优化到了2秒以内加载出来,这里分享一下我优化的经验。(现在优化过得项目已经上线,领导们反馈说比之前快多了,体验也更好了,心里还是比较满足的,嘿嘿)。

本篇博客介绍的vue2.0版本的优化,因为项目很久远,所以是老的版本,后期会更新vue3.0版本的优化

首先先讲一下首页加载速度优化

要想优化这个加载速度,的先知道加载慢的原因.

再vue项目中,引入到项目中的js,css都会被打包进入vendor.js,如果引入的第三方库众多,最后打包后的vendor.js就会体积庞大(达到了惊人的3M多),浏览器再加载该文件后才会进入首屏,如果vendor.js体积过大,那么加载的时间就越久,白屏的时间就越长。

了解了上边所说的vendor.js得问题,接下来就要具体分析一波加载慢的原因。
  • 1,第一步我们借助webpack可视化资源分析工具,分析一波是什么库体积较大,
npm install webpack-bundle-analyzer -D
  • 2,然后在build文件夹下webpack.prod.conf.js的文件中------或者vue.config.js文件中配置该插件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
plugins:[
    new BundleAnalyzerPlugin ();
]
  • 3, 最后命令行执行npm run build --report浏览器会自动打开分析结果,结果如下图所示:
    我这张图是优化后的,优化之前的我忘记截图了,这里主要是可以一目了然的看到是哪个包的体积较大,占用空间比较大。
    在这里插入图片描述

这里需要注意的是:在没有优化之前,这里体积最大的是vue 全家桶的包element-ui、mint-ui的包
这几个包特别大,导致打包后的vendor.js文件特别大,白屏时间就很久。

看着分析图一步一步的优化

第三方js库的优化

step 一,CDN加速

这里要特别注意,第三方cdn慎用,除非你们自己花钱买的cdn,否则自己的项目挂掉就很难受了,我是不会再用免费的cdn服务了,太坑了。

可以采用CDN加速引入,但是这个有风险,就是第三方库挂掉或者什么的,可以选择付费的cdn加速。
或者下载到本地上传到自己的服务器,总共三套方案,可以同时使用,保证安全性。
举例说明:

//这里是我再项目中的配置
//切记只适用于测试,要是上线一定是购买付费的
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.12/lib/index.css" />
<script src="https://cdn.jsdelivr.net/npm/vant@2.12/lib/vant.min.js"></script>

step 二,分离打包第三方资源包

再build文件夹下的webpack.base.conf.js中配置externals可以分离打包第三方资源包,key是依赖包的名称,value是源码抛出来的全局变量,这样打包后这些文件就不会打包到vendor.js 和app.js中,会大大减少打包体积。(尤其是你的项目用了多个三方库)

这个做法就是可以不把这些资源打包到bundle和vendor.js中,而是在运行时去获取需要的依赖和资源,大大减少打包的体积。
具体的可以看externals官方文档介绍

举例说明:
再index.html中

<body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue-router.min.js"></script>
</body>

再build文件夹中webpack.base.conf.js

module.exports = {
   externals: {
    'vue':'Vue',
    'vue-router':'VueRouter',
    'vuex':'Vuex',
    'moment': 'moment',
    'axios': 'axios',
    'qs': 'Qs',
    'md5': 'md5',
    'mint-ui': 'MINT',
  },
}

这里需要注意的是第三包尽量采用一下介绍的方式,不要再main.js中使用import引入,然后在使用vue.use注册,因为这种方法会被打包进入vendor.jsapp.js中。

vue-router路由懒加载

这个是相当重要的一步,这步会大大减少打包后的体积,提升加载速度

在访问到相关页面才加载对应的路由和资源,才是正确的,否则全在初始化项目时加载,那么首屏时间就会很久。

举例说明:
路由懒加载模式配置

let routes = [
    {
        path: '/map', //地图
        name: 'map',
        component: resovle => require(['@/pages/map'],resovle),
        meta: { noRequiresAuth: true },
    },
    {
        path: '/redirectLogin', //支付回跳
        name: 'redirectLogin',
        component: resovle => require(['@/pages/site/redirectLogin'],resovle),
        meta: { noRequiresAuth: true },
    }
]

非----懒加载模式配置 router.js配置

import Vue from 'vue';   //这句话可以直接删掉的,因为配置了externals
//import Router from 'vue-router';
//import login from '@/pages/site/login';
采用require方式代替import
const Router = require('vue-router');
const login = require('@/pages/site/login');
Vue.use(Router);
let routes = [
    {
        path: '/login', //登陆
        name: 'login',
        component: login,
        meta: { noRequiresAuth: true },
    },
]

静态资源压缩,代码压缩,图片压缩

  • 1,开启gzip压缩,(这个需要服务端配合)

以下是使用gzip后的效果
开启gzip后打包后的文件会很小,如下图所示:
gzip压缩后
在浏览器网页中会看到如下
在这里插入图片描述

gzip压缩一定要开,并且服务端配合开一下,真的很重要。开启gzip后你会发现加载速度有质的提升,尤其是你的vendor.jsapp.js体积过大的时候。

下边的几张图会很直观的看出来压缩前后的包体积

a,没有开gzip的效果,优化过后的vendor.js大小是123k,(备注,我刚来时3M多),网不好的情况下需要加载3秒甚至4,5秒,就很崩溃。

在这里插入图片描述
在这里插入图片描述

a,开启gzip的效果,vendor.js大小是38k,是不是体积有了大的改善,加载速度瞬间就上来了,体验一下就好了很多。

在这里插入图片描述
在这里插入图片描述

  • 2, 图片压缩,目前我才用的是阿里云的图片处理(付费的)效果比较好,或者有条件的话配置一台单独的图片服务器
  • 3,尽量使用icon代替图片
  • 4, js代码压缩- - - -(webpack 自UglifyJsPlugin插件压缩js文件)
  • 5,css 代码压缩- - - - (采用optimize-css-assets-webpack-plugin插件来压缩css代码)

不要滥用三方库

在我接手这个项目的时候,这个项目中使用了3个三方库,分别是element-uimint-uivant-ui加载这些库就占用了很大的体积,导致项目体积贼大,加载很慢。
项目中使用一个tree组件就要引入一个库,这是不可取的,所以我在项目中删除了element-ui库,由于目前mint-ui使用占比还是比较高,后续会慢慢移除这个库,加载速度还会提升

尽量一个项目只使用一个库,不要为了方便使用多个库而忽略了性能。

去掉编译中的map文件

为了避免部署打包体积过大,我们通常去掉源文件(就是打包后看不到源代码),打包后的体积会小很多
再config文件夹下的index.js文件中

module.exports = {
    build: {
        env: build_env,
        index: path.resolve(__dirname, '../dist/index.html'),
        assetsRoot: path.resolve(__dirname, '../dist'),
        assetsSubDirectory: 'static',
        assetsPublicPath: './',
        productionSourceMap: false,     //这个设置为false就是去掉源文件
        // Gzip off by default as many popular static hosts such as Surge or Netlify
        // already gzip all static assets for you. Before setting to `true`, make sure
        // to: npm install --save-dev compression-webpack-plugin
        productionGzip: true,      //开启gzip
        productionGzipExtensions: [
            'js', 'css'
        ],
        // Run the build command with an extra argument to View the bundle analyzer
        // report after build finishes: `npm run build --report` Set to `true` or
        // `false` to always turn it on or off
        bundleAnalyzerReport: process.env.npm_config_report
    },
    }

代码层面的优化

  • 1,项目组件化,去掉冗余的代码
  • 2,正式环境去掉console.log
  • 3,index.html页面中将js文件放到页面最底部,css文件放在<header>中使用link引入。

这么做的原因是因为浏览器渲染的机制是自上而下的,如果把js文件放到头部渲染,等js文件渲染完成才开始绘制页面,这样速度会很慢,并且会受到css渲染的阻塞,所以要把js文件放到最底部,并且一些没有关联性的文件可以采用异步加载

首先在这里贴出来我优化后的包体积

在这里插入图片描述
可以看到vendor.js 和app.js都是被优化到100多kb.体积小了自然加载速度也就快很多。

其次再看一下上线后没有任何请求的时候页面加载时间,基本都是再1秒以内(毫秒级别)加载出来,也就是秒开,体验比之前的10s要快很多。

在这里插入图片描述

接下来谈谈非常重要的一个首页白屏问题。

vue项目打包后,要加载出页面,首先要加载vendor.jsapp.js文件,等把这两个文件加载完才会开始渲染页面,所以当网速不好的时候就会出现白屏,

上边所做的首屏加载优化就可以大大减少白屏时间,但是不能完全避免没有白屏时间,所以从体验角度来讲,我们可以做一个loading 或者骨架屏来让使用者体验更好,那么问题来了,这些首屏的加载中放到哪里才是正确的,下边会慢慢介绍

优化首屏加载速度和白屏问题,除了上述讲到的解决方案,还可以使用服务端渲染,也就是ssr技术,之前我是用过nuxt.js技术做ssr开发,体验还是很不错的。

体验优化

上边已经讲述了优化问题, 把所有的优化都做完之后,加载速度有了显著提升 \color{green}{把所有的优化都做完之后,加载速度有了显著提升} 把所有的优化都做完之后,加载速度有了显著提升把所有的优化都做完之后,加载速度有了显著提升,但是再网慢的时候还是会有白屏,所以再白屏期间加骨架屏和loading就显得格外重要了。

index.html中添加如下代码,这样就可以有效解决白屏问题,用户的体验一下就上来了,是不是很完美。

<body>
    //这里亲测有效,放心使用
    <div id="app">
       // 我们只需要再这里添加loading图或者骨架屏,有人会说怎么控制它的显示隐藏啊,
       //不用担心,再项目初始化完成后会自动替换为你的页面。
       <div class="self-loading">
          页面正快马加鞭赶来,请耐心等待
      </div>
    </div>
</body>

结束语


经过了一周的努力优化,首屏加载速度终于有了质的提升,并且优化了首页白屏问题,还是很欣慰的。
后期还有再优化的点会继续更新,毕竟好记性比不上烂笔头,同时也方便学习。

vue单页缓存

下期会好好介绍如何解决项目打包上线后再浏览器(尤其是微信浏览器的缓存)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue 项目首页加载速度优化以及解决首页白屏问题 的相关文章

  • React-native:将场景绑定到导航栏

    我正在整理这个提问 回答应用程序 并遇到了这个障碍 我想从导航栏触发场景中的功能 与登录应用程序类似 我在导航栏中有一个用于提交答案的按钮 RightButton route navigator index navState if rout
  • 仅当表单已提交时才触发 jQuery 表单验证?

    不引人注目的验证基于这样的想法 don t进行表单验证 直到用户提交表单 一旦发生这种情况 如果表单上的某些内容无效 那么一旦用户更改了每个字段 就会立即验证它 我想做的是 不显眼地 触发表单元素的验证 也就是说 only如果用户已尝试提交
  • 如果对象包含在另一个数组中,则从数组中删除该对象

    我试图从数组中删除一个对象 如果该对象的属性 唯一 包含在另一个数组中 我知道我可以像这样执行嵌套 for 循环 for i 0 i lt array length i for j 0 j lt array2 length j if arr
  • 如何更改传单中功能集的样式?

    我正在看等值区域的例子 https leafletjs com examples choropleth https leafletjs com examples choropleth 这是他们使用的数据源 type Feature prop
  • HTML/VBA Click 事件未触发

    这是我第一次在 StackOverflow 上发布问题 到目前为止 我已经能够通过 VBA 帮助论坛解决我的大部分问题 我的问题很简单 我有一个自动数据拉取 我需要在其中导出数据 我过去曾在这方面取得过成功 但这次略有不同 我尝试单击以生成
  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • VBA / HTML / jQuery 选择自动完成 - 在列表中选择

    我正在尝试使用 Excel 中的 VBA 在网站的列表中选择一个值 这不是一个 正常列表 该网站使用 jQuery 选择自动完成 如下所示 example http davidwalsh name demo jquery chosen ph
  • 消息“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调”

    我正在使用 Puppeteer 和 Jest 来运行一些前端测试 我的测试如下 describe Profile Tab Exists and Clickable settings user gt test Assert that you
  • 如何按照编写的顺序迭代 javascript 对象属性

    我发现了代码中的一个错误 我希望通过最少的重构工作来解决该错误 此错误发生在 Chrome 和 Opera 浏览器中 问题 var obj 23 AA 12 BB iterating through obj s properties for
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • 是否可以使用 javascript 测试用户的浏览器/操作系统是否支持给定类型的链接?

    是否可以使用 javascript 或其他任何东西 测试用户的操作系统 浏览器是否支持给定的 url 方案 例如 大多数仅使用网络邮件的用户计算机上未设置 mailto 是否有可能以某种方式捕获单击 mailto 链接的尝试并弹出比浏览器错
  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • Google Chrome 106 可拖动导致元素消失

    使用拖放元素时 绝对定位元素中包含的大多数其他元素都会从屏幕上消失 如果我调整窗口大小 这些元素会出现 但在开始拖动时会再次消失 我在最新版本的 Google Chrome 106 和 Beta 版本 107 0 5304 18 以及现在的
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • 使用异步调用时如何从 javascript 更新元刷新?

    我有一个系统 它使用元刷新来注销页面 该系统会在空闲用户后进行清理 不用担心 服务器也会导致会话超时 我开始通过 ajax 进行一些操作 不是真正的 xml 但这不是重点 我可以运行从异步请求返回的javascript 所以我想知道是否可以

随机推荐

  • Qt将文件保存到指定目录下(另存为的功能)

    因为Qt才开始入门 对文件的操作还不是很熟练 经过一段时间查找终于找出一些适用于入门的代码 QDir d d mkpath D 123 file new QFile D 123 tmp file gt open QFile WriteOnl
  • MySQL索引实现原理分析

    目前大部分数据库系统及文件系统都采用B Tree B树 或其变种B Tree B 树 作为索引结构 B Tree是数据库系统实现索引的首选数据结构 在 MySQL 中 索引属于存储引擎级别的概念 不同存储引擎对索引的实现方式是不同的 本文主
  • docker安装Apollo,并用java连接测试

    What is Apollo 背景 随着程序功能的日益复杂 程序的配置日益增多 各种功能的开关 参数的配置 服务器的地址 对程序配置的期望值也越来越高 配置修改后实时生效 灰度发布 分环境 分集群管理配置 完善的权限 审核机制 在这样的大环
  • C语言-文件

    C语言 文件 一 为什么使用文件 二 文件的打开与关闭 1 fopen 1 r w a 2 rb wb ab 3 r w a 4 rb wb ab 2 fclose 三 文件顺序读写函数 1 fgetc fputc 2 fgets fput
  • Ubuntu18.04 python 开发usb通信

    一 安装环境 1 安装pip sudo python3 get pip py 或 sudo i apt update apt install python3 pip 确定pip是否安装成功 xxx desktop pip3 version
  • 【Transformers】第 3 章:自动编码语言模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 瑞吉外卖项目——删除和批量删除套餐功能

    需求分析 用户点击删除按钮 可以删除对应的套餐 也可以通过复选框选择多个套餐 点击批量删除 一次性删除多个套餐 注意 对于状态在售卖中的套餐不能删除 需要先停售 之后才能删除 代码开发 前后端发交互 前端携带id发送请求 请求服务端 服务端
  • 牛客网剑指offer java 全部题解

    经过数月的努力 终于更完了牛客网的66道剑指offer 以下的顺序和大家在牛客网的顺序是一样的 排序也花了不少时间 希望对大家找工作 提高算法能力能起到些许帮助 每天一道剑指offer 二维数组中的查找 https mp weixin qq
  • Redis主从连接失败 connected_slaves:0

    进行主从连接配置时 主服务器使用info replication查到的 connected slaves数一直是0 原因是主服务器设置了密码 找到从服务器的配置文件redis conf 在配置文件中找到 masterauth
  • python如何做敏感度分析,使用SALib工具箱从测量数据进行Python敏感性分析

    I would like to understand how to use the SALib python toolbox to perform a Sobol sensitivity analysis to study paramete
  • IDEA 代码提交前流程及提交日志模板化

    前言 在开发大型项目时 通常都是由团队来进行开发 此时 每个人有每个人的代码编写风格和提交习惯 如果放任自由发挥 那么代码质量和代码提交日志就难免风格各异 导致项目代码质量难以保持统一 针对这一问题 往往公司在以项目组进行开发时 在进入正式
  • [转载]Python正则表达式匹配反斜杠'\'问题

    在学习Python正则式的过程中 有一个问题一直困扰我 如何去匹配一个反斜杠 即 一 引入 在学习了Python特殊字符和原始字符串之后 我觉得答案应该是这样的 1 普通字符串 2 原始字符串 r 但事实上在提取诸如 3 8 反斜杠之前的数
  • 高速PCB电路板的信号完整性设计

    目录 高速PCB电路板的信号完整性设计 1信号完整性基本理论 1 1 信号完整性定义 1 2影响信号完整性的主要因素 2高速数据采集系统 3 信号完整性设计 3 1电路板叠层设计 3 2电路板布局设计 3 3电路板布线设计 一 信号完整性是
  • 编译语言的编译和脚本语言的解释

    编译语言的编译和脚本语言的解释 编译语言和脚本语言 这个博主看了几篇帖子 觉得Jonny工作室的这篇文章解释的最简单明了 联想之间之前写的程序 大胆给一点自己的看法 如有不对还望指正 编译语言 脚本语言 c c python 题目出现编译语
  • 智能运维 VS 传统运维|AIOps服务管理解决方案全面梳理

    云智慧 AIOps 社区是由云智慧发起 针对运维业务场景 提供算法 算力 数据集整体的服务体系及智能运维业务场景的解决方案交流社区 该社区致力于传播 AIOps 技术 旨在与各行业客户 用户 研究者和开发者们共同解决智能运维行业技术难题 推
  • java开发Demo~微信扫码支付,java开发示例

    开发所需工具类 以上工具类以上传到我的资源 下载地址 http download csdn net download han xiaoxue 10184832 开发所需jar 具体的代码不贴了 说明下PayConfigUtil中的参数 AP
  • CMake详细使用

    1 CMake简介 CMake是一个用于管理源代码的跨平台构建工具 可以方便地根据目标平台和编译工具产生对应的编译文件 主要用于C C 语言的构建 但是也可以用于其它编程语言的源代码 如同使用make命令工具解析Makefile文件一样 c
  • 百度群组链接分享 - 铁人圈子

    百度网盘群组链接分享 铁人圈子 铁人圈子 tierenpan com 是一个分享百度网盘群组的发布平台 可以在铁人圈子上实时分享你的群组链接 并且和其他网友互动交流分享资源 群组分享 百度群组链接分享 地址 https www tieren
  • 58道Vue常见面试题集锦,涵盖入门到精通

    1 vue优点 答 轻量级框架 只关注视图层 是一个构建数据的视图集合 大小只有几十 kb 简单易学 国人开发 中文文档 不存在语言障碍 易于理解和学习 双向数据绑定 保留了 angular 的特点 在数据操作方面更为简单 组件化 保留了
  • vue 项目首页加载速度优化以及解决首页白屏问题

    前言 最近再接手一个vue项目的时候 公司运营部就说首页加载要10秒以上时间 这谁能忍受 老板也说时间太久 技术部老大说之前的同事优化过一次 时间还是这么久 重担就落在我身上了 于是我就开始着手优化 最终的结果呢就是优化到了2秒以内加载出来