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>

Ficheros Node.js

Archivo/DirectorioFunción
package.jsonAdministra dependencias, scripts y metadatos del proyecto.
node_modules/Dependencias instaladas automáticamente por npm o yarn.

El archivo package.json es fundamental en cualquier proyecto Node.js. Contiene metadatos sobre el proyecto, como su nombre, versión, dependencias y scripts.

  • Dependencias: Aquí se listan todas las dependencias necesarias para el proyecto.
  • Scripts: Define comandos útiles para ejecutar tareas comunes, como iniciar el servidor de desarrollo o construir el proyecto para producción.

Este directorio contiene todas las dependencias de Node.js que tu proyecto necesita. No debes modificar manualmente nada en este directorio, ya que es gestionado automáticamente por npm o yarn.

Contiene todas las dependencias instaladas mediante npm install. No necesitamos modificar nada aquí directamente, ya que este directorio es gestionado automáticamente por npm y Vite.

Archivos de configuracion

ArchivoFunción
vite.config.jsConfiguración personalizada para Vite.
.gitignoreLista de archivos y carpetas que Git debe ignorar (no versionar).
.envVariables de entorno para configuración personalizada.
.eslintrc.jsConfiguración de ESLint para asegurar la calidad del código.

Dependiendo de si estás utilizando Vite o Vue CLI, encontrarás uno de estos archivos de configuración. Aquí puedes personalizar el comportamiento del servidor de desarrollo, la compilación y otras configuraciones específicas del proyecto.

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
plugins: [vue()],
server: {
port: 3000,
},
});

Este archivo especifica qué archivos y directorios deben ser ignorados por Git. Es útil para evitar subir archivos innecesarios o sensibles al repositorio.

node_modules/
dist/
.env

Estos archivos contienen variables de entorno que pueden ser utilizadas en tu aplicación. Por ejemplo, puedes definir la URL de una API o claves de autenticación.

VUE_APP_API_URL=https://api.example.com

Configuración de ESLint para mantener estándares de código:

module.exports = {
  root: true,
  env: {
    node: true
  },
  extends: [
    'plugin:vue/vue3-essential',
    'eslint:recommended'
  ],
  parserOptions: {
    ecmaVersion: 2020
  },
  rules: {
    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
  }
}

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