Vue经典项目瘦身大作战(打包压缩全过程)——体积直降3倍

简介: Vue经典项目瘦身大作战(打包压缩全过程)——体积直降3倍

一、项目打包软件及脚本


webpack@4.46.0

脚本:

直接借助vue-cli的服务进行打包,

"scripts": {
    "build": "vue-cli-service build",
  },

整个项目使用vue-cli3生成。


二、项目开发依赖环境


整个项目包含以下重量级依赖库,是打包后项目包文件庞大的根源。


  • echarts图表
  • jquery、layui(因为是旧的代码不改了)
  • SVG js 操作库拉斐尔raphael
  • 时间库moment
  • 百度vue地图


依赖包版本说明:


"dependencies": {
    "@ant-design/icons": "^2.1.1",
    "ant-design-vue": "^1.7.8",
    "axios": "^0.24.0",
    "compression-webpack-plugin": "^4.0.0",
    "core-js": "^3.6.5",
    "echarts": "^5.2.2",
    "echarts-liquidfill": "^3.1.0",
    "element-resize-detector": "^1.2.3",
    "hammer": "^0.0.5",
    "jquery": "^3.6.0",
    "js-base64": "^3.7.2",
    "layui-src": "^2.6.8",
    "moment": "^2.29.1",
    "raphael": "^2.3.0",
    "vue": "^2.6.11",
    "vue-baidu-map": "^0.21.22",
    "vue-echarts": "^6.0.0",
    "vue-router": "^3.5.3",
    "vuex": "^3.6.2"
  },

三、瘦身前


其中chunk-vendors文件差不多2M,相当大。

1666256701746.jpg


四、瘦身方法


  1. 公共文件CDN
  2. 按需引入必须用
  3. 使用webpack插件忽略未使用的文件


五、评价方法


  1. 打包分析插件webpack-bundle-analyzer进行结果评价
  2. 文件浏览器查看


六、瘦身过程


1. CDN引入


在vue.config.js文件中编辑配置,externals指的是排除以下依赖包的打包。vue等依赖包是公共基础。

注意引入后变量的使用,注意externals对象中值的书写规则,如ant-design-vue,必须使用小写的antd变量来引用

module.exports = {
  runtimeCompiler: true,
  lintOnSave: false, //是否开启eslint
  productionSourceMap: false,
  configureWebpack: {
    externals:{
      vue: 'Vue',
      'vuex':'Vuex',
      'vue-router': 'VueRouter',
      axios: 'axios',
      raphael: 'Raphael',
      'ant-design-vue': 'antd',
    },
  },
}

public/index.html文件中引入文件,


  <link rel="stylesheet" href="https://www.layuicdn.com/layui-v2.6.8/css/layui.css">
    <link rel="stylesheet" href="'https://cdn.jsdelivr.net/npm/ant-design-vue@1.7.8/dist/antd.min.css'">
  <script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/moment.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="https://www.layuicdn.com/layui-v2.6.8/layui.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <script src="https://cdn.bootcss.com/vuex/3.1.0/vuex.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/locale/zh-cn.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/ant-design-vue@1.7.8/dist/antd.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/raphael/2.3.0/raphael.js"></script>

2. antd图标库的压缩


vue.config.js文件中编辑如下配置,将所需的文件指向另一个文件。


 configureWebpack: {
    resolve:{
      alias: {
        '@ant-design/icons/lib/dist$': path.resolve(__dirname,'./src/tools/icons.js')  // 自建的文件的相对路径
      }
    },
  },

icons.js文件内容如下,


export { SettingOutline,
  CloudOutline,
  HomeOutline,
  FileImageOutline,
  SearchOutline,
  MenuFoldOutline,
  MenuUnfoldOutline,
  AppstoreOutline,
  ClusterOutline} from '@ant-design/icons'

3. echarts图表库按需引入


如果按照下述导入全部图表库是多余且占内存的,


import * as echarts from 'echarts';

在项目中只需要将需要的图标类型及组件依赖库

引入即可,

import echarts from 'echarts/lib/echarts';//导入主库
//导入用到的图表类型
import 'echarts/lib/chart/line';
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/pie';
//导入用到的图表组件,如网格、数据集、标题等
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/legend';
import 'echarts/lib/component/title';
import 'echarts/lib/component/dataset';
import 'echarts/lib/component/grid';

注意上述的图表组件库需要导入,不导入会导致图表渲染失败。


4. 百度地图


百度地图的依赖包很大,因此更加需要按需引入,如下所示。


import BaiduMap from 'vue-baidu-map/components/map/Map.vue'
import BmScale from 'vue-baidu-map/components/controls/Scale'
import BmNavigation from 'vue-baidu-map/components/controls/Navigation'
import BmMarker from 'vue-baidu-map/components/overlays/Marker'
import BmInfoWindow from 'vue-baidu-map/components/overlays/InfoWindow'

5. 插件式


过略掉moment/locale下的文件,


 configureWebpack: {
    plugins:[
      new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
    ],
  },

七、瘦身结果


1666256904846.jpg

文件浏览器中可看到,

1666256915851.jpg



相关文章
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
329 2
|
2月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
304 137
|
5月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
436 1
|
5月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
273 0
|
JavaScript 开发工具 git
vue多页面开发和打包的正确姿势
前段时间做项目,技术栈是vue+webpack,主要就是官网首页加后台管理系统 根据当时情况,分析出三种方案 一个项目代码里面嵌两个spa应用(官网和后台系统) 分开两套项目源码 一套项目源码里面就一个spa应用 思考: 直接否定了一套项目源码里一个spa应用(ui样式会相互覆盖,如果没有代码规范后期比较难维护) 两套源码的话,后台可能开两个端口,然后需要用nginx反向代理可能比较麻烦,而且前端开发也比较麻烦麻烦,毕竟需要维护两个git仓库,两套git上线流程,可能会损耗很多时间。
4635 0
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
818 0
|
8月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1053 4
|
6月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
7月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
891 77
|
8月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍

热门文章

最新文章