vite多环境合并打包config

vite.config.base.ts 默认base文件 配置

复制代码
import { resolve } from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import svgLoader from 'vite-svg-loader';
import configArcoStyleImportPlugin from './plugin/arcoStyleImport';
import { baseMap, publicDirMap, platformMap, entryMap } from './utils';

const client = process.env.CLIENT as string;

console.log('base', client);

export default defineConfig({
	base: baseMap[client],
	publicDir: publicDirMap[client],
	plugins: [
		vue(),
		vueJsx(),
		svgLoader({ svgoConfig: {} }),
		configArcoStyleImportPlugin(),
	],
	resolve: {
		alias: [
			{
				find: '@',
				replacement: resolve(__dirname, '../src'),
			},
			{
				find: 'assets',
				replacement: resolve(__dirname, '../src/assets'),
			},
			{
				find: 'vue',
				replacement: 'vue/dist/vue.esm-bundler.js', // compile template
			},
			{
				find: 'flatform',
				replacement: platformMap[client],
			},
			{
				find: 'entry',
				replacement: entryMap[client],
			},
		],
		extensions: ['.ts', '.js'],
	},
	define: {
		'process.env': process.env,
	},
	css: {
		preprocessorOptions: {
			less: {
				modifyVars: {
					hack: `true; @import (reference) "${resolve(
						'src/assets/style/reset.less',
					)}";`,
				},
				javascriptEnabled: true,
			},
		},
	},
});

其余开发环境变量配置文件

vite.config.dev.ts

import 复制代码
import eslint from 'vite-plugin-eslint';
import baseConfig from './vite.config.base';

export default mergeConfig(
	{
		mode: 'development',
		server: {
			open: true,
			port: 5075,
			fs: {
				strict: true,
			},
			proxy: {
				'/api': {
					target: 'https://pre.inifitness.com',
					changeOrigin: true,
				},
			},
		},

		plugins: [
			eslint({
				cache: false,
				include: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],
				exclude: ['node_modules'],
			}),
		],
	},
	baseConfig,
);

vite.config.pre.ts

复制代码
import { mergeConfig } from 'vite';
import baseConfig from './vite.config.base';
import configCompressPlugin from './plugin/compress';
import configVisualizerPlugin from './plugin/visualizer';
import configArcoResolverPlugin from './plugin/arcoResolver';
import configImageminPlugin from './plugin/imagemin';
import { outDirMap } from './utils';

const client = process.env.CLIENT as string;

export default mergeConfig(
	{
		mode: 'production',
		plugins: [
			configCompressPlugin('gzip'),
			configVisualizerPlugin(),
			configArcoResolverPlugin(),
			configImageminPlugin(),
		],
		build: {
			outDir: outDirMap[client],
			rollupOptions: {
				output: {
					manualChunks: {
						arco: ['@arco-design/web-vue'],
						vue: ['vue', 'vue-router', 'pinia', '@vueuse/core'],
						antd: ['ant-design-vue'],
					},
					assetFileNames: (assetInfo) => {
						if (assetInfo.name.endsWith('.css')) {
							return `static/css/[name].[hash].css`;
						}

						// NOTE: 先判断 ss_common再判断common
						// 自助机需要包含 ss_common 文件
						if (assetInfo.name.includes('ss_common')) {
							if (['user', 'coach'].includes(client)) {
								return 'static/img/ss_common/[name].[hash].[ext]';
							}
							return `noused/[name].[ext]`;
						}

						// 通用及组件库的图片
						if (
							assetInfo.name.includes('common') ||
							assetInfo.name.includes('ui')
						) {
							return 'static/img/ui/[name].[hash].[ext]';
						}

						if (assetInfo.name.includes(client)) {
							return 'static/img/[name].[hash].[ext]';
						}

						return `noused/[name].[ext]`;
					},
				},
			},
			chunkSizeWarningLimit: 2000,
			terserOptions: {
				compress: {
					drop_console: true,
					drop_debugger: true,
				},
			},
			minify: 'terser',
		},
	},
	baseConfig,
);

vite.config.prod.ts

复制代码
import { mergeConfig } from 'vite';
import baseConfig from './vite.config.base';
import configCompressPlugin from './plugin/compress';
import configVisualizerPlugin from './plugin/visualizer';
import configArcoResolverPlugin from './plugin/arcoResolver';
import configImageminPlugin from './plugin/imagemin';
import { outDirMap } from './utils';

const client = process.env.CLIENT as string;

export default mergeConfig(
	{
		mode: 'production',
		plugins: [
			configCompressPlugin('gzip'),
			configVisualizerPlugin(),
			configArcoResolverPlugin(),
			configImageminPlugin(),
		],
		build: {
			outDir: outDirMap[client],
			rollupOptions: {
				output: {
					manualChunks: {
						vue: ['vue', 'vue-router', 'pinia', '@vueuse/core'],
						arco: ['@arco-design/web-vue'],
						antd: ['ant-design-vue'],
					},
					assetFileNames: (assetInfo) => {
						if (assetInfo.name.endsWith('.css')) {
							return `static/css/[name].[hash].css`;
						}

						// NOTE: 先判断 ss_common再判断common
						// 自助机需要包含 ss_common 文件
						if (assetInfo.name.includes('ss_common')) {
							if (['user', 'coach'].includes(client)) {
								return 'static/img/ss_common/[name].[hash].[ext]';
							}
							return `noused/[name].[ext]`;
						}

						// 通用及组件库的图片
						if (
							assetInfo.name.includes('common') ||
							assetInfo.name.includes('ui')
						) {
							return 'static/img/ui/[name].[hash].[ext]';
						}

						if (assetInfo.name.includes(client)) {
							return 'static/img/[name].[hash].[ext]';
						}

						return `noused/[name].[ext]`;
					},
				},
			},
			chunkSizeWarningLimit: 2000,
			minify: 'terser',
			terserOptions: {
				compress: {
					drop_console: true,
					drop_debugger: true,
				},
			},
		},
	},
	baseConfig,
);

使用配置文件

复制代码
  "scripts": {
    "dev:user": "cross-env CLIENT=user vite --config ./config/vite.config.dev.ts --host",
    "dev:motion": "cross-env CLIENT=motion vite --config ./config/vite.config.dev.ts --host",
    "dev:coach": "cross-env CLIENT=coach vite --config ./config/vite.config.dev.ts --host",
    "debug:user": "cross-env CLIENT=user vite --config ./config/vite.config.dev.ts --host --mode debug",
    "debug:coach": "cross-env CLIENT=coach vite --config ./config/vite.config.dev.ts --host --mode debug",
    "pre:user": "cross-env CLIENT=user vite build --config ./config/vite.config.pre.ts --mode pre",
    "pre:motion": "cross-env CLIENT=motion vite build --config ./config/vite.config.pre.ts --mode pre",
    "pre:coach": "cross-env CLIENT=coach vite build --config ./config/vite.config.pre.ts --mode pre",
    "build:user": "cross-env CLIENT=user vite build --config ./config/vite.config.prod.ts && npx rimraf ./ss_user/noused",
    "build:coach": "cross-env CLIENT=coach vite build --config ./config/vite.config.prod.ts  && npx rimraf ./ss_coach/noused",
    "build:motion": "cross-env CLIENT=motion vite build --config ./config/vite.config.prod.ts && npx rimraf ./motion/noused",
    "report": "cross-env REPORT=true npm run build:user",
    "preview": "npm run build:user && vite preview --host",
    "type:check": "vue-tsc --noEmit --skipLibCheck",
    "lint-staged": "npx lint-staged && npm run type:check",
    "prepare": "husky"
  },
相关推荐
程序员大阳1 小时前
副队长JavaScript教程(57)-DOM事件机制
javascript·键盘事件·dom·鼠标·事件·绑定·冒泡
唔662 小时前
在透镜圆正中加了一个描边空心字
前端·javascript
定栓2 小时前
Vite-legacy产物console删除机制
前端·javascript·vue.js
程序员大阳9 小时前
副队长JavaScript教程(49)-主动抛出异常与错误类型
javascript·异常处理·error·throw·错误类型
hhhjhl10 小时前
Protobuf.js 跨端三方库仓颉适配全流程
javascript·网络·udp
康小汪10 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
Flynt13 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
slongzhang_14 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
北冥有鱼14 小时前
发版后动态路由点击报 `Failed to fetch dynamically imported module`」问题上的完整排查与修复过程
前端·vue.js