estructura-app-vue

Estructura de un proyecto de Vue.js

  • 6 min

Una vez que hemos visto cómo crear nuestro aplicación de Vue, veremos que el proyecto que hemos creado tiene una estructura con carpetas y ficheros (de hecho, con muchas).

En realidad, no todos los proyectos son exactamente iguales. Al final, la estructura depende de tu aplicación, de los elementos que uses… de muchas cosas.

Pero, más o menos, un proyecto de Vue.js “habitual” podría tener una estructura similar a esta,

📂 mi-app/
├── 📂 node_modules/
├── 📂 public/
├── 📂 src/
│   ├── 📂 assets/
│   ├── 📂 components/
│   ├── 📂 views/
│   ├── 📂 router/
│   ├── 📂 stores/
│   ├── 📂 services/
│   ├── 📂 utils/
│   ├── 📄 App.vue
│   └── 📄 main.js
├── 📄 .eslintrc.js
├── 📄 .gitignore
├── 📄 index.html
├── 📄 package.json
└── 📄 vite.config.js

Como he dicho, no es una única estructura inamovible. La organización dependerá de tu proyecto, e incluso de tus gustos. Tienes margen para la estructura.

Pero muchos de los elementos son comunes y frecuentes en los proyectos de Vue. Necesitas, al menos, saber qué es cada cosa.

Así que vamos a repasar algunos de ellos, porque al principio puede ser un poco abrumador ver tanto fichero y tanta carpeta.

Archivos en la raíz del proyecto

Index.html

Punto de entrada HTML de la aplicación:

Archivo/DirectorioFunción
index.htmlPlantilla HTML principal; Vue se monta dentro de este archivo.
<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mi Aplicación Vue</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

Directorio /src

Este es el corazón del proyecto donde reside todo el código fuente:

ArchivoFunción
src/Contiene todo el código fuente de la aplicación.
src/main.js o main.tsPunto de entrada principal de la aplicación; monta la app en el DOM.
src/App.vueComponente raíz de la aplicación.

Punto de entrada de la aplicación. Aquí se monta Vue y se configura la aplicación.

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

import './assets/main.css'

const app = createApp(App)

app.use(router)

app.mount('#app')

El componente raíz de la aplicación:

<script setup>
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'
</script>

<template>
  <header>
    <img alt="Vue logo" src="./assets/logo.svg" width="125" height="125" />
    <div class="wrapper">
      <HelloWorld msg="¡Bienvenido a tu aplicación Vue 3!" />
      <nav>
        <RouterLink to="/">Inicio</RouterLink>
        <RouterLink to="/about">Acerca de</RouterLink>
      </nav>
    </div>
  </header>

  <RouterView />
</template>

<style scoped>
header {
  line-height: 1.5;
  max-height: 100vh;
}

/* Más estilos... */
</style>

Subdirectorios de src

DirectorioFunción
src/assets/Recursos como imágenes, estilos y fuentes, procesados por Vite.
src/components/Componentes reutilizables de la UI.
src/views/Vistas principales asociadas a rutas.
src/router/Configuración del sistema de rutas con Vue Router.
src/stores/Gestión del estado global (Pinia).
src/services/Módulos para acceder a APIs o lógica externa.
src/composables/Funciones reusables con Composition API.
src/utils/Funciones de utilidad generales, como validaciones o formateos.

Este directorio contiene recursos estáticos como imágenes, fuentes y estilos globales. A diferencia de los archivos en public/, los archivos en assets/ son procesados por el sistema de compilación de Vue.

import '@/assets/global.css';

Este directorio almacena recursos estáticos que serán procesados por Vite. Por ejemplo,

assets/
├── logo.svg
└── main.css

Este directorio almacena los componentes reutilizables de Vue. Los componentes en Vue son piezas independientes de interfaz que podemos combinar para construir la estructura de la aplicación.

Cada componente Vue tiene su propio archivo .vue, que incluye el template, script y estilos.

Los componentes se deben nombrar usando el formato PascalCase (HelloWorld.vue) o kebab-case (hello-world.vue) para seguir las convenciones de Vue. Por ejemplo,

components/
├── HelloWorld.vue
├── TheHeader.vue
├── TheFooter.vue
└── ui/
    ├── BaseButton.vue
    └── BaseInput.vue

Aquí almacenamos las vistas principales de la aplicación, que suelen estar asociadas a rutas específicas de Vue Router. Por ejemplo,

views/
├── HomeView.vue
└── AboutView.vue

Aquí configuramos Vue Router para gestionar la navegación en nuestra aplicación. Por ejemplo,

router/
└── index.js

Para gestión de estado con Pinia (si la usamos claro). Por ejemplo,

stores/
└── counter.js

Para APIs y servicios externos. Por ejemplo,

services/
├── api.js
└── authService.js

Los composables son funciones reutilizables que encapsulan lógica compartida. Por ejemplo,

utils/
├── useFilterTable.js
└── useValidateNumber.js

Para funciones de utilidad. Por ejemplo,

utils/
├── formatter.js
└── validation.js

Recordad que son ejemplos de carpetas que encontraréis habitualmente. No significa que tenéis que tener todas por obligación.

Carpeta public

El directorio public/ contiene archivos estáticos que se sirven directamente sin pasar por el proceso de compilación de Vue.

Aquí puedes colocar archivos como index.html, imágenes, fuentes, o cualquier otro recurso estático.

public/
├── favicon.ico
└── robots.txt

Ejemplo: Si añadimos una imagen logo.png en public/, podremos acceder a ella desde:

http://localhost:5173/logo.png

¿Qué diferencia hay entre assets y pubic?

  • Los archivos en src/assets/ son procesados por el bundle (pueden ser importados mediante módulos y optimizados, etc)
  • Los archivos en public/ se copian sin modificaciones a la raíz del servidor cuando construimos la aplicación