详解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 相关文章推荐
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
Apr 01 Javascript
JavaScript下利用fso判断文件是否存在的代码
Dec 11 Javascript
javascript操作referer详细解析
Mar 10 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
javascript中setInterval的用法
Jul 19 Javascript
jQuery Validate插件实现表单强大的验证功能
Dec 18 Javascript
javascript实现根据汉字获取简拼
Sep 25 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
Jul 10 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 Javascript
AngularJS 监听变量变化的实现方法
Oct 09 Javascript
JS代码触发事件代码实例
Jan 02 Javascript
JavaScript获取时区实现过程解析
Sep 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加速 eAccelerator配置和使用指南
2009/06/05 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
使用jQuery实现购物车
2020/10/29 jQuery
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
python验证码识别的实例详解
2016/09/09 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python实现购物车购物小程序
2018/04/18 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
使用Python函数进行模块化的实现
2019/11/15 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
python实现学生管理系统开发
2020/07/24 Python
allbeauty美国:英国在线美容店
2019/03/11 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
环保建议书作文
2014/03/12 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
局火灾防控工作方案
2014/05/25 职场文书
卖房授权委托书样本
2014/10/05 职场文书
北大自主招生自荐信
2015/03/04 职场文书
二审答辩状范文
2015/05/22 职场文书
MySQL实现配置主从复制项目实践
2022/03/31 MySQL