详解vue-cli 3.0 build包太大导致首屏过长的解决方案


Posted in Javascript onNovember 10, 2018

前言:最近用vue-cli 3.0 构建一个小型的工单管理系统,完工后build发现一个chunk-vendors包就达到985kb,加上其他一些资源文件,首页的下载总共大小快要2M。测试给的第一个反馈就是首屏慢慢慢慢慢!

根据首屏加载资源文件过大,进行一下优化:

1. 路由懒加载

结合Vue的异步组件再结合webpack的代码分割,我们可以轻松的实现路由懒加载。

vue-cli 3.0 模式就使用了Babel,我们需要添加 syntax-dynamic-import 插件,才能使 Babel 可以正确地解析语法。

// 安装插件 syntax-dynamic-import
cnpm install --save-dev @babel/plugin-syntax-dynamic-import

// 修改babel.config.js
module.exports = {
 "presets": [
  "@vue/app"
 ],
 "plugins": [
  [
   "component",
   {
    "libraryName": "element-ui",
    "styleLibraryName": "theme-chalk"
   },
   "syntax-dynamic-import"
  ]
 ]
}

// 修改路由组件的加载(router/index.js)
{
 path: '/',
 name: 'home',
 component: resolve => require(['pages/Home'], resolve)
}

使用了路由懒加载,已经把原来的chunk-vendors降到了789kb,但加载789kb还是太大。那继续优化

2. 服务器开启Gzip

Gzip是GNU zip的缩写,顾名思义是一种压缩技术。它将浏览器请求的文件先在服务器端进行压缩,然后传递给浏览器,浏览器解压之后再进行页面的解析工作。在服务端开启Gzip支持后,我们前端需要提供资源压缩包。

通过CompressionWebpackPlugin插件build提供压缩

// 安装插件
cnpm i --save-dev compression-webpack-plugin

// 在vue-config.js 中加入
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const productionGzipExtensions = ['js', 'css'];
const isProduction = process.env.NODE_ENV === 'production';

.....
module.exports = {
....
 configureWebpack: config => {
  if (isProduction) {
   config.plugins.push(new CompressionWebpackPlugin({
    algorithm: 'gzip',
    test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
    threshold: 10240,
    minRatio: 0.8
   }))
  }
 }
}

现在我们看一下build后的压缩包的大小,大概减少了三分之二

详解vue-cli 3.0 build包太大导致首屏过长的解决方案

3. 启用CDN加速

用Gzip已把文件的大小减少了三分之二了,加载速度从之前2.7秒多到现在的1.8秒多,但这个还是得不到满足。那我们就把那些不太可能改动的代码或者库分离出来,继续减小单个chunk-vendors,然后通过CDN加载进行加速加载资源。

// 修改vue.config.js 分离不常用代码库
module.exports = {
 configureWebpack: config => {
  if (isProduction) {
   config.externals = {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'moment': 'moment'
   }
  }
 }
}
// 在public文件夹的index.html 加载

<!-- CND -->
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.runtime.min.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

现在再build后看下大小和访问速度:

详解vue-cli 3.0 build包太大导致首屏过长的解决方案

CDN优化后.jpg

可以看到chunk-verdors 又减少了114kb,通过CDN加载整个文档速度已经接近1秒。

4. 修改uglifyOptions去除console来减少文件大小

// 安装uglifyjs-webpack-plugin
cnpm install uglifyjs-webpack-plugin --save-dev

// 修改vue.config.js
 configureWebpack: config => {
  if (isProduction) {
   .....
   config.plugins.push(
    new UglifyJsPlugin({
     uglifyOptions: {
      compress: {
       warnings: false,
       drop_debugger: true,
       drop_console: true,
      },
     },
     sourceMap: false,
     parallel: true,
    })    
   )
  }
 }

如果代码中打了很log,这个优化还是有点效果的。

总结

首屏优化工作告一段落,通过以上四项的优化,已经很大的提升了首屏的加载速度。如果想再进一步优化还是空间的,例如从代码层面去减少代码量(代码复用率)。

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

Javascript 相关文章推荐
关于JQuery($.load)事件的用法和分析
Apr 09 Javascript
让图片跳跃起来  javascript图片轮播特效
Feb 16 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
Jun 17 Javascript
JavaScript箭头函数_动力节点Java学院整理
Jun 28 Javascript
JS 仿支付宝input文本输入框放大组件的实例
Nov 14 Javascript
Vue使用watch监听一个对象中的属性的实现方法
May 10 Javascript
了解JavaScript中let语句
May 30 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
Jul 14 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
Aug 05 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
ant design vue的form表单取值方法
Jun 01 Vue.js
uniapp开发打包多端应用完整方法指南
Dec 24 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 #Javascript
Vue组件之单向数据流的解决方法
Nov 10 #Javascript
详解如何制作并发布一个vue的组件的npm包
Nov 10 #Javascript
如何在基于vue-cli的项目自定义打包环境
Nov 10 #Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 #Javascript
node+express框架中连接使用mysql(经验总结)
Nov 10 #Javascript
vue axios请求频繁时取消上一次请求的方法
Nov 10 #Javascript
You might like
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
理解javascript中的闭包
2017/01/11 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
Vue组件化通讯的实例代码
2017/06/23 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
python tornado微信开发入门代码
2018/08/24 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
python中添加模块导入路径的方法
2021/02/03 Python
python在协程中增加任务实例操作
2021/02/28 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
工作表扬信的范文
2014/01/10 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
干部个人考察材料
2014/12/24 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS