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

martes, 5 de agosto de 2025

Directiva @json de Blade y funcionalidades de Laravel Vite plugin

 En un archivo .blade.php ¿Qué es @vite('resources/.../....js') dentro de los tags head y body? ¿Qué es import {...} from @json(Vite::asset('resources/.../....js')) dentro del tag body?

En un archivo .blade.php, las directivas @vite() y Vite::asset() cumplen funciones específicas para integrar tus activos de frontend (JavaScript, CSS, etc.) procesados por Vite en tu HTML.


@vite('resources/.../....js')

La directiva @vite() es proporcionada por el paquete laravel-vite-plugin y es la forma principal de incluir tus archivos JavaScript y CSS compilados por Vite en tu HTML.

  • ¿Qué es? Es una directiva de Blade que se encarga de inyectar las etiquetas HTML necesarias (<script> para JavaScript y <link> para CSS) que apuntan a tus archivos de activos procesados por Vite.

  • ¿Para qué sirve?

    • Desarrollo: En modo de desarrollo (npm run dev), @vite() inyecta un script que conecta tu navegador al servidor de desarrollo de Vite. Esto permite características como la recarga en caliente (HMR - Hot Module Replacement), donde los cambios en tu código se reflejan instantáneamente en el navegador sin recargar la página completa.

    • Producción: Cuando compilas tus activos para producción (npm run build), Vite genera archivos optimizados y con "hash" (un identificador único en el nombre del archivo, como app.1a2b3c4d.js) para el almacenamiento en caché. @vite() se asegura de que tus etiquetas HTML apunten a estos archivos versionados correctamente, garantizando que los usuarios siempre obtengan las últimas versiones y que los navegadores puedan cachear los archivos de forma eficiente.

  • ¿Dónde se coloca?

    • Generalmente, @viteReactRefresh y @vite(['resources/js/app.js', 'resources/css/app.css']) (o el punto de entrada principal de tu JS) se colocan dentro de la etiqueta <head> o justo antes del cierre de la etiqueta </body>.

    • @viteReactRefresh: Si usas React, esta directiva es esencial en <head> para habilitar la recarga rápida de componentes de React durante el desarrollo.

    • @vite(['resources/js/app.js', 'resources/css/app.css']): Esta es la directiva principal. Por convención, los archivos CSS suelen ir en <head> y los JavaScript al final de <body> para mejorar el rendimiento de carga inicial de la página, pero Vite es lo suficientemente inteligente como para manejarlo si los pones ambos en <head>.

Ejemplo en resources/views/app.blade.php:

HTML
<head>
    <!-- ... otras etiquetas head ... -->
    @viteReactRefresh
    @vite(['resources/js/app.js', 'resources/css/app.css'])
</head>
<body>
    <div id="app"></div>
</body>

import {...} from @json(Vite::asset('resources/.../....js'))

Esta sintaxis es una combinación de Laravel y JavaScript para manejar importaciones dinámicas o cargar activos específicos en tu JavaScript en tiempo de ejecución.

  • Vite::asset('resources/.../....js'):

    • ¿Qué es? Es un helper de Laravel (parte de laravel-vite-plugin) que toma la ruta de un archivo fuente de tu proyecto (resources/...) y devuelve la URL pública y versionada de ese archivo después de que Vite lo ha procesado.

    • ¿Para qué sirve? Te da la ruta real en el directorio public/build (por ejemplo, /build/assets/mi-modulo.1a2b3c4d.js).

  • @json(...):

    • ¿Qué es? Es una directiva de Blade que toma una variable o expresión de PHP y la convierte en una cadena JSON válida, escapada de forma segura para ser incrustada directamente en JavaScript.

    • ¿Para qué sirve? Asegura que la URL obtenida de Vite::asset() se inserte correctamente como una cadena de JavaScript sin problemas de comillas o caracteres especiales.

  • import {...} from ... (dentro de una etiqueta <script> en Blade):

    • ¿Para qué sirve? Esta combinación se usa cuando necesitas la URL de un módulo o activo para una importación dinámica en JavaScript (por ejemplo, import('URL_DINAMICA')) o para cargar algo de forma condicional. No es para el punto de entrada principal de tu aplicación (para eso usas @vite()).

Escenario de uso común:

Imagina que tienes un módulo JavaScript pesado que solo quieres cargar cuando el usuario hace clic en un botón específico, o si ciertas condiciones se cumplen.

HTML
<body>
    <div id="app"></div>

    <script type="module">
        // Obtener la URL del módulo pesado dinámicamente
        const heavyModuleUrl = @json(Vite::asset('resources/js/heavy-module.js'));

        document.getElementById('load-module-button').addEventListener('click', async () => {
            try {
                // Importar el módulo usando la URL obtenida
                const { someFunction } = await import(heavyModuleUrl);
                someFunction();
                console.log('Módulo pesado cargado y ejecutado.');
            } catch (error) {
                console.error('Error al cargar el módulo:', error);
            }
        });
    </script>

    <button id="load-module-button">Cargar Módulo Pesado</button>
</body>

En este ejemplo, heavyModuleUrl contendrá algo como "/build/assets/heavy-module.abc123def.js", y JavaScript usará esa URL para cargar el módulo solo cuando sea necesario.

En resumen, @vite() es para la inclusión estándar de tus activos principales, mientras que @json(Vite::asset()) es para obtener URLs de activos específicos que necesitas para lógica JavaScript más dinámica o condicional.