| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- import { isArray } from 'lodash-es';
- import compressPlugin from 'vite-plugin-compression';
- import type { Plugin } from 'vite';
- export const configCompressPlugin = (compress: BuildCompression): Plugin | Plugin[] | null => {
- if (compress === 'none') return null;
- // framework 模式下 Vite 分 client / ssr 两个环境构建;ssr:false 时 react-router 会删除 dist/server,
- // 压缩插件若在 server 环境的 closeBundle 阶段扫描已被删的目录会报 ENOENT。故只对 client 环境启用压缩
- //(server 产物本就不部署,无需压缩)。
- const onlyClient = (plugin: Plugin): Plugin => ({
- ...plugin,
- applyToEnvironment: (environment) => environment.name === 'client',
- });
- const gz = {
- // 生成的压缩包后缀
- ext: '.gz',
- // 体积大于threshold才会被压缩
- threshold: 0,
- // 默认压缩.js|mjs|json|css|html后缀文件,设置成true,压缩全部文件
- filter: () => true,
- // 压缩后是否删除原始文件
- deleteOriginFile: false,
- // 是否打印详细信息
- verbose: false,
- };
- const br = {
- ext: '.br',
- algorithm: 'brotliCompress',
- threshold: 0,
- filter: () => true,
- deleteOriginFile: false,
- verbose: false,
- };
- const codeList = [
- { k: 'gzip', v: gz },
- { k: 'brotli', v: br },
- { k: 'both', v: [gz, br] },
- ];
- const plugins: Plugin[] = [];
- codeList.forEach((item) => {
- if (compress.includes(item.k)) {
- if (compress.includes('clear')) {
- if (isArray(item.v)) {
- item.v.forEach((vItem) => {
- plugins.push(
- onlyClient(
- compressPlugin(Object.assign(vItem, { deleteOriginFile: true }))
- )
- );
- });
- } else {
- plugins.push(
- onlyClient(
- compressPlugin(Object.assign(item.v, { deleteOriginFile: true }))
- )
- );
- }
- } else {
- if (isArray(item.v)) {
- item.v.forEach((vItem) => {
- plugins.push(onlyClient(compressPlugin(vItem)));
- });
- } else {
- plugins.push(onlyClient(compressPlugin(item.v)));
- }
- }
- }
- });
- return plugins;
- };
|