compress.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import { gzip } from 'zlib';
  2. import { readFileSync, writeFileSync } from 'fs';
  3. import { GzipPluginOptions } from './types';
  4. import viteConfig from '../../../vite.config';
  5. import { readAllFile, getCwdPath, isBuildGzip, isSiteMode } from '../../utils';
  6. export function startGzip(
  7. fileContent: string | Buffer,
  8. options: GzipPluginOptions = {}
  9. ): Promise<Buffer> {
  10. return new Promise((resolve, reject) => {
  11. gzip(fileContent, options.gzipOptions || {}, (err, result) => {
  12. if (err) {
  13. reject(err);
  14. } else {
  15. resolve(result);
  16. }
  17. });
  18. });
  19. }
  20. // 手动压缩css
  21. export async function startGzipStyle() {
  22. if (isBuildGzip() || isSiteMode()) {
  23. const outDir = viteConfig.outDir || 'dist';
  24. const assets = viteConfig.assetsDir || '_assets';
  25. const allCssFile = readAllFile(getCwdPath(outDir, assets), /\.(css)$/);
  26. for (const path of allCssFile) {
  27. const source = readFileSync(path);
  28. const content = await startGzip(source);
  29. const ds = path.split('/');
  30. const fileName = ds[ds.length - 1];
  31. writeFileSync(getCwdPath(outDir, assets, `${fileName}.gz`), content);
  32. }
  33. }
  34. }