Como crear un proyecto con Laravel 11, Vue 3, Inertia JS y Vite

Introducción

La creación de un proyecto utilizando Laravel 11, Vue 3, Inertia.js y ViteJS representa una combinación poderosa de tecnologías que puede marcar la diferencia en el desarrollo de aplicaciones web modernas. Cada una de estas herramientas desempeña un papel fundamental en la construcción de aplicaciones robustas, rápidas y eficientes.

Laravel 11, como uno de los frameworks de PHP más populares, proporciona una base sólida para el backend de la aplicación. Ofrece características avanzadas de enrutamiento, autenticación, manejo de bases de datos y seguridad, lo que facilita la creación de API y servicios web confiables.

Vue 3, por otro lado, es una de las bibliotecas de JavaScript más utilizadas para crear interfaces de usuario interactivas y dinámicas. Su capacidad para gestionar componentes de manera eficiente y su sintaxis clara hacen que sea una elección excelente para la construcción de la interfaz de usuario de la aplicación.

Inertia.js es un puente entre el frontend y el backend que permite crear aplicaciones de una sola página (SPA) sin tener que desarrollar un API REST completo. Esto simplifica la comunicación entre el frontend y el backend al tiempo que aprovecha las ventajas de ambos lados de la aplicación.

ViteJS es un nuevo entorno de desarrollo ultrarrápido para aplicaciones web que se integra perfectamente con Vue y otras tecnologías modernas. Su velocidad de construcción y recarga en tiempo real lo convierten en una opción ideal para el desarrollo ágil.

Instalación

Para iniciar el proyecto, la primera tarea será generar el proyecto en Laravel, y para lograrlo, utilizaremos el siguiente comando.

php composer.phar create-project laravel/laravel laravel11-vue3-inertia-vite

Este comando nos creara un proyecto con Laravel en la carpeta laravel11-vue3-inertia-vite una vez que la instalación haya terminado entraremos a la carpeta que se nos creó.

cd laravel11-vue3-inertia-vite

y ejecutaremos el siguiente comando dentro del proyecto.

npm install

Este comando instalara las dependencias del package.json, laravel 11 por defecto incluye las siguientes dependencias en el package.json

{
    "private": true,
    "type": "module",
    "scripts": {
        "dev": "vite",
        "build": "vite build"
    },
    "devDependencies": {
        "axios": "^1.1.2",
        "laravel-vite-plugin": "^0.8.0",
        "vite": "^4.0.0"
    }
}
Si tu package.json no contiene eso, te recomiendo que lo copies y pegues lo anterior en tu archivo y vuelvas a ejecutar npm install

Por último, deberemos de instalar las siguientes dependencias 

npm install --save-dev vue
npm install --save-dev vue-loader
npm install --save-dev @vitejs/plugin-vue
npm install --save-dev @inertiajs/vue3

Estas dependencias son necesarias para tener Vue.js, Vue Loader (que se encarga de interpretar los archivos .vue), @vitejs/plugin-vue (que nos ayudará a integrar Vue con Vite), e Inertia (que facilitará la integración entre Vue y Laravel).

Ahora del lado del servidor necesitaremos instalar la siguiente dependencia.

composer require inertiajs/inertia-laravel

Configuración

Para comenzar a configurar el proyecto primero empezaremos por el lado del cliente, por lo que debemos de irnos a nuestro archivo vite.config.js y le añadimos las siguientes líneas.

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
    plugins: [
        vue(),
        laravel({
            input: ['resources/css/app.css', 'resources/js/app.js'],
            refresh: true,
        }),
    ],
});

Ahora en nuestro archivo /resources/js/app.js debemos tener lo siguiente

import './bootstrap';

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })
    return pages[`./Pages/${name}.vue`]
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .mount(el)
  },
})

Ahora creamos el siguiente archivo en /resources/js/Pages/Inicio.vue  y colocaremos lo siguiente.

<template>
  <div>
    Hola desde el inicio
  </div>
</template>

<script>
export default {
    name: 'Inicio'
}
</script>

Y ahora del lado del servidor crearemos la siguiente vista blade /resources/view/app.blade.php y colocaremos lo siguiente.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
    @vite('resources/js/app.js')
    @inertiaHead
  </head>
  <body>
    @inertia
  </body>
</html>

Ahora necesitaremos ejecutar el siguiente comando para publicar el middleware de inertia.

php artisan inertia:middleware

y en nuestro archivo bootstrap/app.php necesitaremos registrar el middleware dentro del la función callback del método withMiddleware

->withMiddleware(function (Middleware $middleware) {
        $middleware->web(append: [
            \App\Http\Middleware\HandleInertiaRequests::class,
        ]);
    })

Ahora en nuestro archivo /routes/web.php crearemos la siguiente ruta

use Inertia\Inertia;
use Illuminate\Support\Facades\Route;


Route::get('/inicio', function () {
    return Inertia::render('Inicio');
});

Ya para poder visualizar nuestra página debemos de ejecutar los siguientes comandos en terminales distintas.

php artisan serve
npm run dev

Una vez lo ejecutemos deberíamos ver lo siguiente.

Como crear un proyecto con Laravel 11, Vue 3, Inertia JS y Vite

Y listo, si nos dirigimos al siguiente link https://localhost:8000/inicio podremos ver lo siguiente 

Como crear un proyecto con Laravel 11, Vue 3, Inertia JS y Vite

Si quisiéramos añadir otra vista, bastaría con añadir otro componente y otra ruta 

<template>
    <!-- El nuevo componente -->
    <!-- /resources/js/Pages/Contacto.vue -->
  <div>Hola desde el contacto</div>
</template>

<script>
export default {
  name: "Contacto",
};
</script>
<?php

use Inertia\Inertia;
use Illuminate\Support\Facades\Route;

Route::get('/inicio', function () {
    return Inertia::render('Inicio');
});

Route::get('/contacto', function () {
    return Inertia::render('Contacto');
});

Hasta este punto, ya tenemos los elementos principales para comenzar con nuestro desarrollo. Aunque en este artículo no profundizaremos en Inertia, a continuación, exploraremos algunas funcionalidades importantes que se pueden utilizar.

Otros conceptos

Pasar datos entre Laravel y Vue

Gracias a Inertia, la transferencia de datos entre el front-end y el back-end se simplifica considerablemente.

Para ver eso en nuestra ruta "inicio" (/routes/web.php) añadiremos lo siguiente.

Route::get('/inicio', function () {
    return Inertia::render('Inicio', [
        'nombre' => 'Diego Picazo'
    ]);
});

y en nuestro componente /resources/Pages/Inicio.vue añadiremos lo siguiente.

<template>
  <div>
    <h1>Hola desde el inicio</h1>
    <p>Hola {{ nombre }}</p>
  </div>
</template>

<script>
export default {
  name: "Inicio",
  props: {
    nombre: String
  },
};
</script>

Ahora si visualizamos la página http://localhost:8000/inicio podemos ver que se muestra el nombre que mandamos desde Laravel 

Como crear un proyecto con Laravel 11, Vue 3, Inertia JS y Vite

Podemos mandar tantos datos como queramos siempre y cuando los registremos en las propiedades del componente.

Layouts

Usualmente hay cosas que siempre queremos que estén visibles, como el menu o el footer y en inertia pensaron en eso.

Primero crearemos nuestro layout en /resources/js/components/Layout.vue,  el cual contendrá lo siguiente.

<template>
  <div>
    <header>
      <nav>
        <ul>
          <li><a href="/inicio">Inicio</a></li>
          <li><a href="/contacto">Contacto</a></li>
        </ul>
      </nav>
    </header>
    <main>
      <slot></slot>
    </main>
    <footer>
      Este es el footer
    </footer>
  </div>
</template>

<script>
export default {
  name: 'Layout'
}
</script>

Y modificaremos nuestro archivo /resources/js/app.js y le añadiremos lo siguiente

import './bootstrap';

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'
import Layout from './components/Layout.vue'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })

    let page = pages[`./Pages/${name}.vue`]
    page.default.layout = page.default.layout || Layout
    return page
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .mount(el)
  },
})

De esta manera podremos definir un layout especifico por componente o bien un layout por defecto, si accedemos a la ruta de http://localhost:8000/inicio veremos lo siguiente

Como crear un proyecto con Laravel 11, Vue 3, Inertia JS y Vite

Si quisieras tener un layout en específico debes de definirlo dentro de tu componente, para ver esto crearemos otro componente layout

<template>
  <!-- /resources/js/components/Layout2.vue -->
  <div>
    <header>
      <nav>
        <ul>
          <li><a href="/inicio">Inicio</a></li>
          <li><a href="/contacto">Contacto</a></li>
        </ul>
      </nav>

      <h1>Estas en el layout 2</h1>
    </header>
    <main>
      <slot></slot>
    </main>
    <footer>
      Este es el footer
    </footer>
  </div>
</template>

<script>
export default {
  name: 'Layout2'
}
</script>

Y dentro de nuestro componente /resources/js/Pages/Inicio.vue añadiremos lo siguiente para definir el layout

<template>
  <div>
    <h1>Hola desde el inicio</h1>
    <p>Hola {{ nombre }}</p>
  </div>
</template>

<script>
import Layout2 from "../components/Layout2.vue";
export default {
  name: "Inicio",
  layout: Layout2,
  props: {
    nombre: String,
  },
};
</script>

De esta manera si ingresamos a http://localhost:8000/inicio podemos ver que el layout ya cambio

Como crear un proyecto con Laravel 11, Vue 3, Inertia JS y Vite

si quieres saber más sobre los layouts en inertia te recomiendo que visites el siguiente link Pages - Inertia.js (inertiajs.com)

Navegar entre vistas de Inertia

Ahora, para la navegación entre vistas, Inertia nos proporciona un componente que utilizaremos con frecuencia. Para facilitar su uso, te recomiendo registrar este componente de forma global. Puedes hacerlo añadiendo el siguiente código en el archivo /resources/js/app.js:

import './bootstrap';

import { createApp, h } from 'vue'
import { createInertiaApp, Link } from '@inertiajs/vue3'
import Layout from './components/Layout.vue'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })

    let page = pages[`./Pages/${name}.vue`]
    page.default.layout = page.default.layout || Layout
    return page
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .component('Link',Link)
      .mount(el)
  },
})

y en nuestro archivo /resources/js/components/Layout.vue modificaremos lo siguiente.

<template>
  <div>
    <header>
      <nav>
        <ul>
          <li><Link href="/inicio"> Inicio </Link></li>
          <li><Link href="/contacto"> Contacto </Link></li>
        </ul>
      </nav>
    </header>
    <main>
      <slot></slot>
    </main>
    <footer>Este es el footer</footer>
  </div>
</template>

<script>
export default {
  name: "Layout",
};
</script>

Con Inertia, el proceso se simplifica ya que obtiene los datos del servidor y realiza los cambios necesarios en el front-end. Sin embargo, es importante tener en cuenta que si cambiamos de página utilizando métodos distintos a las herramientas proporcionadas por Inertia, la página se recargará por completo y no será la forma óptima de aprovechar las ventajas de Inertia.

También inertia nos ofrece un api para poder navegar entre paginas programáticamente 

import { router } from '@inertiajs/vue3'

router.get(url, data, options)
router.post(url, data, options)
router.put(url, data, options)
router.patch(url, data, options)
router.delete(url, options)
router.reload(options) // Uses the current URL

para saber más de cómo funciona te invito a que visites la siguiente página Manual visits - Inertia.js (inertiajs.com)

Conclusión

En conclusión, la elección de combinar Laravel 11, Vue 3, Inertia.js y ViteJS para desarrollar un proyecto web es una estrategia altamente beneficiosa y poderosa. Estas tecnologías trabajan en armonía para ofrecer una experiencia de desarrollo eficiente y una aplicación final de alto rendimiento.

Como mencione inicialmente, el objetivo de este post no es profundizar en Inertia. Te recomiendo que visites la documentación oficial de esta herramienta para obtener información detallada sobre su uso y sus características.

Inertia.js - The Modern Monolith (inertiajs.com)

Comentarios (0)
Deja un comentario
arrow-up-bold-circle