详解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的执行速度
Jan 23 Javascript
php gethostbyname获取域名ip地址函数详解
Jan 24 Javascript
json-lib出现There is a cycle in the hierarchy解决办法
Feb 24 Javascript
javascript异步编程的4种方法
Feb 19 Javascript
jQuery获取动态生成的元素示例
Jun 15 Javascript
Bootstrap开发实战之第一次接触Bootstrap
Jun 02 Javascript
JavaScript中闭包之浅析解读(必看篇)
Aug 25 Javascript
bootstrap按钮插件(Button)使用方法解析
Jan 13 Javascript
微信小程序 动态绑定事件并实现事件修改样式
Apr 13 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
Mar 27 Javascript
vue 通过下拉框组件学习vue中的父子通讯
Dec 19 Javascript
微信小程序 接入腾讯地图的两种写法
Jan 12 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
php伪静态之APACHE篇
2014/06/02 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
用jQuery技术实现Tab页界面之二
2009/09/21 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
python函数的5种参数详解
2017/02/24 Python
Python多线程实现同步的四种方式
2017/05/02 Python
python安装twisted的问题解析
2018/08/21 Python
python生成九宫格图片
2018/11/19 Python
python实现二维插值的三维显示
2018/12/17 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
党的群众路线教育实践活动总结
2014/10/30 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
Redis可视化客户端小结
2021/06/10 Redis
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技