Mostrando entradas con la etiqueta resources. Mostrar todas las entradas
Mostrando entradas con la etiqueta resources. Mostrar todas las entradas

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.