详解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 相关文章推荐
JavaScript 闭包在封装函数时的简单分析
Nov 28 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
Apr 13 Javascript
setInterval计时器不准的问题解决方法
May 08 Javascript
JavaScript作用域链示例分享
May 27 Javascript
js实现用户注册协议倒计时的方法
Jan 21 Javascript
jQuery数据缓存用法分析
Feb 20 Javascript
jquery实现公告翻滚效果
Feb 27 Javascript
js实现获取两个日期之间所有日期的方法
Jun 17 Javascript
原生js实现手风琴功能(支持横纵向调用)
Jan 13 Javascript
React Router V4使用指南(精讲)
Sep 17 Javascript
element实现合并单元格通用方法
Nov 13 Javascript
Vue如何使用混合Mixins和插件开发详解
Feb 05 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通过curl模拟登陆DZ论坛
2015/05/11 PHP
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
jquery实现点击页面回到顶部
2016/11/23 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
几道Web/Ajax的面试题
2016/11/05 面试题
产品工艺师的岗位职责
2013/11/15 职场文书
超市总经理岗位职责
2014/02/02 职场文书
网络管理员岗位职责
2014/03/17 职场文书
社会实践活动总结范文
2014/07/03 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
2015年护士节活动总结
2015/02/10 职场文书
倡议书的格式写法
2015/04/28 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
Go 语言结构实例分析
2021/07/04 Golang
HTML基本元素标签介绍
2022/02/28 HTML / CSS