compress.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. verbose: false,
  17. };
  18. const br = {
  19. ext: '.br',
  20. algorithm: 'brotliCompress',
  21. threshold: 0,
  22. filter: () => true,
  23. deleteOriginFile: false,
  24. verbose: false,
  25. };
  26. const codeList = [
  27. { k: 'gzip', v: gz },
  28. { k: 'brotli', v: br },
  29. { k: 'both', v: [gz, br] },
  30. ];
  31. const plugins: Plugin[] = [];
  32. codeList.forEach((item) => {
  33. if (compress.includes(item.k)) {
  34. if (compress.includes('clear')) {
  35. if (isArray(item.v)) {
  36. item.v.forEach((vItem) => {
  37. plugins.push(
  38. compressPlugin(Object.assign(vItem, { deleteOriginFile: true }))
  39. );
  40. });
  41. } else {
  42. plugins.push(compressPlugin(Object.assign(item.v, { deleteOriginFile: true })));
  43. }
  44. } else {
  45. if (isArray(item.v)) {
  46. item.v.forEach((vItem) => {
  47. plugins.push(compressPlugin(vItem));
  48. });
  49. } else {
  50. plugins.push(compressPlugin(item.v));
  51. }
  52. }
  53. }
  54. });
  55. return plugins;
  56. };