浅谈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 相关文章推荐
HTML node相关的一些资料整理
Jan 01 Javascript
自己整理的一个javascript日期处理函数
Oct 16 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
Apr 14 Javascript
用js判断是否为360浏览器的实现代码
Jan 15 Javascript
javascript常用方法总结
May 14 Javascript
在JavaScript中处理数组之reverse()方法的使用
Jun 09 Javascript
关于JS中的apply,call,bind的深入解析
Apr 05 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
Dec 16 Javascript
详解在vue-cli项目中安装node-sass
Jun 21 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
Apr 10 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
Aug 02 Javascript
微信小程序如何连接Java后台
Aug 08 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.MVC的模板标签系统(四)
2006/09/05 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
JavaScript 中的replace方法说明
2007/04/13 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
Python实现GUI学生信息管理系统
2020/04/05 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
Python定时任务sched模块用法示例
2018/07/16 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
解决Python3下map函数的显示问题
2019/12/04 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
python不同系统中打开方法
2020/06/23 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
入党自我评价范文
2014/02/02 职场文书
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
先进集体获奖感言
2014/02/13 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
2014年电厂工作总结
2014/12/04 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
MySQL时区造成时差问题
2022/04/13 MySQL
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers