浅谈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 相关文章推荐
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
May 25 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
Oct 17 Javascript
jQuery里filter()函数与find()函数用法分析
Jun 24 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
Sep 20 Javascript
详解jQuery中的empty、remove和detach
Apr 11 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
Jun 29 Javascript
微信小程序 页面传值详解
Mar 10 Javascript
微信小程序五星评分效果实现代码
Apr 06 Javascript
基于JavaScript 实现拖放功能
Sep 12 Javascript
微信小程序本地存储实现每日签到、连续签到功能
Oct 09 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 Javascript
什么是SOLID
Mar 24 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核心代码分析require和include的区别
2011/01/02 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
Vue实现table上下移动功能示例
2019/02/21 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python打开使用的方法
2019/09/30 Python
Python底层封装实现方法详解
2020/01/22 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
精细化工应届生求职信
2013/11/17 职场文书
环境工程毕业生自荐信
2013/11/17 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
如何在C++中调用Python
2021/05/21 Python
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers