wangzhibo
2026-07-16 dca2b8e04123ed6bd9055433090511ba4cfc1bb3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { fileURLToPath, URL } from 'node:url';
import { ConfigEnv, UserConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import compression from 'vite-plugin-compression';
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite';
import vueDevTools from 'vite-plugin-vue-devtools';
import { visualizer } from 'rollup-plugin-visualizer';
import { proxy } from './src/config/proxy';
import { cool } from '@cool-vue/vite-plugin';
 
function toPath(dir: string) {
    return fileURLToPath(new URL(dir, import.meta.url));
}
 
// https://vitejs.dev/config
export default ({ mode }: ConfigEnv): UserConfig => {
    const isDev = mode === 'development';
 
    return {
        plugins: [
            vue(),
            compression(),
            vueJsx(),
            // vueDevTools(),
            cool({
                type: 'admin',
                proxy,
                eps: {
                    enable: true
                },
                svg: {
                    skipNames: ['base', 'theme']
                },
                demo: mode == 'demo' // 是否开启演示模式
            }),
            // visualizer({
            //     open: false,
            //     gzipSize: true,
            //     brotliSize: true
            // }),
            VueI18nPlugin({
                include: [toPath('./src/{modules,plugins}/**/locales/**')]
            })
        ],
        base: '/',
        server: {
            port: 9000,
            proxy,
            hmr: {
                overlay: true
            }
        },
        css: {
            preprocessorOptions: {
                scss: {
                    charset: false,
                    api: 'modern-compiler'
                }
            }
        },
        resolve: {
            alias: {
                '/@': toPath('./src'),
                '/$': toPath('./src/modules'),
                '/#': toPath('./src/plugins'),
                '/~': toPath('./packages')
            }
        },
        esbuild: {
            drop: isDev ? [] : ['console', 'debugger']
        },
        build: {
            minify: 'esbuild',
            // terserOptions: {
            //     compress: {
            //         drop_console: true,
            //         drop_debugger: true
            //     }
            // },
            sourcemap: isDev,
            rollupOptions: {
                output: {
                    chunkFileNames: 'static/js/[name]-[hash].js',
                    entryFileNames: 'static/js/[name]-[hash].js',
                    assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
                    manualChunks(id) {
                        if (id.includes('node_modules')) {
                            if (!['@cool-vue/crud'].find(e => id.includes(e))) {
                                if (id.includes('prettier')) {
                                    return;
                                }
 
                                return id
                                    .toString()
                                    .split('node_modules/')[1]
                                    .replace('.pnpm/', '')
                                    .split('/')[0];
                            } else {
                                return 'comm';
                            }
                        }
                    }
                }
            }
        }
    };
};