first
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
---
|
||||
title: Duplicate Vue Plugin Detection
|
||||
impact: MEDIUM
|
||||
impactDescription: fixes cryptic build errors from Vue plugin registered twice
|
||||
type: capability
|
||||
tags: vite, plugin, vue, duplicate, config, inline
|
||||
---
|
||||
|
||||
# Duplicate Vue Plugin Detection
|
||||
|
||||
**Impact: MEDIUM** - fixes cryptic build errors from Vue plugin registered twice
|
||||
|
||||
When using Vite's JavaScript API, if the Vue plugin is loaded in `vite.config.js` and specified again in `inlineConfig`, it gets registered twice, causing cryptic build errors.
|
||||
|
||||
## Symptoms
|
||||
|
||||
- Build produces unexpected output or fails silently
|
||||
- "Cannot read property of undefined" during build
|
||||
- Different build behavior between CLI and JavaScript API
|
||||
- Vue components render incorrectly after build
|
||||
|
||||
## Root Cause
|
||||
|
||||
Vite doesn't deduplicate plugins by name when merging configs. The Vue plugin's internal state gets corrupted when registered twice.
|
||||
|
||||
## Fix
|
||||
|
||||
**Option 1: Use configFile: false with inline plugins**
|
||||
```typescript
|
||||
import { build } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
|
||||
await build({
|
||||
configFile: false, // Don't load vite.config.js
|
||||
plugins: [vue()],
|
||||
// ... rest of config
|
||||
})
|
||||
```
|
||||
|
||||
**Option 2: Don't specify plugins in inlineConfig**
|
||||
```typescript
|
||||
// vite.config.js already has vue plugin
|
||||
import { build } from 'vite'
|
||||
|
||||
await build({
|
||||
// Don't add vue plugin here - it's in vite.config.js
|
||||
root: './src',
|
||||
build: { outDir: '../dist' }
|
||||
})
|
||||
```
|
||||
|
||||
**Option 3: Filter out Vue plugin before merging**
|
||||
```typescript
|
||||
import { build, loadConfigFromFile } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
|
||||
const { config } = await loadConfigFromFile({ command: 'build', mode: 'production' })
|
||||
|
||||
// Remove existing Vue plugin
|
||||
const filteredPlugins = config.plugins?.filter(
|
||||
p => !p || (Array.isArray(p) ? false : p.name !== 'vite:vue')
|
||||
) || []
|
||||
|
||||
await build({
|
||||
...config,
|
||||
plugins: [...filteredPlugins, vue({ /* your options */ })]
|
||||
})
|
||||
```
|
||||
|
||||
## Detection Script
|
||||
|
||||
Add this to debug plugin registration:
|
||||
```typescript
|
||||
// vite.config.ts
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
vue(),
|
||||
{
|
||||
name: 'debug-plugins',
|
||||
configResolved(config) {
|
||||
const vuePlugins = config.plugins.filter(p => p.name?.includes('vue'))
|
||||
if (vuePlugins.length > 1) {
|
||||
console.warn('WARNING: Multiple Vue plugins detected:', vuePlugins.map(p => p.name))
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
## Common Scenarios
|
||||
|
||||
| Scenario | Solution |
|
||||
|----------|----------|
|
||||
| Using `vite.createServer()` | Use `configFile: false` |
|
||||
| Build script with custom config | Don't duplicate plugins |
|
||||
| Monorepo with shared config | Check for plugin inheritance |
|
||||
|
||||
## Reference
|
||||
|
||||
- [Vite Issue #5335](https://github.com/vitejs/vite/issues/5335)
|
||||
- [Vite JavaScript API](https://vite.dev/guide/api-javascript.html)
|
||||
Reference in New Issue
Block a user