浅谈vue首屏加载优化


Posted in Javascript onJune 28, 2018

本文介绍了浅谈vue首屏加载优化,分享给大家,具体如下:

库使用情况

  1. vue
  2. vue-router
  3. axios
  4. muse-ui
  5. material-icons
  6. vue-baidu-map

未优化前

首先我们在正常情况下build

浅谈vue首屏加载优化

优化

1. 按需加载

当前流行的UI框架如iview,muse-ui,Element UI都支持按需加载,只需稍微改动一下代码.

修改前:

import MuseUI from 'muse-ui'
import 'muse-ui/dist/muse-ui.css'
import 'muse-ui/dist/theme-light.css'
Vue.use(MuseUI)

修改后:

import appBar from 'muse-ui/src/appBar'
import toast from 'muse-ui/src/toast'
import drawer from 'muse-ui/src/drawer'
import popup from 'muse-ui/src/popup'

Vue.component(appBar.name, appBar);
Vue.component(toast.name, toast);
Vue.component(drawer.name, drawer);
Vue.component(popup.name, popup);

这里有点麻烦的就是你要把整个项目用到的muse-ui组件都注册一遍,当然你也可以只在用到的页面做局部引用.

让我们来看看使用按需加载后的效果?

浅谈vue首屏加载优化

在当前项目引用了16个muse-ui组件的情况下 css减少了80kb,js减少了快200kb.

2. 基于DllPlugin 和 DllReferencePlugin 的 webpack 构建优化

这一步并没有对项目产出的文件进行什么优化.而是优化了构建速度.

DllPlugin 预编译模块.有点像android开发中的lib Module,或者iOS的framework.

我们可以对项目中用到的vue,vue-router,axios,muse-ui 这些固定的,基本不变动的模块进行预编译. 具体操作不在赘述,可以看一下这篇文章,也是我写的,但是觉得自己没讲利索? .

看一下构建时间的结果对比:

浅谈vue首屏加载优化

before:38291ms
after :10089ms

项目中多了core.dll.css和core.dll.js 他们就是划分出来的固定的,基本不变的模块,所以只需要编译一次,以后引用就好.有点library的感觉.这样每次构建省去了构建固定模块的时间. 时间有38s降到了10s,如果你构建比较频繁,应该还是很有用的.

3. 异步组件 官方文档

官方文档是这么介绍的:

在大型应用中,我们可能需要将应用拆分为多个小模块,按需从服务器下载。为了让事情更简单, Vue.js 允许将组件定义为一个工厂函数,动态地解析组件的定义。Vue.js 只在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染。

修改router

before:

import search from './search.vue'
{
      path: '/search',
      name: 'search',
      component: search
}

after:

const search = resolve => require(['./search.vue'], resolve);
{
      path: '/search',
      name: 'search',
      component: search
}

具体我们来看看改造后的效果:

浅谈vue首屏加载优化

因为我的项目目前只有7个页面,即使把页面都做成异步加载,效果并不是很'喜人',整体缩小了30kb.

4. 优化组件加载时机

再使用别人的组件时,上手教程都会提示让你在main.js里注册一下就好.当然这是最省事的办法.

但是根据项目情况,比如我的项目用到了vue-baidu-map.

如果你按照默认的加载方式,vue-baidu-map是会被打在vendor.js .但其实这个组件我只有某个二级页面才使用.所以让我们来调整一下加载位置看看.把注册的vue-baidu-map放在真正使用它的地方.

浅谈vue首屏加载优化

这样,verdor.js 又小了56kb.因为首页根本用不到vue-baidu-map. 当然这样会带来一个问题:当多个页面使用vue-baidu-map,会出现多个页面重复打包.

浅谈vue首屏加载优化

怎么异步加载插件,这个我还没搞明白...

5. webpack-bundle-analyzer

webpack-bundle-analyzer是用来分析 Webpack 生成的包体组成并且以可视化的方式反馈给开发者的工具.你可以通过命令:

npm run build --report

来查看依赖关系.然后再根据具体情况划分代码块.效果图就是上面那张花里胡哨的图...它清楚的告诉你了打包时模块划分的情况.

6. 前后对比:

浅谈vue首屏加载优化

浅谈vue首屏加载优化

638.7kb vs 286.2kb

这还是在未开启gzip的情况下.

新增一张开启gzip的截图,84.8kb,相对最后的优化结果286.2kb是70%的压缩比...哈哈

浅谈vue首屏加载优化

总结

  • 在使用ui库时,尽量使用按需加载方式.
  • 异步加载,官方文档很详尽,改造起来也不难,可以试试
  • 合理规划三方库的引用.这个听起来有点龟毛,'收益'可能也不是很高,不过是个调整方向
  • 善用webpack-bundle-analyzer优化项目依赖
  • 服务端开启 gzip压缩,谁用谁知道!

如果你能看到这,十分感谢你赏脸听一个android开发bb前端开发? .

参考

vue官方文档-异步组件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
Feb 26 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
Apr 01 Javascript
JavaScript设计模式之装饰者模式介绍
Dec 28 Javascript
javascript设计模式之中介者模式Mediator
Dec 30 Javascript
jquery仿百度经验滑动切换浏览效果
Apr 14 Javascript
jQuery Easyui快速入门教程
Aug 21 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
mac中利用NVM管理不同node版本的方法详解
Nov 08 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
Jan 25 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
Aug 07 Javascript
原生js实现获取form表单数据代码实例
Mar 27 Javascript
详解新手使用vue-router传参时注意事项
Jun 06 Javascript
jQuery实现获取选中复选框的值实例详解
Jun 28 #jQuery
Vue SPA单页应用首屏优化实践
Jun 28 #Javascript
Webpack的dll功能使用
Jun 28 #Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 #Javascript
vue使用Element组件时v-for循环里的表单项验证方法
Jun 28 #Javascript
详解ES6中的三种异步解决方案
Jun 28 #Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
Jun 28 #Javascript
You might like
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
php实现随机显示图片方法汇总
2015/05/21 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
javascript 禁止复制网页
2009/06/11 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
Python对象的属性访问过程详解
2020/03/05 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
生物制药专业自我鉴定
2014/02/19 职场文书
反腐倡廉观后感
2015/06/08 职场文书
课改心得体会范文
2016/01/25 职场文书