-
Notifications
You must be signed in to change notification settings - Fork 0
/
vite.config.ts
159 lines (142 loc) · 3.5 KB
/
vite.config.ts
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/**
* vite.config.ts
* created by 2024/3/5
* @author Yiero
* @file vite配置文件
* */
import { defineConfig } from 'vite';
import { BuildConfigs } from './config/BuildConfigs';
import banner from 'vite-plugin-banner';
import {
info,
parseScriptInfoOptions,
scriptInfoStringify,
userConfigStringify,
warn,
} from './build';
import replace from '@rollup/plugin-replace';
import { resolve } from 'path';
import { UserConfigs } from './config/UserConfigs';
export default defineConfig( ( { mode } ) => {
/*
* 获取当前的构建环境
* */
const isProduction = mode === 'production';
/*
* 是否移除 console.log()
* */
const removeConsoleLog = isProduction && BuildConfigs.productionRemoveConsoleLog;
removeConsoleLog && warn( '[Terser] 清除所有 console.log() 日志已开启.' );
/*
* 是否开启代码热更新
* */
const openWatchConfig =
( BuildConfigs.devHotUpdate && !isProduction )
|| ( BuildConfigs.productionHotUpdate && isProduction );
openWatchConfig && warn( '[Watch] 代码热更新已开启.' );
/*
* 是否混淆代码
* */
const isMinifyCode =
( BuildConfigs.productionMinify && isProduction )
|| ( BuildConfigs.devMinify && !isProduction );
isMinifyCode && warn( '[Minify] 代码混淆已开启.' );
/*
* 是否加密代码
* */
const isTerserCode =
!isMinifyCode
&& BuildConfigs.productionTerser
&& isProduction;
isTerserCode && warn( '[Terser] 代码加密已开启.' );
/*
* 将脚本配置信息赋予默认信息,
* 并添加上额外配置值
* */
const scriptInfoOptions = parseScriptInfoOptions( isProduction );
// 提示打包信息
info( `[Info] 开始打包文件, 当前的构建环境是: ${ isProduction ? '生产环境' : '开发环境' }.` );
// 提示打包文件地址
info( `[Info] 文件将打包到: [file:///${
encodeURI(
resolve( 'dist', scriptInfoOptions.outputFileName as string )
.replace( /\\/g, '/' ),
)
}]` );
/*
* 返回vite配置对象
* */
return {
build: {
// 是否压缩混淆代码
minify: isMinifyCode
? true
: isTerserCode
? 'terser'
: false,
// 是否加密代码
terserOptions: isTerserCode
? {
compress: false,
mangle: false,
format: {
comments: false,
beautify: true,
ascii_only: true,
},
}
: void 0,
// 清空打包目录
emptyOutDir: false,
/* 是否在开发环境中热更新代码 */
watch: openWatchConfig
? {
include: [ 'src/**', 'config/**' ],
}
: null,
// rollup打包配置
rollupOptions: {
/*
* 项目 io 配置
* */
input: 'src/main.ts',
output: {
entryFileNames: scriptInfoOptions.outputFileName,
format: 'es',
manualChunks() {
// 把项目文件夹里面的文件都打包到一个文件中
return scriptInfoOptions.outputFileName;
},
},
/*
* 插件配置
* */
plugins: [
/*
* 添加顶部信息
* */
banner( {
content: () => {
const scriptInfo = scriptInfoStringify( scriptInfoOptions );
const userConfig = userConfigStringify( UserConfigs );
return `${ scriptInfo }\n\n${ userConfig }`;
},
// 关闭注释合法性校验
verify: false,
} ),
/*
* 自定义替换代码
* */
replace( {
preventAssignment: true,
values: removeConsoleLog ? {
// 生产环境移除log输出
'console.log': '(() => {})',
} : {},
delimiters: [ '', '' ],
} ),
],
},
},
};
} );