详解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系列(3) 全面解析Module模式
Jan 15 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
May 12 Javascript
JS使用eval解析JSON的注意事项分析
Nov 14 Javascript
微信小程序 跳转传递数据的实例
Jul 06 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
Jan 08 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
Apr 20 Javascript
vue 中filter的多种用法
Apr 26 Javascript
详解使用angular框架离线你的应用(pwa指南)
Jan 31 Javascript
详解如何更好的使用module vuex
Mar 27 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
Aug 07 Javascript
js实现简单的贪吃蛇游戏
Apr 23 Javascript
vue全局使用axios的操作
Sep 08 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 Socket写的POP3类
2013/10/30 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
javascript 页面划词搜索JS
2009/09/28 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
使用python绘制常用的图表
2016/08/27 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
销售顾问的岗位职责
2013/11/13 职场文书
信访工作者先进事迹
2014/01/17 职场文书
公司请假条范文
2014/04/11 职场文书
放飞理想演讲稿
2014/09/09 职场文书
师范生教育见习总结
2015/06/23 职场文书
禁毒心得体会范文
2016/01/15 职场文书
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python