100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import { resolve } from 'node:path'
 | |
| import type { ConfigEnv, UserConfig } from 'vite'
 | |
| import dayjs from 'dayjs'
 | |
| import { loadEnv } from 'vite'
 | |
| import pkg from './package.json'
 | |
| import { generateModifyVars } from './build/generate/generateModifyVars'
 | |
| import { createProxy } from './build/vite/proxy'
 | |
| import { wrapperEnv } from './build/utils'
 | |
| import { createVitePlugins } from './build/vite/plugin'
 | |
| import { OUTPUT_DIR } from './build/constant'
 | |
| import { exclude, include } from './build/vite/optimize'
 | |
| 
 | |
| function pathResolve(dir: string) {
 | |
|   return resolve(process.cwd(), '.', dir)
 | |
| }
 | |
| 
 | |
| const { dependencies, devDependencies, name, version } = pkg
 | |
| const __APP_INFO__ = {
 | |
|   pkg: { dependencies, devDependencies, name, version },
 | |
|   lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
 | |
| }
 | |
| 
 | |
| export default ({ command, mode }: ConfigEnv): UserConfig => {
 | |
|   const root = process.cwd()
 | |
| 
 | |
|   const env = loadEnv(mode, root)
 | |
| 
 | |
|   // The boolean type read by loadEnv is a string. This function can be converted to boolean type
 | |
|   const viteEnv = wrapperEnv(env)
 | |
| 
 | |
|   const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv
 | |
| 
 | |
|   const isBuild = command === 'build'
 | |
| 
 | |
|   return {
 | |
|     base: VITE_PUBLIC_PATH,
 | |
|     root,
 | |
|     server: {
 | |
|       https: false,
 | |
|       // Listening on all local IPs
 | |
|       host: true,
 | |
|       port: VITE_PORT,
 | |
|       // Load proxy configuration from .env
 | |
|       proxy: createProxy(VITE_PROXY),
 | |
|     },
 | |
|     resolve: {
 | |
|       alias: [
 | |
|         {
 | |
|           find: 'vue-i18n',
 | |
|           replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
 | |
|         },
 | |
|         // @/xxxx => src/xxxx
 | |
|         {
 | |
|           find: /\@\//,
 | |
|           replacement: `${pathResolve('src')}/`,
 | |
|         },
 | |
|       ],
 | |
|     },
 | |
|     esbuild: {
 | |
|       drop: VITE_DROP_CONSOLE ? ['console', 'debugger'] : [],
 | |
|     },
 | |
|     build: {
 | |
|       target: 'esnext',
 | |
|       cssTarget: 'chrome80',
 | |
|       outDir: OUTPUT_DIR,
 | |
|       // minify: 'terser',
 | |
|       /**
 | |
|        * 当 minify=“minify:'terser'” 解开注释
 | |
|        * Uncomment when minify="minify:'terser'"
 | |
|        */
 | |
|       // terserOptions: {
 | |
|       //   compress: {
 | |
|       //     keep_infinity: true,
 | |
|       //     drop_console: VITE_DROP_CONSOLE,
 | |
|       //   },
 | |
|       // },
 | |
|       // Turning off brotliSize display can slightly reduce packaging time
 | |
|       reportCompressedSize: false,
 | |
|       chunkSizeWarningLimit: 2000,
 | |
|     },
 | |
|     define: {
 | |
|       __APP_INFO__: JSON.stringify(__APP_INFO__),
 | |
|     },
 | |
| 
 | |
|     css: {
 | |
|       preprocessorOptions: {
 | |
|         less: {
 | |
|           modifyVars: generateModifyVars(),
 | |
|           javascriptEnabled: true,
 | |
|         },
 | |
|       },
 | |
|     },
 | |
| 
 | |
|     // The vite plugin used by the project. The quantity is large, so it is separately extracted and managed
 | |
|     plugins: createVitePlugins(viteEnv, isBuild),
 | |
| 
 | |
|     optimizeDeps: { include, exclude },
 | |
|   }
 | |
| }
 |