compress.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { isArray } from 'lodash-es';
  2. import compressPlugin from 'vite-plugin-compression';
  3. import type { Plugin } from 'vite';
  4. export const configCompressPlugin = (compress: BuildCompression): Plugin | Plugin[] | null => {
  5. if (compress === 'none') return null;
  6. const gz = {
  7. // 生成的压缩包后缀
  8. ext: '.gz',
  9. // 体积大于threshold才会被压缩
  10. threshold: 0,
  11. // 默认压缩.js|mjs|json|css|html后缀文件,设置成true,压缩全部文件
  12. filter: () => true,
  13. // 压缩后是否删除原始文件
  14. deleteOriginFile: false,
  15. };
  16. const br = {
  17. ext: '.br',
  18. algorithm: 'brotliCompress',
  19. threshold: 0,
  20. filter: () => true,
  21. deleteOriginFile: false,
  22. };
  23. const codeList = [
  24. { k: 'gzip', v: gz },
  25. { k: 'brotli', v: br },
  26. { k: 'both', v: [gz, br] },
  27. ];
  28. const plugins: Plugin[] = [];
  29. codeList.forEach((item) => {
  30. if (compress.includes(item.k)) {
  31. if (compress.includes('clear')) {
  32. if (isArray(item.v)) {
  33. item.v.forEach((vItem) => {
  34. plugins.push(
  35. compressPlugin(Object.assign(vItem, { deleteOriginFile: true }))
  36. );
  37. });
  38. } else {
  39. plugins.push(compressPlugin(Object.assign(item.v, { deleteOriginFile: true })));
  40. }
  41. } else {
  42. if (isArray(item.v)) {
  43. item.v.forEach((vItem) => {
  44. plugins.push(compressPlugin(vItem));
  45. });
  46. } else {
  47. plugins.push(compressPlugin(item.v));
  48. }
  49. }
  50. }
  51. });
  52. return plugins;
  53. };