Por: Ernesto Canquiz
Anidamiento
En este apartado exploraremos una técnica estructural de anidamiento de carpetas de componentes y componibles.
Cuando el componente Foo.vue empieza a crecer
Supongamos que necesitamos refactorizar la vista Foo.vue porque el código fuente está empezando a crecer.
Crearemos un componente hijo que llamaremos
Children.vuepara desacoplar parte del código. Dicho componente no es reutilizable, ya que solo es de utilidad para el componente padreFoo.vue.
Igualmente, como buena práctica, creamos el componible useFoo.ts para separar la regla de negocio de la interfaz gráfica.
└──src/
├──router/
└──views/
├──Foo/
│ ├──Children.vue
│ ├──Index.vue
│ └──useFoo.ts
├──Bar.vue
└──Baz.vueTanto el componente Children.vue como el composable useFoo.ts pertenecen únicamente a la carpeta ./src/views/Foo/, por lo que no tiene sentido separarlos en carpetas distintas.
TIP
Tenga en cuenta que desde ahora ./src/views/Foo.vue será llamado ./src/views/Foo/Index.vue. Por lo tanto, este cambio debe ser actualizado en el archivo ./src/router/index.ts.
Foo/Index.vue continúa aumentando
Ahora, el componente padre necesita más componentes y componibles hijos. Estos solo son utiles para .src/views/Foo/Index.vue.
└──src/
├──router/
└──views/
├──Foo/
│ ├──Children.vue
│ ├──ChildrenAnother.vue
│ ├──ChildrenAnotherOne.vue
│ ├──Index.vue
│ ├──useFoo.ts
│ ├──useFooAnother.ts
│ └──useFooAnotherOne.ts
├──Bar.vue
└──Baz.vueEntonces, ¿qué le parece si a continuación organizamos un poco más la estructura?
└──src/
├──router/
└──views/
├──Foo/
│ ├──components/
│ │ ├──Children.vue
│ │ ├──ChildrenAnother.vue
│ │ └──ChildrenAnotherOne.vue
│ ├──composables/
│ │ ├──useFoo.ts
│ │ ├──useFooAnother.ts
│ │ └──useFooAnotherOne.ts
│ └──Index.vue
├──Bar.vue
└──Baz.vueAsí lucirá desde afuera.
└──src/
├──router/
└──views/
├──Foo/
│ ├──components/
│ ├──composables/
│ └──index.vue
├──Bar.vue
└──Baz.vue¡Genial! Ahora tenemos una estructura más organizada.
└──src/
├──router/
└──views/
├──Foo/
├──Bar.vue
└──Baz.vueEstructura Clásica
La estructura clásica de un proyecto Vue.js es la siguiente:
└──src/
├──components/
├──composables/
├──router/
└──views/Pero, ¿qué sentido le daremos ahora a las archiconocidas carpetas
./src/componentsy./src/composables?
Código Reutilizable Globalmente
En las carpetas ./src/components y ./src/composables colocaremos, respectivamente, solo los componentes y componibles que pueden ser reutilizados por cualquiera de las vistas.
└──src/
├──components/
│ ├──GlobalReusable/
│ │ ├──Children.vue
│ │ ├──ChildrenOther.vue
│ │ └──Index.vue
│ └──GlobalReusableOther.vue
├──composables/
│ ├──useGlobalReusable.ts
│ └──useGlobalReusableOther.ts
├──router/
└──views/Tenga en cuenta que el componente principal
./src/components/GlobalReusable/Index.vueposee dos componentes secundarios:
./src/components/GlobalReusable/Children.vue./src/components/GlobalReusable/ChildrenOther.vue
Estos dos componentes hijos solo tendrán sentido dentro de su componente padre.
Un Paso Más Allá
Ahora que hemos llegado aquí, usted se preguntará:
¿Cómo quedará todo esto con la estructura modular?.
Echemos un vistazo a la siguiente estructura:
└──src/
├──core/
│ ├──components/
│ │ ├──GlobalReusable/
│ │ └──GlobalReusableOther.vue
│ ├──composables/
│ │ ├──useGlobalReusable.ts
│ │ └──useGlobalReusableOther.ts
│ └──router/
└──modules/
├──ModuleA
├──ModuleB
│ ├──components/
│ │ ├──OnlyReusableByModuleB/
│ │ │ ├──Children.vue
│ │ │ └──Index.vue
│ │ └──OnlyReusableByModuleBOther.vue
│ ├──composables/
│ │ ├──useOnlyReusableByModuleB.ts
│ │ └──useOnlyReusableByModuleBOther.ts
│ ├──routes/
│ └──views/
│ ├──Foo/
│ ├──Bar.vue
│ └──Baz.vue
└──ModuleCEste enfoque modular y anidado proporciona una base sólida para el desarrollo de aplicaciones Vue.
Al mantener los componentes y componibles secundarios dentro de sus respectivos componentes y componibles principales, se establece una exclusividad clara y se fomenta la reutilización de aquellos que son globales.
