当前位置:   article > 正文

vite构建打包性能优化_vite-plugin-imagemin

vite-plugin-imagemin

目录

1、清除console和debugger

二、gzip静态资源压缩

第一步:客户端打包开启

第二步:部署服务端开启

三、 静态文件按类型分包

四、超大静态资源拆分(代码分割)

第一种:提高静态资源的容量大小

第二种:合并路由打包

第三种:最小拆分打包

五、打包分析插件

六、组件按需导入

七、图片资源压缩

八、CDN加速 


最近在用Vite4+Typescript+Vue3.2+SSR重构我的博客,由于项目内容较多,所以遇到了一些性能问题,所以在构建生产环境时做了一些优化,在这里做一个记录,方便大家参考。

1、清除console和debugger

 build里添加terserOptions配置

  1. // 打包环境移除console.log,debugger
  2. terserOptions: {
  3. compress: {
  4. drop_console: true,
  5. drop_debugger: true
  6. }
  7. },

二、gzip静态资源压缩

第一步:客户端打包开启

首先下载 vite-plugin-compression

npm i vite-plugin-compression -D

在vite.config.ts中引入

  1. // 引入
  2. import viteCompression from 'vite-plugin-compression'
  3. //在plugins配置数组里添加gzip插件
  4. viteCompression({
  5. verbose: true, // 默认即可
  6. disable: false, // 开启压缩(不禁用),默认即可
  7. deleteOriginFile: false, // 删除源文件
  8. threshold: 5120, // 压缩前最小文件大小
  9. algorithm: 'gzip', // 压缩算法
  10. ext: '.gz' // 文件类型
  11. })

打包出的效果图: 

第二步:部署服务端开启

  nginx中添加压缩配置

  1. # 开启或者关闭gzip模块(on|off)
  2. gzip on;
  3. # 允许压缩的页面最小字节数, 默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大
  4. gzip_min_length 1k;
  5. # 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。
  6. gzip_buffers 4 16k;
  7. # 识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。
  8. #gzip_http_version 1.0;
  9. # gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。
  10. gzip_comp_level 2;
  11. # 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
  12. gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  13. # 和http头有关系,加个vary头,给代理服务器用的
  14. gzip_vary off;
  15. # 表示IE6及以下禁止压缩
  16. gzip_disable "MSIE [1-6]\.";

三、 静态文件按类型分包

  build中添加如下代码:

  1. build: {
  2. rollupOptions: {
  3. output: {
  4. chunkFileNames: 'static/js/[name]-[hash].js',
  5. entryFileNames: 'static/js/[name]-[hash].js',
  6. assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
  7. }
  8. }
  9. }

四、超大静态资源拆分(代码分割)

第一种:提高静态资源的容量大小
  1. build: {
  2. chunkSizeWarningLimit: 1500,
  3. }
第二种:合并路由打包

  build里的output设置内,添加以下代码

  1. manualChunks: {
  2. // vue vue-router合并打包
  3. vue: ['vue', 'vue-router'],
  4. lodash: ['lodash'],
  5. // 两个文件合并成一个a文件
  6. helloWorld: ['src/components/a.vue','src/components/b.vue'],
  7. }
第三种:最小拆分打包
  1. // 插件打包做处理
  2. manualChunks(id) {
  3. if (id.includes('node_modules')) {
  4. return id.toString().split('node_modules/')[1].split('/')[0].toString();
  5. }
  6. return;
  7. }

五、打包分析插件

Rollup Plugin Visualizer,这是一个依赖分析插件,它提供了多种模式的依赖分析,包括直观的视图分析,sunburst(循环层次图,像光谱)、treemap(矩形层次图,看起来比较直观,也是默认参数)、network(网格图,查看包含关系)、raw-data(原数据模式,json格式), list(列表模式),你可以选择任意一种你喜欢的观察模式。

安装rollup-plugin-visualizer插件

npm i rollup-plugin-visualizer

在vite.config.ts中引入并配置

  1. // 引入
  2. import { visualizer } from 'rollup-plugin-visualizer';
  3. // 在plugins配置数组里添加
  4. visualizer({
  5. open:true, // 注意这里要设置为true,否则无效
  6. gzipSize:true,
  7. brotliSize:true
  8. }),

效果图:

六、组件按需导入

安装unplugin-vue-components插件

npm i unplugin-vue-components -D

在vite.config.ts中引入并配置

  1. import Components from 'unplugin-vue-components/vite'
  2. // ui库解析器,也可以自定义,需要安装相关UI库,unplugin-vue-components/resolvers
  3. // 提供了以下集中解析器,使用的时候,需要安装对应的UI库,这里以element为示例
  4. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
  5. export default defineConfig({
  6. plugins: [
  7. Components({
  8. dirs: ['src/components'], // 目标文件夹
  9. extensions: ['vue','jsx'], // 文件类型
  10. dts: 'src/components.d.ts', // 输出文件,里面都是一些import的组件键值对
  11. // ui库解析器,也可以自定义,需要安装相关UI库
  12. resolvers: [
  13. ElementPlusResolver(),
  14. ],
  15. })
  16. ]
  17. })

七、 图片资源压缩

安装 vite-plugin-imagemin插件

npm i vite-plugin-imagemin -D

 在vite.config.js里面配置

  1. // 引入
  2. import viteImagemin from 'vite-plugin-imagemin'
  3. // 在plugins配置数组里添加
  4. plugin: [
  5. viteImagemin({
  6. gifsicle: {
  7. optimizationLevel: 7,
  8. interlaced: false
  9. },
  10. optipng: {
  11. optimizationLevel: 7
  12. },
  13. mozjpeg: {
  14. quality: 20
  15. },
  16. pngquant: {
  17. quality: [0.8, 0.9],
  18. speed: 4
  19. },
  20. svgo: {
  21. plugins: [
  22. {
  23. name: 'removeViewBox'
  24. },
  25. {
  26. name: 'removeEmptyAttrs',
  27. active: false
  28. }
  29. ]
  30. }
  31. })
  32. ]

八、CDN加速 

内容分发网络(Content Delivery Network,简称 CDN)就是让用户从最近的服务器请求资源,提升网络请求的响应速度。通常我们请求依赖模块使用 CDN ,而请求项目代码依然使用自己的服务器。还是以 lodash 为例:

安装插件 vite-plugin-cdn-import

npm install vite-plugin-cdn-import --save-dev

 在vite.config.js里面配置

  1. import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';
  2. export default defineConfig({
  3. plugins: [
  4. importToCDN({
  5. // 需要 CDN 加速的模块
  6. modules: [
  7. // 支持自动导入
  8. autoComplete('axios'),
  9. {
  10. name: 'lodash',
  11. var: '_',
  12. path: `https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js`
  13. }
  14. ]
  15. })
  16. ]
  17. })

 配置完成后,打包自动会在index.html中引入script资源,如下图:

自动导入CDN的功能(autoComplete),有很多常用的依赖不需要自己再找(如vue、reac、antd、axios等),autoComplete功能可以在文档中查找使用。

支持自动完成的模块:

 

注意:自动完成记得在main.ts中引入模块

 在main.ts引入对应模块然后挂载,注意名称要和你CDN加速的name名称相同,不然引不进来,一般不用怎么修改,只有遇到问题后再检查一下自己是不是忘记引入或者引入错误了。

CDN网站查看: https://cdnjs.com/

注意:build打包时候如果遇到报错importToCDN is not a function,这个错误应该和版本有关,将import importToCDN from 'vite-plugin-cdn-import'引入改成import { Plugin as importToCDN } from 'vite-plugin-cdn-import'即可

完整的vite.config.ts 

  1. import path from 'path';
  2. import { defineConfig } from 'vite';
  3. import vue from '@vitejs/plugin-vue';
  4. import vueJsx from '@vitejs/plugin-vue-jsx';
  5. import Components from 'unplugin-vue-components/vite';
  6. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
  7. import { viteCommonjs } from '@originjs/vite-plugin-commonjs';
  8. import AutoImport from 'unplugin-auto-import/vite';
  9. import WindiCSS from 'vite-plugin-windicss';
  10. import viteCompression from 'vite-plugin-compression';
  11. import { visualizer } from 'rollup-plugin-visualizer';
  12. import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';
  13. // 引入
  14. import viteImagemin from 'vite-plugin-imagemin';
  15. import Components from 'unplugin-vue-components/vite';
  16. // ui库解析器,也可以自定义,需要安装相关UI库,unplugin-vue-components/resolvers
  17. // 提供了以下集中解析器,使用的时候,需要安装对应的UI库,这里以element为示例
  18. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
  19. const pathSrc = path.resolve(__dirname, 'src');
  20. export default defineConfig({
  21. resolve: {
  22. alias: {
  23. '@/': `${pathSrc}/`
  24. }
  25. },
  26. plugins: [
  27. vueJsx(),
  28. WindiCSS(),
  29. vue(),
  30. visualizer(),
  31. viteCommonjs(),
  32. Components({
  33. dirs: ['src/components'], // 目标文件夹
  34. extensions: ['vue', 'jsx'], // 文件类型
  35. dts: 'src/components.d.ts', // 输出文件,里面都是一些import的组件键值对
  36. // ui库解析器,也可以自定义,需要安装相关UI库
  37. resolvers: [
  38. ElementPlusResolver()
  39. ]
  40. }),
  41. // 自动导入vue3的hooks
  42. AutoImport({
  43. resolvers: [ElementPlusResolver()],
  44. imports: ['vue', 'vue-router', 'vuex', '@vueuse/core'],
  45. // 生成路径
  46. dts: path.resolve(pathSrc, 'auto-imports.d.ts')
  47. }),
  48. // 自动导入组件
  49. Components({
  50. resolvers: [
  51. ElementPlusResolver({
  52. importStyle: 'sass'
  53. })
  54. ],
  55. dts: path.resolve(pathSrc, 'components.d.ts')
  56. }),
  57. viteCompression({
  58. // gzip静态资源压缩配置
  59. verbose: true,
  60. disable: false,
  61. threshold: 10240,
  62. algorithm: 'gzip',
  63. ext: '.gz'
  64. }),
  65. importToCDN({
  66. // 需要 CDN 加速的模块
  67. modules: [
  68. autoComplete('axios'),
  69. {
  70. name: 'lodash',
  71. var: '_',
  72. path: `https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js`
  73. }
  74. ]
  75. }),
  76. viteImagemin({
  77. gifsicle: {
  78. optimizationLevel: 7,
  79. interlaced: false
  80. },
  81. optipng: {
  82. optimizationLevel: 7
  83. },
  84. mozjpeg: {
  85. quality: 20
  86. },
  87. pngquant: {
  88. quality: [0.8, 0.9],
  89. speed: 4
  90. },
  91. svgo: {
  92. plugins: [
  93. {
  94. name: 'removeViewBox'
  95. },
  96. {
  97. name: 'removeEmptyAttrs',
  98. active: false
  99. }
  100. ]
  101. }
  102. })
  103. ],
  104. server: {
  105. watch: { usePolling: true },
  106. open: false,
  107. hmr: true,
  108. /* 设置为0.0.0.0则所有的地址均能访问 */
  109. host: '0.0.0.0',
  110. port: 8080,
  111. https: false,
  112. proxy: {
  113. '/api': {
  114. /* 目标代理服务器地址 */
  115. target: 'https://code-nav.top/',
  116. /* 允许跨域 */
  117. changeOrigin: true
  118. }
  119. }
  120. },
  121. build: {
  122. outDir: 'JcCloudWeb',
  123. minify: 'terser',
  124. cssCodeSplit: true,
  125. chunkSizeWarningLimit: 1500,
  126. rollupOptions: {
  127. input: 'index.html',
  128. output: {
  129. // 静态资源打包做处理
  130. chunkFileNames: 'assets/js/[name]-[hash].js',
  131. entryFileNames: 'assets/js/[name]-[hash].js',
  132. assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
  133. manualChunks(id) {
  134. if (id.includes('node_modules')) {
  135. return id.toString().split('node_modules/')[1].split('/')[0].toString();
  136. }
  137. }
  138. }
  139. },
  140. terserOptions: {
  141. // 清除console和debugger
  142. compress: {
  143. drop_console: true,
  144. drop_debugger: true
  145. }
  146. }
  147. }
  148. });

如果你的项目已经在用 Vite ,不妨试验一下以上方案,看看项目会不会变得更加丝滑。欢迎在评论区交流。

如果文章对你有所帮助,❤️关注+点赞❤️鼓励一下博主会持续更新。。。。

我的线上博客:富朝阳的博客

往期回顾

Webpack性能优化

vite构建如何兼容低版本浏览器

前端性能优化9大策略(面试一网打尽)!

vue3.x使用prerender-spa-plugin预渲染达到SEO优化

 vite构建打包性能优化

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

闽ICP备14008679号