Unplugin Vue Router es un plugin para Vue.js que permite generar automáticamente el enrutamiento basado en la estructura de archivos (file-based routing).
El routing basado en ficheros es un patrón que automatiza la generación de rutas a partir de la estructura de directorios de tu proyecto.
Es decir, que la estructura de carpetas y archivos refleja directamente la navegación de tu aplicación. Esto elimina la necesidad de mantener archivos de configuración de rutas manualmente.
Es similar a la forma de trabajar de frameworks como Nuxt.js o Next.js, pero sin necesidad de usar un meta-framework.
Instalación y configuración básica
Para instalar Unplugin Vue Router en nuestro proyecto (que ya tenga instalado Vue Router) hacemos lo siguiente.
npm install unplugin-vue-router --save-dev
Ahora para configurarlo
Añadimos el plugin a la configuración de Vite en vite.config.ts
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import VueRouter from 'unplugin-vue-router/vite'
export default defineConfig({
plugins: [
VueRouter({
routesFolder: 'src/pages', // Carpeta de rutas
}),
Vue(), // ¡Importante: Vue() debe ir después!
],
})
Ahora inicializamos el plugin en main.ts
(o equivalente),
import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router/auto' // Auto-importa las rutas
const router = createRouter({
history: createWebHistory(),
// ¡Las rutas se generan automáticamente!
})
const app = createApp(App)
app.use(router)
app.mount('#app')
Unplugin Vue Router mantiene compatibilidad con Vue Router. No es un reemplazo, sino una extensión
Estructura de ficheros básica
Las rutas se generan automáticamente siguiendo convenciones sencillas. Por ejemplo,
src/
└── pages/
├── index.vue → /
├── contact.vue → /contact
└── about.vue → /about
En este caso
- La ruta / te llevaría al componente
index.vue
- La ruta /contact te llevaría al componente
contact.vue
- La ruta /about te llevaría al componente
about.vue
Así de fácil 😉.
Rutas anidadas
Crea subdirectorios para rutas anidadas. Cada subdirectorio dentro de /pages
crea un nuevo segmento en la ruta. Por ejemplo,
src/
└── pages/
├── welcome.vue → /welcome
└── dashboard/
├── settings.vue → /dashboard/settings
└── profile.vue → /dashboard/profile
En este caso,
- La ruta /welcome te llevará a
welcome.vue
- La ruta /dashboard/settings te llevará a
dashboard/settings.vue
- La ruta /dashboard/profile te llevará a
dashboard/profile.vue
El caso especial de index en rutas
Habrás visto que index
tiene un comportamiento algo especial. Este fichero representa la ruta base de su directorio. Con esta estructura:
src/
└── pages/
├── index.vue → /
└── dashboard/
└── index.vue → /dashboard
- La ruta / te llevará a
index.vue
- La ruta /dashboard te llevará a
dashboard/index.vue
Es un corportamiento muy habitual en enroutado, servidores de ficheros, etc.
Rutas dinámicas y parámetros
Para rutas dinámicas y parámetros, Unplugin Vue Router utiliza corchetes como placeholders para los parámetros,
[param].vue
→ Ruta dinámica (ej:/users/123
)
Es decir, que la siguiente estructura de carpetas
src/
└── pages/
└── users/
├── [id].vue → /users/:id
└── index.vue → /users
En este ejemplo, se generará automáticamente las rutas para el sistema de usuarios:
users/index.vue
→ Ruta/users
(lista de usuarios).users/[id].vue
→ Ruta dinámica/users/:id
(detalles de un usuario específico).
Puedes usar parámetros tanto en nombre de ficheros como en carpetas, y combinarlo en cualquier nivel de anidamiento para hacer las rutas que necesites.
Acceso a parámetros
Podemos acceder a los parámetros de igual forma que haríamos con el Vue Router habitualmente. Por ejemplo, para pages/users/[id].vue
<script setup lang="ts">
const route = useRoute('/users/[id]')
console.log(route.params.id) // Tipo inferido como string
</script>
Tipado seguro
El plugin genera tipos TypeScript para todas las rutas en typed-router.d.ts
, proporcionando autocompletado y validación.
router.push('/users/123') // Autocompletado y validación
const { id } = route.params // Tipo inferido: `id: string`
Rutas catch-all
Para rutas que deben capturar múltiples segmentos de URL, podemos usar la sintaxis [...slug].vue
,
[...slug].vue
→ Catch-all route
Es decir, que por ejemplo la estructura:
src/
└── pages/
└── docs/
└── [...slug].vue → /docs/*
El parámetro slug
será un array con todos los segmentos de la ruta.
- Po ejemplo,
/docs/a/b/c
capturará['a', 'b', 'c']
enparams.slug
Página not-found
Para manejar rutas no existentes, crea un archivo [...not-found].vue
en la raíz de pages/
. Este capturará cualquier ruta no definida y mostrará tu página 404 personalizada.
src/
└── pages/
└── [...not-found].vue
- Cualquier URL no definida (ej:
/ruta/inexistente
) mostrará este componente. - Los segmentos de la URL se almacenan en
route.params.notFound
como un array
Extender rutas manualmente
También podemos añadir rutas adicionales, en el caso de que necesitemos personalizar alguna de ellas. Para ello, podemos editar el fichero routes.ts
,
// src/routes.ts
import { extendRoutes } from 'unplugin-vue-router'
export default extendRoutes((routes) => {
routes.push({
path: '/custom',
component: () => import('./pages/custom.vue'),
meta: { requiresAuth: true }
})
})