Vue SPA 首屏优化方案


Posted in Vue.js onFebruary 26, 2021

前言

常规 vue 项目打包后访问,返回一个只包含 div 的 html,其他内容块都是通过 js 动态生成的。

Vue SPA 首屏优化方案

存在两个比较大的问题:

  • 不利于 seo
  • 首屏加载页慢,用户体验不好

本文是自己根据项目经验总结的方案,如有不足,欢迎指出~

优化

SSR

SSR(Server-Side Rendering) 即服务端渲染,把 vue 组件在服务器端渲染为组装好的 HTML 字符串,然后将它们直接发送到浏览器,最后需要将这些静态标记混合在客户端上完全可交互的应用程序。
使用 ssr 重新部署构建项目后:

Vue SPA 首屏优化方案

可以看到返回的内容就已经包含了首屏内容的 html 代码块,perfect!~.~

极速传送门: 基于vue-cli4.0+Typescript+SSR的小Demo

按需引入

使用 es6 module 进行按需引入

1. 路由文件中按需引入组件

# router.index.ts
export function createRouter() {
 return new Router({
 mode: 'history',
 routes: [
  {
  path: '/',
  name: 'Home',
  component: () => import(/* webpackChunkName: "Home" */ './views/Home.vue'),
  },
  {
  path: '/about',
  name: 'About',
  component: () => import(/* webpackChunkName: "about" */ './views/About.vue'),
  },
 ],
 });
}

2. 静态库按需引入模块,而不是全部

如 element-ui 库中,我只想用 button 组件 :

import {
 button
} from 'element-ui';

请求优化

1. css、js 放置顺序

css 文件放 header 中,js 文件放 body前,不过 vue 已经帮我们处理好了~

2. 使用字体图标,icon 资源使用雪碧图

我们知道 http 建立一次连接需要 3 次握手,太多的请求会影响加载速度

对不必要的静态资源我们应该尽量减少,比如页面中的 icon 图标,如下腾讯官网的一个图片:

Vue SPA 首屏优化方案

直接引入一张完成的图片,根据 background-position 来设置图片的位置

使用CDN

静态资源都上传到 CDN,提高访问速度

不使用 CDN:

Vue SPA 首屏优化方案

使用 CDN:

可以看到使用 CDN后,会对静态文件进行 GZIP 压缩, 下载度度极大的提高

Vue SPA 首屏优化方案

入口 chunk 优化

拆分入口 chunk 文件,分离出一些静态的库,既可以加速打包,也可以优化加载。

如下,分离了一些静态库:vuejs、axios、vuex等,可以看到浏览器将开启多个下载线程进行下载。若没有分离这些静态库,入口 chunk 将十分巨大,加载速度可想而知~.~

Vue SPA 首屏优化方案

分离一个 element-ui 库,dev 环境我们不用管,prod 环境下我们才分离,只需要在 vue 打包配置中移除该库即可:

# vue.config.js
configureWebpack: {
 externals:
 process.env.NODE_ENV === 'production'
  ? {
  'element-ui': 'element-ui',
  }
  : undefined,
},

# index.html 手动引入静态资源
<script src="/js/element-ui/element-ui.2.11.1.js"></script>

以上就是Vue SPA 首屏优化方案的详细内容,更多关于Vue SPA 首屏优化的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
vue监听键盘事件的相关总结
Jan 29 Vue.js
vue-video-player 断点续播的实现
Feb 01 Vue.js
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
Vue3中的Refs和Ref详情
Nov 11 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 Vue.js
vue 动态添加的路由页面刷新时失效的原因及解决方案
Feb 26 #Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 #Vue.js
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 #Vue.js
Vue基本指令实例图文讲解
Feb 25 #Vue.js
vue常用高阶函数及综合实例
Feb 25 #Vue.js
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 #Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 #Vue.js
You might like
一个简单实现多条件查询的例子
2006/10/09 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
浅析php单例模式
2014/11/25 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
PHP递归算法的简单实例
2019/02/28 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
JavaScript 继承详解(一)
2009/07/13 Javascript
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python的面向对象编程方式学习笔记
2016/07/12 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
员工担保书范本
2015/09/22 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
五年级语文教学反思
2016/03/03 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
用Java实现简单计算器功能
2021/07/21 Java/Android