---
name: vue3-fsd-development
description: Desenvolve aplicações Vue 3 seguindo arquitetura Feature-Sliced Design (FSD), implementando lazy loading, code splitting, e padrões de performance. Use quando desenvolvendo features, componentes, ou trabalhando com Vue 3 neste projeto.
---
# Vue 3 FSD Development
Guidelines para desenvolvimento Vue 3 seguindo arquitetura Feature-Sliced Design (FSD) adaptada.
## Princípios Fundamentais
1. **Separação de Responsabilidades**: Cada camada tem responsabilidade única e bem definida
2. **Isolamento de Features**: Features são auto-contidas e independentes
3. **Reutilização Inteligente**: Widgets e shared para código reutilizável
4. **Performance First**: Lazy loading e code splitting por padrão
5. **Type Safety**: TypeScript em todos os arquivos
## Arquitetura FSD
Estrutura de camadas (ordem de dependência):
```
app/ → pages/ → features/ → widgets/ → shared/
```
**Regras de dependência:**
- `app/` não depende de nenhuma camada
- `pages/` pode importar de `features/`, `widgets/`, `shared/`
- `features/` pode importar de `widgets/`, `shared/`
- `widgets/` pode importar de `shared/`
- `shared/` não depende de outras camadas
**NUNCA:**
- ❌ Features importando de `pages/`
- ❌ Widgets importando de `features/` ou `pages/`
- ❌ Shared importando de qualquer outra camada
Para detalhes completos, veja [architecture.md](architecture.md).
## Estrutura de Features
Cada feature segue esta estrutura:
```
features/[feature-name]/
├── index.vue # Componente principal
├── model/ # Lógica de negócio
│ ├── [feature]Schema.ts # Schema Zod
│ └── use[Feature].ts # Composable
├── ui/ # Componentes UI específicos
│ └── [component]/
│ ├── index.vue
│ └── __tests__/
└── store/ # Store Pinia (se necessário)
```
**Diretrizes:**
- Uma feature = um domínio de negócio
- Lógica sempre em `model/`
- UI específica em `ui/`
- Testes junto ao código em `__tests__/`
## Lazy Loading Obrigatório
**Rotas**: Sempre usar dynamic imports:
```typescript
component: () => import('@/pages/users/UsersView.vue')
```
**Features pesadas**: Lazy load quando possível:
```vue
```
**Mocks condicionais**: Lazy load de MSW:
```typescript
if (import.meta.env.VITE_ENABLE_MOCK_SERVER === 'true') {
const { worker } = await import('../shared/mocks/browser.ts')
worker.start()
}
```
Para otimizações avançadas, veja [performance.md](performance.md).
## Padrões de Código
### Composables com Vue Query
```typescript
import { useMutation } from '@tanstack/vue-query'
import { toast } from 'vue-sonner'
import { postLogin as postLoginService } from '@/shared/api/auth-api/postLogin'
import type { Payload } from '@/shared/api/auth-api/types/postLogin.types'
const postLogin = () => {
const { isPending, isError, error, isSuccess, mutate } = useMutation({
mutationFn: (payload: Payload) =>
postLoginService(payload).catch((error) =>
toast.error(error?.response?.data?.message || 'Erro desconhecido.'),
),
})
return { isPending, isError, error, isSuccess, mutate }
}
export function useLogin() {
return { postLogin }
}
```
### APIs
```typescript
import { axiosClient } from '../config/http-client'
import type { Payload, Response } from './types/postLogin.types'
export async function postLogin(payload: Payload): Promise {
const response = await axiosClient.request({
endpoint: 'login',
method: 'POST',
body: payload,
})
return response.data
}
```
### Validação Zod
```typescript
import { z } from 'zod'
const loginSchema = z.object({
email: z.string().email('Email inválido'),
password: z.string().min(6, 'Senha deve ter no mínimo 6 caracteres'),
})
export type LoginFormData = z.infer
```
Para mais padrões, veja [patterns.md](patterns.md).
## Boas Práticas
### ✅ FAZER
- Usar Composition API com `