Auto cargar componentes con Vite

Auto cargar componentes globales en Vue 3 nunca ha sido más sencillo, gracias a una de las características de Vite llamada Glob Import


Es muy sencillo auto importar componentes en Vue 3. Si se trata de uno o dos componentes, el proceso se puede realizar “a mano”.

JS
import {createApp} from 'vue';
import GlobalComponent from './GlobalComponent.vue';

const app = createApp({})
app.component('GlobalComponent', GlobalComponent);

    

Pero, ¿qué ocurre si queremos autoimportar un directorio entero?. Por ejemplo /components. Es aquí donde Vite y su Glob import vienen en nuestra ayuda. Vamos allá ⚡️

Componentes globales con Vite Glob import

Primero, podemos usar Glob import para seleccionar tos los archivos con extensión .vue.

JS
const components = import.meta.globEager('./components/*.vue');

    

Esto resulta en un objeto con esta estructura:

JS
{
    './components/AppComponent.vue'
:
    Module,
        './components/HelloWorld.vue'
:
    Module
}
}

    

Como puedes ver como propiedad tenemos la ruta al componente y como valor, el propio módulo del componente en sí.

Ahora, podemos convertir components en Array con Object.entries y cargarlos con el método component de la recién creada instancia Vue.

JS
Object.entries(components).forEach(([path, component]) => {
    myApp.component(
        path
            .split('/')
            .pop()
            .replace(/\.\w+$/, ''),
        component.default
    );
});

    

Fíjate que por el camino tenemos que hacer varias operaciones:

  • Romper el path en diferentes segmentos, separados por / con el método split de Array.
  • Quedarnos con el último segmento utilizando el método pop de Array.
  • Eliminar la extensión del segmento empleando el método replace de las strings y una expresión regular.

Con todo ello ya tenemos la posibilidad de auto cargar componentes globales en Vue 3 con Vite.

Así queda todo:

JS
import {createApp} from 'vue';
import './style.css';
import App from './App.vue';

const components = import.meta.globEager('./components/*.vue');

const myApp = createApp(App);

Object.entries(components).forEach(([path, component]) => {
    myApp.component(
        path
            .split('/')
            .pop()
            .replace(/\.\w+$/, ''),
        component.default
    );
});

myApp.mount('#app');

    

Demo

Juan Andrés Núñez
Juan Andrés Núñez
Ingeniero Frontend Senior. Especialista en Vue.js. Speaker. Docente profesional. Estoico.