当前位置:   article > 正文

分享基于vite对vue3项目打包优化经验(持续更新)_vite打包优化加载

vite打包优化加载

性能工具


当项目打包完如何分析各个包的打包体积?

可以安装 **rollup-plugin-visualizer**插件(vite插件),它是一个打包体积分析插件,可以看到打包后的所有文件大小,可以用于判断配置vite优化前后包体积大小的变化

npm i rollup-plugin-visualizer -D
import { visualizer } from 'rollup-plugin-visualizer'
  1. export default defineConfig({
  2.   plugins: [
  3.      // 打包体积分析
  4.     visualizer({
  5.       open: true,
  6.       filename: 'visualizer.html' //分析图生成的文件名
  7.     }),
  8.   ],
  9. })

打包完成会生成一个html文件,就可以看到各个包的体积大小了


vite打包优化过程


实现自动按需引入


利用`unplugin-vue-components`插件实现组件自动按需导入,
利用`unplugin-auto-import`插件实现自动按需引入

具体配置

npm install -D unplugin-vue-components unplugin-auto-import
  1. // 按需自动引入导入element plus。
  2. import AutoImport from 'unplugin-auto-import/vite'
  3. import Components from 'unplugin-vue-components/vite'
  4. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'


我项目是用在按需自动引入导入element plus库

  1. export default defineConfig({
  2.   plugins: [
  3.     // 按需导入element plus组件
  4.     AutoImport({
  5.       resolvers: [ElementPlusResolver()]
  6.     }),
  7.     // 按需导入element plus 自定义主题。
  8.     Components({
  9.       resolvers: [ElementPlusResolver({ importStyle: 'sass' })]
  10.     }),
  11.   ],
  12. })

配置打包文件分类输出

  1. build: {
  2.     rollupOptions: {
  3.       output: {
  4.         chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称
  5.         entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称
  6.         assetFileNames: '[ext]/[name]-[hash].[ext]', // 资源文件像 字体,图片等
  7.       }
  8.     }
  9. }

最小化拆分包

 将需要分离的包单独的打包出来

  1.   output: {
  2.     // 最小化拆分包
  3.     manualChunks(id) {
  4.       if (id.includes('node_modules')) {
  5.         return id.toString().split('node_modules/')[1].split('/')[0].toString();
  6.       }
  7.     }
  8.   },


开启图片压缩

  1. // 图片压缩
  2. import viteImagemin from 'vite-plugin-imagemin'
  1. export default defineConfig({
  2.   plugins: [
  3.      // 图片资源压缩
  4.     viteImagemin({
  5.       gifsicle: {
  6.         // gif图片压缩
  7.         optimizationLevel: 3, // 选择13之间的优化级别
  8.         interlaced: false // 隔行扫描gif进行渐进式渲染
  9.       },
  10.       optipng: { // png
  11.         optimizationLevel: 7 // 选择07之间的优化级别
  12.       },
  13.       mozjpeg: {// jpeg
  14.         quality: 20 // 压缩质量,范围从0(最差)到100(最佳)。
  15.       },
  16.       pngquant: {// png
  17.         quality: [0.8, 0.9], // Min和max是介于0(最差)到1(最佳)之间的数字,类似于JPEG。达到或超过最高质量所需的最少量的颜色。如果转换导致质量低于最低质量,图像将不会被保存。
  18.         speed: 4 // 压缩速度,1(强力)到11(最快)
  19.       },
  20.       svgo: {
  21.         plugins: [
  22.           // svg压缩
  23.           {
  24.             name: 'removeViewBox'
  25.           },
  26.           {
  27.             name: 'removeEmptyAttrs',
  28.             active: false
  29.           }
  30.         ]
  31.       }
  32.     }),
  33.   ],
  34. })


开启压缩后图片体积大小减少60%以上


文件压缩

问:开启Gzip压缩能压缩哪些类型的文件?

1、对文本进行压缩

支持对文本进行压缩,这里的文本包括 HTML、CSS、JS文件,都会进行不一定程度的压缩。

2、不支持对非文本类型压缩

像咱们常见的图片(JPEG、PNG、GIF)都属于非文本类型,gzip 都不支持压缩哦。

  1. //Gzip文件压缩
  2. import viteCompression from 'vite-plugin-compression'
  1. export default defineConfig({
  2.   plugins: [
  3.      //开启Gzip压缩
  4.     viteCompression({
  5.       verbose: true, // 是否在控制台中输出压缩结果
  6.       disable: false,
  7.       threshold: 1024, // 如果体积大于阈值,将被压缩,单位为b,体积过小时请不要压缩,以免适得其反
  8.       algorithm: 'gzip', // 压缩算法,可选['gzip'' brotliccompress ''deflate ''deflateRaw']
  9.       ext: '.gz',
  10.       deleteOriginFile: true // 源文件压缩后是否删除(我为了看压缩后的效果,先选择了true)
  11.     })
  12.   ],
  13. })


开启CDN加速

pnpm add rollup-plugin-external-globals -D

  1. const globals = externalGlobals({
  2.   lodash: 'lodash',
  3.   jspdf: 'jspdf',
  4.   html2canvas: 'html2canvas'
  5. })
  6. export default defineConfig({
  7.   build: {
  8.     rollupOptions: {
  9.       //打包时不引入外部模块,使用cdn引入
  10.       external: ['lodash', 'jspdf', 'html2canvas'],
  11.       plugins: [globals]
  12.     },
  13.   }
  14. })


在index.html文件的head标签内引入对应库的CDN


  

具体的CDN链接根据自己需要去官网或是CDN网站查询,cdn网站:cdnjs.com/
    


terser 压缩和去除console+debugger

npm i terser -D
  1. export default defineConfig({
  2.    build: {
  3.     minify: 'terser',
  4.     // 清除所有console和debugger
  5.     terserOptions: {
  6.       compress: {
  7.         drop_console: true,
  8.         drop_debugger: true
  9.       }
  10.     }
  11.   }
  12. })

最后,项目打包后的体积大小从4.52MB变小为2.86MB

优化前

优化后


  
  


其它还未应用的优化


预渲染


进行SEO优化

npm i vite-plugin-prerender -D
  1. // 预渲染
  2. import vitePrerender from 'vite-plugin-prerender'
  1. export default defineConfig({
  2.   plugins: [
  3.     // 预渲染
  4.     vitePrerender({
  5.       staticDir: path.join(__dirname, 'dist'),
  6.       routes: ['/', '/design', '/index']
  7.     }),
  8.   ],
  9. })


打包完成后,会根据配置的路由地址,在dist文件中生成对应的index.html文件


SVG图标优化


svg组件封装优化是我在其它项目使用的优化


在开发项目的时候会用到svg矢量图,而且我们使用SVG以后,页面上加载的不再是图片资源,
这对页面性能来说是个很大的提升,而且SVG文件比img体积大小要小很多

安装SVG依赖插件

pnpm install vite-plugin-svg-icons -D

在`vite.config.ts`中配置插件

  1. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
  2. import path from 'path'
  3. export default () => {
  4.   return {
  5.     plugins: [
  6.       createSvgIconsPlugin({
  7.         // Specify the icon folder to be cached
  8.         iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
  9.         // Specify symbolId format
  10.         symbolId: 'icon-[dir]-[name]',
  11.       }),
  12.     ],
  13.   }
  14. }


入口文件导入

import 'virtual:svg-icons-register'

svg组件封装

  1. <template>
  2.   <div>
  3.     <svg :style="{ width: width, height: height }">
  4.       <use :xlink:href="prefix + name" :fill="color"></use>
  5.     </svg>
  6.   </div>
  7. </template>
  8. <script setup lang="ts">
  9. defineProps({
  10.   //xlink:href属性值的前缀
  11.   prefix: {
  12.     type: String,
  13.     default: '#icon-'
  14.   },
  15.   //svg矢量图的名字
  16.   name: String,
  17.   //svg图标的颜色
  18.   color: {
  19.     type: String,
  20.     default: ""
  21.   },
  22.   //svg宽度
  23.   width: {
  24.     type: String,
  25.     default: '16px'
  26.   },
  27.   //svg高度
  28.   height: {
  29.     type: String,
  30.     default: '16px'
  31.   }
  32. })
  33. </script>
  34. <style scoped></style>


按需加载第三方包的体积

比如loadsh,项目中可能只用到了cloneDeep 、throttle这几个函数,但是由于lodash是common.js版本不支持按需引入,整个包都会被打包进来,影响性能

lodash-es 是 lodash 的 es modules 版本 ,具备 ES6 模块化的版本,可以按需导入,**使用loadsh-es代替lodash,按需引入,减少打包体积**

  1. import _ from 'lodash-es'; // 将会把整个lodash的库引入到项目
  2. import { cloneDeep } from 'lodash-es'; // 将只会把cloneDeep引入到项目

自动重启 vite 服务

使用 `vite-plugin-restart` 插件,监听 `vite.config.js` 或 `.env.development` 等配置文件修改直接生效,不需要反复重启 Vite

npm i vite-plugin-restart -D
  1. import ViteRestart from 'vite-plugin-restart'
  2. export default {
  3.   plugins: [
  4.     ViteRestart({
  5.       restart: [
  6.         'my.config.[jt]s'
  7.       ]
  8.     })
  9.   ],
  10. }

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

闽ICP备14008679号