-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvite.config.mts
133 lines (132 loc) · 4.03 KB
/
vite.config.mts
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
import tsconfigPaths from 'vite-tsconfig-paths';
import svgrPlugin from 'vite-plugin-svgr';
import { visualizer } from 'rollup-plugin-visualizer';
import viteCompression from 'vite-plugin-compression';
import viteImagemin from 'vite-plugin-imagemin';
import importToCDN from 'vite-plugin-cdn-import';
import createExternal from 'vite-plugin-external';
// https://vitejs.dev/config/
// eslint-disable-next-line import/no-unused-modules
export default defineConfig({
envDir: './env',
resolve: {
// 配置别名
alias: {
'@': '/src', // @表示src目录
},
},
css: {
// 启用 CSS Modules
modules: {
localsConvention: 'camelCase', // 或者 'dashes' | 'camelCaseOnly'
},
},
plugins: [
react(),
tsconfigPaths(),
svgrPlugin(),
visualizer({
// 打包完成后自动打开浏览器,显示产物体积报告
open: false,
}),
importToCDN({
// enableInDevMode: true,
modules: ['react', 'react-dom', 'axios'],
}),
// createExternal({
// interop: 'auto', // 这个声明很重要
// externals: {
// react: 'React',
// 'react-dom': 'ReactDOM',
// 'react-router-dom': 'ReactRouterDOM',
// 'react-router': 'ReactRouter',
// },
// }),
viteImagemin({
gifsicle: {
// gif图片压缩
optimizationLevel: 3, // 选择1到3之间的优化级别
interlaced: false, // 隔行扫描gif进行渐进式渲染
// colors: 2 // 将每个输出GIF中不同颜色的数量减少到num或更少。数字必须介于2和256之间。
},
optipng: {
// png
optimizationLevel: 7, // 选择0到7之间的优化级别
},
mozjpeg: {
// jpeg
quality: 20, // 压缩质量,范围从0(最差)到100(最佳)。
},
pngquant: {
// png
quality: [0.8, 0.9], // Min和max是介于0(最差)到1(最佳)之间的数字,类似于JPEG。达到或超过最高质量所需的最少量的颜色。如果转换导致质量低于最低质量,图像将不会被保存。
speed: 4, // 压缩速度,1(强力)到11(最快)
},
svgo: {
// svg压缩
plugins: [
{
name: 'removeViewBox',
},
{
name: 'removeEmptyAttrs',
active: false,
},
],
},
}),
// viteCompression({
// algorithm: 'gzip',
// threshold: 10240,
// verbose: true, // 是否在控制台中输出压缩结果
// ext: '.gz',
// deleteOriginFile: true, // 源文件压缩后是否删除
// }),
],
server: {
proxy: {
'/api': {
target: 'https://api.book.bbdaxia.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
},
},
},
base: process.env.NODE_ENV === 'production' ? './' : '/',
esbuild: {
// drop: ['console', 'debugger'], // dev执行
},
build: {
sourcemap: false,
chunkSizeWarningLimit: 500, // 单位 kb
rollupOptions: {
output: {
chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称
entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称
assetFileNames: '[ext]/[name]-[hash].[ext]', // 资源文件像 字体,图片等
experimentalMinChunkSize: 10 * 1024, // 单位b 合并小chunk
manualChunks(id) {
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0].toString();
}
},
},
treeshake: {
preset: 'recommended',
manualPureFunctions: ['console.log'],
},
external: ['react', 'react-dom', 'axios'],
},
minify: 'terser', // 启用 terser 压缩
terserOptions: {
// 生产环境时移除console等
compress: {
pure_funcs: ['console.log'], // 只删除 console.log
drop_console: true, // 删除所有 console
drop_debugger: true,
},
},
},
});