WCS
dengjunjie
2024-10-14 966d1fe6077c885db064fcea98bb48cbccb464d6
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
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import compressPlugin from 'vite-plugin-compression';
import commonjs from 'vite-plugin-commonjs';
import { resolve } from 'path';
 
export default defineConfig(config => ({
    base: '/',
    plugins: [
        // 配置需要使用的插件列表
        vue(),
        commonjs(),
        compressPlugin({
            ext: '.gz'
        })
    ],
    server: {
        host: '0.0.0.0',
        port: 8080,
        cors: true, //为开发服务器配置 CORS , 默认启用并允许任何源
        open: true, //服务启动时自动在浏览器中打开应用
        strictPort: false, //设为true时端口被占用则直接退出,不会尝试下一个可用端口
        // 反向代理配置
        proxy: {
            '/api': {
                proxy: 'https://dev.xxx.com/api/',
                changeOrigin: true,
                rewrite: path => path.replace(/^\/api/, '')
            }
        }
    },
    resolve: {
        //配置别名
        alias: {
            '@': resolve(__dirname, 'src'),
            '/images': 'src/assets/images'
        },
        extensions: ['.vue', '.js', '.json']
    },
    build: {
        // 指定输出路径
        outDir: 'dist',
        // 小于此阈值的导入或引用资源将内联为 base64 编码,以避免额外的 http 请求。设置为 0 可以完全禁用此项
        assetsInlineLimit: 4096, // 默认:4kb
        // chunk 大小警告的限制
        chunkSizeWarningLimit: 1500,
        //启用/禁用 CSS 代码拆分
        cssCodeSplit: true,
        //构建后是否生成 source map 文件
        sourcemap: false,
        //当设置为 true,构建后将会生成 manifest.json 文件
        manifest: false,
        // 设置为 false 可以禁用最小化混淆,或是用来指定使用哪种混淆器
        // boolean | 'terser' | 'esbuild'
        minify: 'terser', //terser 构建后文件体积更小
        //默认情况下,若 outDir 在 root 目录下,则 Vite 会在构建时清空该目录。
        emptyOutDir: true,
        //启用/禁用 brotli 压缩大小报告
        brotliSize: true,
        // 预加载
        modulePreload: {
            polyfill: true
        },
        rollupOptions: {
            // 打包之前是否先清空文件夹
            output: {
                chunkFileNames: 'js/[name]-[hash].js', // 自定义命名代码分割中产生的 chunk
                entryFileNames: 'js/[name]-[hash].js', // 指定 chunks 的入口文件模式
                assetFileNames: ({ name }) => {
                    // 自定义构建结果中的静态资源名称
                    const images = ['jpg', 'gif', 'png', 'webp'];
                    // 获取最后一个扩展名
                    const ext = [...name.split('.')].pop();
                    let floder = ext;
                    if (images.includes(ext)) {
                        floder = 'images';
                    }
                    return `${floder}/[name]-[hash].[ext]`;
                }, // 资源文件像 字体,图片等
                manualChunks(id) {
                    // 将node_modules的扩展单独进行打包
                    if (id.includes('node_modules')) {
                        return id.toString().split('node_modules/')[1].split('/')[0].toString();
                    }
                }
            }
        }
    },
    esbuild: {
        // 移除打包环境的console 和 debugger
        drop: config.mode === 'development' ? [] : ['debugger', 'console'],
        logOverride: {
            // 忽略未使用变量警告
            'assign-to-constant': 'silent',
            // 忽略return空警告
            'semicolon-after-return': 'silent'
        }
    }
}));