浅谈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 相关文章推荐
ajaxFileUpload.js插件支持多文件上传的方法
Sep 02 Javascript
浅析Node.js查找字符串功能
Sep 03 Javascript
jQuery 动态云标签插件
Nov 11 Javascript
jQuery层动画定位滑动效果的方法
Apr 30 Javascript
深入浅析AngularJS中的module(模块)
Jan 04 Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 Javascript
详解Angular2学习笔记之Html属性绑定
Jan 03 Javascript
JavaScript使用math.js进行精确计算操作示例
Jun 19 Javascript
小程序从手动埋点到自动埋点的实现方法
Jan 24 Javascript
angular 表单验证器验证的同时限制输入的实现
Apr 11 Javascript
layui表格数据复选框回显设置方法
Sep 13 Javascript
JS数组方法shift()、unshift()用法实例分析
Jan 18 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如何实现订单的延时处理详解
2017/12/30 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
Javascript中Eval函数的使用说明
2008/10/11 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
基于javascript的拖拽类封装详解
2019/04/19 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
Python 多核并行计算的示例代码
2017/11/07 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
python实现五子棋程序
2020/04/24 Python
Python如何telnet到网络设备
2021/02/18 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
求职简历中个人的自我评价
2013/12/01 职场文书
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
敬老月活动总结
2014/08/28 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android