详解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 相关文章推荐
js checkbox(复选框) 使用集锦
Apr 28 Javascript
由Javascript实现的页面日历
Nov 04 Javascript
JS实现图片预加载无需等待
Dec 21 Javascript
jQuery中的$.ajax()方法应用
May 06 Javascript
学习JavaScript设计模式之装饰者模式
Jan 19 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
Oct 11 Javascript
利用JS实现页面删除并重新排序功能
Dec 09 Javascript
Angularjs上传文件组件flowjs功能
Aug 07 Javascript
angular.extend方法的具体使用
Sep 14 Javascript
解决jquery有正确返回值但不执行success函数的问题
Aug 20 jQuery
node 标准输入流和输出流代码实例
Sep 19 Javascript
JavaScript this使用方法图解
Feb 04 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 冒泡排序算法的实现代码
2010/08/08 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
python 切片和range()用法说明
2013/03/24 Python
wxPython中文教程入门实例
2014/06/09 Python
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
Python socket 套接字实现通信详解
2019/08/27 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python