Skip to content

安装

包管理器

bash
npm install @meng-xi/vite-plugin -D
bash
yarn add @meng-xi/vite-plugin -D
bash
pnpm add @meng-xi/vite-plugin -D

快速开始

使用内置插件

typescript
import { defineConfig } from 'vite'
import {
	assetManifest,
	buildProgress,
	bundleAnalyzer,
	compressAssets,
	copyFile,
	envGuard,
	faviconManager,
	generateRouter,
	generateVersion,
	htmlInject,
	imageOptimizer,
	loadingManager,
	proxyManager,
	versionUpdateChecker,
	autoImport
} from '@meng-xi/vite-plugin'

export default defineConfig({
	plugins: [
		// 资源清单生成
		assetManifest(),

		// 自动导入
		autoImport({
			imports: { vue: ['*'] },
			dts: 'src/auto-imports.d.ts',
			vueTemplate: true
		}),

		// 构建进度条
		buildProgress(),

		// 构建产物体积分析
		bundleAnalyzer({
			outputFormat: 'both',
			sizeThreshold: 200
		}),

		// 构建产物压缩
		compressAssets({
			algorithm: 'gzip',
			threshold: 1024,
			deleteOriginalFile: false
		}),

		// 复制文件
		copyFile({
			sourceDir: 'src/assets',
			targetDir: 'dist/assets'
		}),

		// 环境变量校验
		envGuard({
			required: {
				VITE_API_URL: { type: 'url', required: true }
			}
		}),

		// 生成路由配置(uni-app)
		generateRouter({
			pagesJsonPath: 'src/pages.json',
			outputPath: 'src/router.config.ts',
			dts: true
		}),

		// 生成版本号
		generateVersion({
			format: 'datetime',
			outputType: 'both'
		}),

		// 注入网站图标
		faviconManager({
			base: '/assets'
		}),

		// HTML 内容注入
		htmlInject({
			rules: [
				{
					id: 'meta-description',
					content: '<meta name="description" content="My App">',
					position: 'head-end'
				}
			]
		}),

		// 图片优化
		imageOptimizer({
			quality: 80,
			convert: { webp: { quality: 80 } }
		}),

		// 全局 Loading 状态管理
		loadingManager({
			defaultVisible: true,
			autoHideOn: 'DOMContentLoaded'
		}),

		// 开发代理管理
		proxyManager({
			rules: {
				'/api': { target: 'http://localhost:3000', changeOrigin: true }
			}
		}),

		// 版本更新检测
		versionUpdateChecker({
			checkInterval: 300000
		})
	]
})

子模块独立导入

每个插件都支持从子路径独立导入,可以获得更好的 Tree-shaking 效果:

typescript
import { buildProgress } from '@meng-xi/vite-plugin/plugins/build-progress'
import { bundleAnalyzer } from '@meng-xi/vite-plugin/plugins/bundle-analyzer'
import { compressAssets } from '@meng-xi/vite-plugin/plugins/compress-assets'
import { copyFile } from '@meng-xi/vite-plugin/plugins/copy-file'
import type { CompressAssetsOptions } from '@meng-xi/vite-plugin/plugins/compress-assets'

使用通用工具模块

typescript
import { formatFileSize, parseTemplate, formatDate, copySourceToTarget, scanDirectory, writeFileSyncSafely, escapeHtmlAttr } from '@meng-xi/vite-plugin'

// 文件大小格式化
formatFileSize(1024 * 1024) // '1.00MB'

// 模板变量替换
parseTemplate('Hello {{name}}!', { name: 'World' }) // 'Hello World!'

// 日期格式化
formatDate(new Date(), '{YYYY}-{MM}-{DD}') // '2026-06-06'

// 复制文件(支持增量复制)
const result = await copySourceToTarget('src/assets', 'dist/assets', {
	recursive: true,
	overwrite: true,
	incremental: true
})

// 扫描目录
const files = await scanDirectory('src', {
	includeExtensions: ['.ts', '.js'],
	excludePatterns: ['node_modules']
})

// 同步安全写入文件(自动创建目录)
writeFileSyncSafely('src/auto-imports.d.ts', 'declare global { ... }')

// HTML 属性值转义
escapeHtmlAttr('hello "world"') // 'hello &quot;world&quot;'

开发自定义插件

typescript
import { BasePlugin, createPluginFactory } from '@meng-xi/vite-plugin'
import type { BasePluginOptions } from '@meng-xi/vite-plugin/factory'
import type { Plugin } from 'vite'

interface MyPluginOptions extends BasePluginOptions {
	message: string
}

class MyPlugin extends BasePlugin<MyPluginOptions> {
	protected getDefaultOptions() {
		return { message: 'Hello' }
	}

	protected validateOptions(): void {
		this.validator.field('message').required().string().validate()
	}

	protected getPluginName(): string {
		return 'my-plugin'
	}

	protected addPluginHooks(plugin: Plugin): void {
		plugin.buildStart = () => {
			this.logger.info(this.options.message)
		}
	}
}

export const myPlugin = createPluginFactory(MyPlugin)

下一步

Released under the MIT License.