enrutado-ficheros-con-unplugin-vue-router

Routing basado en ficheros con Unplugin Vue Router en Vue

  • 4 min

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'] en params.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 }  
  })  
})