100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
import type { UserConfig, ConfigEnv } from 'vite'
 | 
						|
import pkg from './package.json'
 | 
						|
import dayjs from 'dayjs'
 | 
						|
import { loadEnv } from 'vite'
 | 
						|
import { resolve } from 'path'
 | 
						|
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 { include, exclude } 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 async ({ command, mode }: ConfigEnv): Promise<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: await createVitePlugins(viteEnv, isBuild),
 | 
						|
 | 
						|
    optimizeDeps: { include, exclude }
 | 
						|
  }
 | 
						|
}
 |