浅谈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 相关文章推荐
个人总结的一些关于String、Function、Array的属性和用法
Jan 10 Javascript
jQuery使用手册之 事件处理
Mar 24 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
Feb 22 Javascript
文本框只能选择数据到文本框禁止手动输入
Nov 22 Javascript
jquery sortable的拖动方法示例详解
Jan 16 Javascript
js拼接html注意问题示例探讨
Jul 14 Javascript
AngularJs Modules详解及示例代码
Sep 01 Javascript
详解Angular2组件之间如何通信
Jun 22 Javascript
Angular4的输入属性与输出属性实例详解
Nov 29 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
Jan 08 Javascript
JS 实现百度搜索功能
Feb 01 Javascript
jQuery 操作 HTML 元素和属性的方法
Nov 12 jQuery
浅谈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
第七节--类的静态成员
2006/11/16 PHP
php入门小知识
2008/03/24 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
js原生map实现的方法总结
2020/01/19 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Python实现统计代码行的方法分析
2017/07/12 Python
python九九乘法表的实例
2017/09/26 Python
python修改FTP服务器上的文件名
2019/09/11 Python
python学习笔记之多进程
2020/08/06 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
立志成才演讲稿
2014/09/04 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL