jueves, 17 de julio de 2025

Estructura de la Carpeta Resources en Laravel, Inertia, React y shadcn/ui

 ¿De qué consta lo que va dentro de la carpeta resources que corresponde a la parte visual de una aplicación con Laravel, Inertia, React y shadcn/ui? ¿Qué partes lo componen, cuál es su estructura?


En una aplicación Laravel que utiliza Inertia.js con React como frontend y shadcn/ui para los componentes, la carpeta resources es el corazón de tu parte visual (frontend). Aquí es donde resides todo el código JavaScript, CSS y otros activos que se compilan para el navegador.

La estructura típica y sus componentes principales son los siguientes:

resources

La carpeta resources contiene los activos sin compilar de tu aplicación, como archivos Blade, archivos de idioma y tus activos de frontend (JavaScript, CSS, imágenes, etc.).

  • resources/css:

    • app.css: Este es el archivo principal de tu CSS. En una configuración con Tailwind CSS, aquí es donde importarías las directivas de Tailwind (@tailwind base;, @tailwind components;, @tailwind utilities;) y cualquier CSS personalizado global.

      /* resources/css/app.css */
      @tailwind base;
      @tailwind components;
      @tailwind utilities;
      
      /* Tu CSS personalizado aquí (si lo necesitas) */
      
  • resources/js: Este es el directorio más importante para tu aplicación React/Inertia.

    • app.js: El punto de entrada principal de tu aplicación JavaScript. Aquí es donde se inicializa Inertia y se monta tu aplicación React. También es donde se importan los layouts y componentes de nivel superior.

      // resources/js/app.js
      import './bootstrap'; // Para Axios, etc.
      import '../css/app.css'; // Importa tu CSS de Tailwind
      
      import { createInertiaApp } from '@inertiajs/react';
      import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers';
      import { createRoot } from 'react-dom/client';
      
      createInertiaApp({
          // Resuelve los componentes de página React
          resolve: (name) => resolvePageComponent(`./Pages/${name}.jsx`, import.meta.glob('./Pages/**/*.jsx')),
          setup({ el, App, props }) {
              const root = createRoot(el);
              root.render(<App {...props} />);
          },
          progress: {
              color: '#4B5563', // Color de la barra de progreso de Inertia
          },
      });
      
    • bootstrap.js: Configuración inicial de JavaScript, como la configuración de Axios para realizar solicitudes HTTP.

    • Layouts:

      • AuthenticatedLayout.jsx: Un componente React que define el diseño general (header, sidebar, footer) para las páginas que requieren autenticación. Las páginas de Inertia suelen envolver su contenido en uno de estos layouts.

      • GuestLayout.jsx: Similar al anterior, pero para páginas públicas (login, registro, etc.).

    • Pages: Este directorio contiene tus componentes de página principales de React. Cada archivo aquí (o en sus subdirectorios) corresponde a una "página" que Inertia puede cargar.

      • Dashboard.jsx: Un ejemplo de componente de página.

      • Profile/Edit.jsx: Un componente de página anidado.

      • Auth/Login.jsx: Componentes de autenticación.

      • Admin/Users/Index.jsx: Ejemplo de una sección de administración.

    • Components: Este directorio contiene componentes React reutilizables que no son páginas completas. Aquí es donde brillan los componentes de shadcn/ui y tus propios componentes basados en ellos.

      • ui: Esta subcarpeta es crucial para shadcn/ui. Contiene los componentes que has "shadcn-izado" (copiado y adaptado a tu proyecto). Por ejemplo:

        • button.jsx (el componente Button de shadcn)

        • card.jsx (el componente Card de shadcn)

        • input.jsx (el componente Input de shadcn)

        • dialog.jsx (el componente Dialog de shadcn)

        • table.jsx (el componente Table de shadcn)

        • ...y muchos más, cada uno con sus estilos de Tailwind y lógica React.

      • ApplicationLogo.jsx: Tu propio componente para el logo de la aplicación.

      • Dropdown.jsx: Un componente de menú desplegable.

      • NavLink.jsx: Componentes para enlaces de navegación.

      • TextInput.jsx: Un wrapper para el input de shadcn/ui con manejo de errores de Inertia.

      • ThemeToggle.jsx: Un componente para cambiar entre tema claro/oscuro.

  • resources/views:

    • app.blade.php: Este es el archivo Blade principal que sirve como la "plantilla" base para tu aplicación Inertia. Contiene el div con el id="app" donde se montará tu aplicación React. También incluye los scripts de Vite para la compilación de activos.

      <!-- resources/views/app.blade.php -->
      <!DOCTYPE html>
      <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
          <head>
              <meta charset="utf-8">
              <meta name="viewport" content="width=device-width, initial-scale=1">
              <title inertia>{{ config('app.name', 'Laravel') }}</title>
              <!-- Scripts de Vite para cargar tu JS y CSS -->
              @viteReactRefresh
              @vite(['resources/js/app.js', 'resources/css/app.css'])
              @inertiaHead
          </head>
          <body class="font-sans antialiased">
              <div id="app" class="min-h-screen bg-gray-100 dark:bg-gray-900">
                  <!-- Aquí es donde Inertia montará tu aplicación React -->
              </div>
          </body>
      </html>
      
    • Otros archivos Blade (si los hay): Si tienes algunas vistas que no son manejadas por Inertia (ej. un email de bienvenida, una página de error estática), irían aquí.

  • resources/lang: Contiene los archivos de idioma de tu aplicación.

Flujo General:

  1. Cuando Laravel recibe una solicitud para una página Inertia, renderiza resources/views/app.blade.php.

  2. Este app.blade.php carga resources/js/app.js (y resources/css/app.css) a través de Vite.

  3. resources/js/app.js inicializa Inertia y React.

  4. Inertia determina qué "página" de resources/js/Pages debe renderizarse según la ruta de Laravel.

  5. Los componentes de shadcn/ui y tus propios componentes reutilizables (de resources/js/Components) se utilizan dentro de tus componentes de página y layouts para construir la interfaz de usuario.

  6. Tailwind CSS, importado en resources/css/app.css, proporciona todas las utilidades de estilo que usas directamente en tus componentes React.

Esta estructura promueve una clara separación de responsabilidades y facilita el desarrollo de aplicaciones modernas con Laravel, Inertia y React.

No hay comentarios: