浅谈VUE单页应用首屏加载速度优化方案


Posted in Javascript onAugust 28, 2018

单页应用会随着项目越大,导致首屏加载速度很慢!!!以下给出在下知道的几种优化方案

  • 使用CDN资源,减小服务器带宽压力
  • 路由懒加载
  • 将一些静态js css放到其他地方(如OSS),减小服务器压力
  • 按需加载三方资源,如iview,建议按需引入iview中的组件
  • 使用nginx开启gzip减小网络传输的流量大小
  • webpack开启gzip压缩
  • 若首屏为登录页,可以做成多入口,登录页单独分离为一个入口

使用CDN资源,减小服务器带宽压力

在index.html中引入cdn资源

...
 <body>
  <div id="app">
  </div>
  <!-- built files will be auto injected -->
  <script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
  <script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
  <script src="https://cdn.bootcss.com/vuex/3.0.1/vuex.min.js"></script>
  <script src="https://cdn.bootcss.com/vue-resource/1.5.1/vue-resource.min.js"></script>
 </body>
 ...

修改 build/webpack.base.conf.js

module.exports = {
 context: path.resolve(__dirname, '../'),
 entry: {
  app: './src/main.js'
 },
 externals:{
  'vue': 'Vue',
  'vue-router': 'VueRouter',
  'vuex':'Vuex',
  'vue-resource': 'VueResource'
 },
 ...
}

修改src/main.js src/router/index.js 注释掉import引入的vue,vue-resource

// import Vue from 'vue'
// import VueResource from 'vue-resource'
// Vue.use(VueResource)

路由懒加载

const workCircle = r => require.ensure([], () => r(require('@/module/work-circle/Index')), 'workCircle')
const workCircleList = r => require.ensure([], () => r(require('@/module/work-circle/page/List')), 'workCircleList')

将一些静态js css放到其他地方(如OSS),减小服务器压力

注意这里的js文件,需要将结果抛出,然后在需要用到该js的组件中import引入

按需加载三方资源,如iview,建议按需引入iview中的组件

按需引用请查看iview官方文档iview

使用nginx开启gzip减小网络传输的流量大小

配置nginx,可以参考Nginx开启Gzip压缩大幅提高页面加载速度

webpack开启gzip压缩

这里需要配合Nginx服务器,Nginx开启gzip

config/index.js中

module.exports = {
 build: {
  ...
  // 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,vue-cli搭建项目,这里默认为false
  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
 }
}

build/webpack.prod.conf.js中

使用vue-cli构建项目时,默认会有这段代码

if (config.build.productionGzip) {
 const CompressionWebpackPlugin = require('compression-webpack-plugin')
 webpackConfig.plugins.push(
  new CompressionWebpackPlugin({
   asset: '[path].gz[query]',
   algorithm: 'gzip',
   test: new RegExp(
    '\\.(' +
    config.build.productionGzipExtensions.join('|') +
    ')$'
   ),
   threshold: 10240,
   minRatio: 0.8
  })
 )
}

若首屏为登录页,可以做成多入口,登录页单独分离为一个入口

修改webpack配置

在原先只有一个入口叫app的基础上,再加一个叫login的入口,指向另一个入口js文件;

既然是两个页面,那么原先只有一个的HtmlWebpackPlugin也需要再添加一个,并且filename和template改成登录页的;

HtmlWebpackPlugin默认会把所有资源放进html,为了去掉不需要的资源,需要在HtmlWebpackPlugin选项里分别添加excludeChunks: ['login']和excludeChunks: ['app'];

原先的某些CommonsChunkPlugin会导致报错,删掉只剩下一个manifest的CommonsChunkPlugin就好。

添加登录相关文件

添加之前配好的login入口文件,与app类似,但是去掉登录页不需要的东西,如用不到的组件和样式等;

添加login入口专用的router配置文件,去掉其他路由,只留下登录页一个就好:

浅谈VUE单页应用首屏加载速度优化方案

只留登录路由

添加登录页的html模板,也是去掉登录里用不到的资源。

修改其他细节

登录完不是用vue-router的push方法,而是改成直接修改location.href跳到另一个页面;

去除原来app路由中的login;

登录页中可以使用隐藏的iframe等方式预加载app页面中的数据(猜想)。

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

Javascript 相关文章推荐
用Javascript 获取页面元素的位置的代码
Sep 25 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
Jul 14 Javascript
javascript中打印当前的时间实现思路及代码
Dec 18 Javascript
node.js中的events.emitter.removeListener方法使用说明
Dec 10 Javascript
jquery对象和DOM对象的任意相互转换
Feb 21 Javascript
jquery datatable服务端分页
Aug 31 Javascript
js入门之Function函数的使用方法【新手必看】
Nov 22 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
Feb 27 Javascript
JavaScript闭包和回调详解
Aug 09 Javascript
基于vue 开发中出现警告问题去除方法
Jan 25 Javascript
在vue中使用SockJS实现webSocket通信的过程
Aug 29 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
Feb 20 Javascript
浅谈redux以及react-redux简单实现
Aug 28 #Javascript
Vue封装的可编辑表格插件方法
Aug 28 #Javascript
JavaScript使用递归和循环实现阶乘的实例代码
Aug 28 #Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
Aug 28 #Javascript
JS实现Cookie读、写、删除操作工具类示例
Aug 28 #Javascript
vue组件开发之用户无限添加自定义填写表单的方法
Aug 28 #Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
Aug 28 #Javascript
You might like
php通过session防url攻击方法
2014/12/10 PHP
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
jQuery实现的卷帘门滑入滑出效果【案例】
2019/02/18 jQuery
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
全面了解python字符串和字典
2016/07/07 Python
详解Python进程间通信之命名管道
2017/08/28 Python
Python线程创建和终止实例代码
2018/01/20 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
容易被忽略的Python内置类型
2020/09/03 Python
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
New Balance美国官网:运动鞋和健身服装
2017/04/11 全球购物
《花的勇气》教后反思
2014/02/12 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书
信用卡收入证明范本
2015/06/12 职场文书
Python集合的基础操作
2021/11/01 Python
用Python实现屏幕截图详解
2022/01/22 Python
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python