详解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 相关文章推荐
实现复选框全选/全不选切换
Dec 23 Javascript
Mootools 1.2 手风琴(Accordion)教程
Sep 15 Javascript
JavaScript 学习笔记(四)
Dec 31 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
Aug 14 Javascript
jquery插件jquery倒计时插件分享
Dec 27 Javascript
简单的分页代码js实现
May 17 Javascript
实现easyui的datagrid导出为excel的示例代码
Nov 10 Javascript
利用Ionic2 + angular4实现一个地区选择组件
Jul 27 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 Javascript
Vue中使用clipboard实现复制功能
Sep 05 Javascript
基于vue实现简易打地鼠游戏
Aug 21 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读取flv文件的播放时间长度
2009/09/03 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
php注册登录系统简化版
2020/12/28 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
javascript计时器详解
2015/02/28 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
vue实现简单跑马灯效果
2020/05/25 Javascript
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
英国儿童图书网站:Scholastic
2017/03/26 全球购物
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
秋季运动会加油稿200字
2014/01/11 职场文书
服务质量承诺书
2014/03/27 职场文书
模具专业求职信
2014/06/26 职场文书
认错检讨书
2014/10/02 职场文书
中秋节慰问信
2015/02/15 职场文书
项目负责人岗位职责
2015/02/15 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
企业百日安全活动总结
2015/05/07 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS