Instalación y Configuración de Inertia.js con Laravel y Jetstream
Instalación y Configuración de Inertia.js con Laravel y Jetstream
Introducción
En este tutorial aprenderemos a instalar y configurar Inertia.js en un proyecto Laravel, utilizando Jetstream como sistema de autenticación. Inertia nos permite construir aplicaciones de una sola página (SPA) utilizando Vue.js, manteniendo el enrutamiento y controladores de Laravel.
1. Creación del Proyecto Laravel
Primero, creamos un nuevo proyecto Laravel:
composer create-project laravel/laravel inertia-exampleAccedemos al directorio del proyecto:
cd inertia-example2. Instalación de Laravel Jetstream con Inertia
Instalamos Jetstream con soporte para Inertia:
composer require laravel/jetstreamLuego, instalamos Jetstream específicamente con Inertia:
php artisan jetstream:install inertia
Este comando instalará y configurará:
Vue.js como framework frontend
Tailwind CSS
Sistema de autenticación completo
Estructura de componentes Vue
3. Configuración de la Base de Datos
Creamos una base de datos para el proyecto. En este ejemplo, la llamaremos inertia-example.
Configuramos el archivo .env con nuestras credenciales:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=inertia-example DB_USERNAME=root DB_PASSWORD=
Ejecutamos las migraciones para crear las tablas necesarias:
php artisan migrate
4. Instalación de Dependencias Frontend
Instalamos las dependencias de Node.js:
npm install
Para desarrollo, ejecutamos el servidor de Vite:
npm run devNota: Este comando mantiene activa la compilación de assets y detecta cambios automáticamente.
5. Estructura del Proyecto con Inertia
5.1. Archivo de Entrada: resources/js/app.js
Este archivo es el punto de entrada de la aplicación Vue:
import { createApp, h } from 'vue' import { createInertiaApp } from '@inertiajs/vue3' import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers' createInertiaApp({ resolve: (name) => resolvePageComponent( `./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue') ), setup({ el, App, props, plugin }) { createApp({ render: () => h(App, props) }) .use(plugin) .mount(el) }, })
5.2. Directorios Importantes
resources/js/Pages/: Componentes Vue que se renderizan como páginas completasresources/js/Components/: Componentes Vue reutilizablesresources/js/Layouts/: Layouts para las páginas
6. Creando Nuestro Primer Componente con Inertia
6.1. Crear un Controlador
Generamos un controlador para manejar nuestra página:
php artisan make:controller ExampleController
6.2. Definir la Ruta
En routes/web.php:
use App\Http\Controllers\ExampleController; Route::get('/example', [ExampleController::class, 'index'])->name('example');
6.3. Implementar el Controlador
En app/Http/Controllers/ExampleController.php:
<?php namespace App\Http\Controllers; use Inertia\Inertia; class ExampleController extends Controller { public function index() { return Inertia::render('ExampleInertia'); } }
Importante: En lugar de
view(), usamosInertia::render()para renderizar componentes Vue.
6.4. Crear el Componente Vue
Creamos el archivo resources/js/Pages/ExampleInertia.vue:
<template> <div> <h1>Hello World</h1> </div> </template> <script setup> // Lógica del componente </script> <style scoped> /* Estilos específicos del componente */ </style>
6.5. Compilar los Assets
Asegurémonos de que npm run dev esté ejecutándose. Si no, lo iniciamos:
npm run devAhora podemos acceder a http://localhost:8000/example y ver nuestro "Hello World".
7. Entendiendo el Flujo de Inertia
7.1. Flujo de Trabajo
Ruta Laravel → Define la URL
Controlador → Procesa la lógica y retorna
Inertia::render()Componente Vue → Se renderiza en el navegador
Vite → Compila y sirve los assets de Vue
7.2. Diferencia entre Vista Blade y Componente Inertia
Blade tradicional:
return view('welcome');
Inertia:
return Inertia::render('Welcome');
7.3. Ubicación Correcta de Componentes
Los componentes renderizados por rutas deben estar en
Pages/Los componentes reutilizables deben estar en
Components/
8. Reactividad en Vue con Inertia
8.1. Ejemplo de Contador Reactivo
Modificamos ExampleInertia.vue:
<template> <div> <h1>Hello World</h1> <p>Contador: {{ counter }}</p> <button @click="increment">Incrementar</button> </div> </template> <script setup> import { ref } from 'vue' const counter = ref(0) const increment = () => { counter.value++ } </script> <style scoped> h1 { color: #3490dc; } button { background-color: #3490dc; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; } </style>
8.2. Explicación
ref(0)crea una variable reactivacounter.valueaccede al valor@clickes el evento de Vue para manejar clicsLa reactividad funciona sin recargar la página
9. Navegación con Inertia
9.1. Importar el Componente Link
<template> <div> <h1>Hello World</h1> <Link :href="route('login')">Ir a Login</Link> </div> </template> <script setup> import { Link } from '@inertiajs/vue3' import { ref } from 'vue' const counter = ref(0) // ... </script>
9.2. Uso del Componente Link
<Link :href="route('login')">Login</Link> <Link :href="route('register')">Registro</Link> <Link :href="route('dashboard')">Dashboard</Link>
9.3. Ventajas del Componente Link
Navegación sin recarga completa de página
Transiciones suaves
Mantiene el estado de la aplicación
Compatible con las rutas nombradas de Laravel
10. Pasando Datos del Controlador al Componente
10.1. En el Controlador
public function index() { return Inertia::render('ExampleInertia', [ 'user' => auth()->user(), 'posts' => Post::all(), ]); }
10.2. En el Componente Vue
<script setup> defineProps({ user: Object, posts: Array }) </script>
10.3. Usando los Props
<template> <div> <h1>Hola, {{ user.name }}</h1> <ul> <li v-for="post in posts" :key="post.id"> {{ post.title }} </li> </ul> </div> </template>
11. Instalación de Inertia sin Jetstream
Si no deseas usar Jetstream, puedes instalar Inertia de forma pura:
composer require inertiajs/inertia-laravelLuego, publica la configuración:
php artisan vendor:publish --provider="Inertia\ServiceProvider"
12. Comandos de Compilación
12.1. Desarrollo
npm run devCompila los assets en modo desarrollo
Detecta cambios automáticamente
Ideal para desarrollo local
12.2. Producción
npm run buildCompila los assets optimizados para producción
Minifica el código
Genera archivos estáticos
13. Resumen del Flujo de Trabajo
Crear ruta en
routes/web.phpCrear controlador con
Inertia::render()Crear componente Vue en
resources/js/Pages/Ejecutar
npm run devpara compilarAcceder a la URL desde el navegador
14. Buenas Prácticas
14.1. Nomenclatura
Usar PascalCase para componentes Vue (ej:
ExampleInertia.vue)Mantener los componentes de página en
Pages/Usar componentes reutilizables en
Components/
14.2. Estructura
resources/js/ ├── Components/ # Componentes reutilizables │ ├── Button.vue │ └── Card.vue ├── Layouts/ # Layouts de página │ └── AppLayout.vue ├── Pages/ # Páginas completas │ ├── Dashboard.vue │ ├── ExampleInertia.vue │ └── Welcome.vue └── app.js # Punto de entrada
14.3. Props con Tipado
<script setup> defineProps({ user: { type: Object, required: true }, posts: { type: Array, default: () => [] } }) </script>
15. Conclusión
Hemos aprendido:
✅ Instalar Inertia en Laravel con Jetstream
✅ Configurar la base de datos
✅ Crear rutas y controladores con Inertia
✅ Renderizar componentes Vue como páginas
✅ Trabajar con reactividad en Vue
✅ Navegar entre páginas con el componente Link
✅ Pasar datos del controlador al componente
Inertia combina lo mejor de Laravel (backend) con lo mejor de Vue (frontend), permitiéndonos construir aplicaciones modernas y reactivas sin la complejidad de una API separada.
Recursos Adicionales
¡Ya tienes todo lo necesario para comenzar a desarrollar con Inertia en Laravel! 🚀
Comentarios
Publicar un comentario