import react from '@vitejs/plugin-react'; import browserslistToEsbuild from 'browserslist-to-esbuild'; import { defineConfig, mergeConfig, type UserConfig } from 'vite'; import viteCompression from 'vite-plugin-compression'; import svgr from 'vite-plugin-svgr'; import { defaultConfig, manualChunks } from '../../vite.shared.config'; const buildConfig = (mode: string): UserConfig => ({ server: { port: 5001, hmr: { port: 6001, }, }, css: { modules: { generateScopedName: // Keep backward compatibility with the old CSS modules naming in production mode === 'development' ? '__[hash:base64:5]__[local]' : '[hash:base64:5]_[local]', }, }, plugins: [ react(), svgr(), viteCompression({ disable: mode === 'development' }), viteCompression({ disable: mode === 'development', algorithm: 'brotliCompress' }), ], define: { 'import.meta.env.DEV_FEATURES_ENABLED': JSON.stringify(process.env.DEV_FEATURES_ENABLED), }, build: { // Use the same browserslist configuration as in README.md. // Consider using the esbuild target directly in the future. target: browserslistToEsbuild('> 0.5%, last 2 versions, Firefox ESR, not dead'), rollupOptions: { output: { // Tip: You can use `pnpx vite-bundle-visualizer` to analyze the bundle size manualChunks: (id, meta) => { if (/\/node_modules\/i18next[^/]*\//.test(id)) { return 'i18next'; } for (const largePackage of ['libphonenumber-js', 'core-js']) { if (id.includes(`/node_modules/${largePackage}/`)) { return largePackage; } } return manualChunks(id, meta); }, }, }, }, }); export default defineConfig(({ mode }) => mergeConfig(defaultConfig, buildConfig(mode)));