当前位置:   article > 正文

vue3 ,vite,ant design vue 极限优化打包大小,动态导入css_vite 打包antidesign之后体积过大的问题

vite 打包antidesign之后体积过大的问题

1,没有优化之前打包大小:

 没有压缩之前 3145KB,开启gzip压缩以后607k

2,成果:在优化完成以后,实际上那个3145KB的文件变成了242KB 整整小了12倍 (下面的default.js和dark.js实际上是样式文件,而且会异步加载)

3,总体方法:

(1) 全局引入的ant design vue 改为组件局部引入,这样带来了很多好处,包括 :

        更小的打包大小,更快的启动速度,更好的tree-shaking,更准确的类型推测

        缺点也有:

        每个文件多一行导入代码,如果大量文件修改费时间

        但是带来的效果是显著的

(2) 由于系统用到了图标选择功能,之前是全量引入了ant design icon 图标,现在改为 使用iconify 引用图标

        iconify图标就类似于iconfont,使用方法如下:

        下载安装:

  1. yarn add @iconify/iconify
  2. yarn add vite-plugin-purge-icons @iconify/json -D

        全局配置:

  1. // vite.config.js
  2. import PurgeIcons from 'vite-plugin-purge-icons'
  3. export default {
  4. plugins: [
  5. PurgeIcons({
  6. /* PurgeIcons Options */
  7. })
  8. ]
  9. }

        写一个组件

  1. <!--
  2. * @Author: YangLiwei
  3. * @Date: 2021-09-10 15:58:09
  4. * @LastEditTime: 2022-07-06 15:38:29
  5. * @LastEditors: YangLiwei
  6. * @FilePath: \vite-admin\src\components\Icon.vue
  7. * @Description:
  8. -->
  9. <template>
  10. <span ref="elRef" class="anticon"></span>
  11. </template>
  12. <script lang="ts" setup>
  13. import Iconify from "@purge-icons/generated";
  14. import { nextTick, ref, unref, watchEffect } from "vue";
  15. const props = defineProps({
  16. name: {
  17. type: String,
  18. default: () => "",
  19. },
  20. prefix: {
  21. type: String,
  22. default: () => "ant-design",
  23. },
  24. });
  25. const elRef = ref<Element>();
  26. const update = async () => {
  27. const el = unref(elRef);
  28. if (!el) return;
  29. await nextTick();
  30. const icon = props.prefix + ":" + props.name;
  31. if (!icon) return;
  32. const svg = Iconify.renderSVG(icon, {
  33. width: "1.2em",
  34. height: "1.2em",
  35. });
  36. if (svg) {
  37. el.textContent = "";
  38. el.appendChild(svg);
  39. } else {
  40. const span = document.createElement("span");
  41. span.className = "iconify";
  42. span.dataset.icon = icon;
  43. el.textContent = "";
  44. el.appendChild(span);
  45. }
  46. };
  47. watchEffect(() => update());
  48. </script>

         使用:

  1. <Menu>
  2. <MenuItem>
  3. <Icon name="edit-outlined" class="mr-2" />
  4. <a @click="changePassword">修改密码</a>
  5. </MenuItem>
  6. <MenuItem>
  7. <Icon name="logout-outlined" class="mr-2" />
  8. <a @click="logout">退出登录</a>
  9. </MenuItem>
  10. </Menu>

 (3),提取黑暗模式css和普通模式css

可以参考

vue3 vite ant deign vue 黑暗模式实现_yangliweigauguagua的博客-CSDN博客

切换没问题,但是打包的时候会把两个css文件一起打包进index.js,造成js文件过大

思路就是在要用到的时候动态引入css

但是在用动态引入的时候会出现页面中自动加载css的问题

解决方法就是在css后面加上?inline,vite官方文档地址:

功能 | Vite 官方中文文档

 具体代码如下:

  1. // 切换黑暗模式或者白天模式
  2. export const DarkMode = async (isDark: boolean) => {
  3. if (isDark) {
  4. changeTheme((await import("../less/dark.less?inline")).default);
  5. changeCss("--page-bg-color", "#141414");
  6. changeCss("--head-bg-color", "rgba(0, 0, 0, 0.5)");
  7. changeCss("--line-color", "#2e2e2e");
  8. changeCss("--content-bg-color", "rgb(255 255 255 / 4%)");
  9. changeCss("--text-color", "rgba(255, 255, 255, 0.85)");
  10. } else {
  11. changeTheme((await import("../less/light.less?inline")).default);
  12. changeCss("--page-bg-color", "white");
  13. changeCss("--head-bg-color", "rgba(255, 255, 255, 0.7)");
  14. changeCss("--line-color", "#e8e8e8");
  15. changeCss("--content-bg-color", "#f0f2f5");
  16. changeCss("--text-color", "rgba(0, 0, 0, 0.85)");
  17. }
  18. };

(4),可以使用 rollup-plugin-visualizer 插件查看当前项目打包结构来针对性优化

这是优化后的图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/606151
推荐阅读
相关标签
  

闽ICP备14008679号