详解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 相关文章推荐
JQuery实现倒计时按钮的实现代码
Mar 23 Javascript
js脚本获取webform服务器控件的方法
May 16 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
Oct 16 Javascript
浅谈Javascript变量作用域问题
Dec 16 Javascript
jquery实现勾选复选框触发事件给input赋值
Feb 01 Javascript
jQuery实现简单下拉导航效果
Sep 07 Javascript
分享使用AngularJS创建应用的5个框架
Dec 05 Javascript
Angular2搜索和重置按钮过场动画
May 24 Javascript
javascript实现文字无缝滚动效果
Aug 26 Javascript
node.js实现微信开发之获取用户授权
Mar 18 Javascript
layui监听单元格编辑前后交互的例子
Sep 16 Javascript
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
优雅的在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内存相关的功能特性详解
2013/06/08 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
jquery 日期分离成年月日的代码
2010/05/14 Javascript
浏览器加载、渲染和解析过程黑箱简析
2012/11/29 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
150行代码带你实现微信小程序中的数据侦听
2019/05/17 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
python列出目录下指定文件与子目录的方法
2015/07/03 Python
Python可变参数用法实例分析
2017/04/02 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
大学生收银员求职信分享
2014/01/02 职场文书
处级干部考察材料
2014/12/24 职场文书
大学生社会实践感想
2015/08/11 职场文书
师德培训心得体会2016
2016/01/09 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
python神经网络 使用Keras构建RNN训练
2022/05/04 Python