{"id":60764,"date":"2022-12-12T16:02:16","date_gmt":"2022-12-12T15:02:16","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=60764&#038;preview=true&#038;preview_id=60764"},"modified":"2025-01-17T14:41:31","modified_gmt":"2025-01-17T13:41:31","slug":"laravel-inertia","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/","title":{"rendered":"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel"},"content":{"rendered":"<p>Las aplicaciones multip\u00e1gina (MPA &#8211; Multi-Page App en ingl\u00e9s) son cada d\u00eda menos populares. Plataformas famosas como Facebook, Twitter, YouTube, Github y muchas otras ya utilizan en su lugar la tecnolog\u00eda de las aplicacinerciaiones de una sola p\u00e1gina (SPA &#8211; single-page application en ingl\u00e9s).<\/p>\n<p>Esta tecnolog\u00eda de moda permite a los usuarios interactuar con las aplicaciones web con rapidez y capacidad de respuesta, porque todo se renderiza en el lado del cliente. Sin embargo, puede ser una molestia para los desarrolladores que crean aplicaciones renderizadas del lado del servidor con frameworks como Laravel o Django.<\/p>\n<p>Afortunadamente, Inertia.js intervino y vino al rescate.<br \/>\n<br \/>\nEn este art\u00edculo, mostraremos c\u00f3mo puedes empezar a utilizar Inertia.js y c\u00f3mo utilizarlo con Laravel, Vue.js y Tailwind CSS para crear una moderna aplicaci\u00f3n web de blog. Tambi\u00e9n compartiremos c\u00f3mo hacer que las SPA sean m\u00e1s respetuosas con el SEO, as\u00ed como algunos otros trucos.<\/p>\n<p>Si acabas de empezar con Laravel, te recomendamos que leas <a href=\"https:\/\/kinsta.com\/es\/blog\/desarrollador-de-laravel\/\">este art\u00edculo primero<\/a> para estar preparado.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>\u00bfPor qu\u00e9 SPA?<\/h2>\n<p>Antes de preguntarnos por qu\u00e9 deber\u00edamos utilizar Inertia, debemos preguntarnos: \u00ab\u00bfPor qu\u00e9 SPA?\u00bb<\/p>\n<p>\u00bfPor qu\u00e9 alguien preferir\u00eda las aplicaciones renderizadas del lado del cliente a las aplicaciones tradicionales del lado del servidor? \u00bfQu\u00e9 obligar\u00eda a un desarrollador Laravel full-stack a decir adi\u00f3s a <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-laravel\/#templating\">los componentes blade<\/a>?<\/p>\n<p>La respuesta corta es: porque la velocidad y la capacidad de respuesta son esenciales para el \u00e9xito de cualquier interacci\u00f3n con el usuario.<\/p>\n<p>En el caso de las MPA, el navegador env\u00eda constantemente peticiones al backend, que ejecuta numerosas consultas a la base de datos. Despu\u00e9s de que la base de datos y el servidor procesen las consultas y las entreguen al navegador, se renderiza la p\u00e1gina.<\/p>\n<p>Pero las SPA son diferentes. La aplicaci\u00f3n lleva todo lo que el usuario necesitar\u00eda directamente a la p\u00e1gina, eliminando la necesidad de que el navegador env\u00ede consultas o recargue la p\u00e1gina para renderizar nuevos elementos HTML.<\/p>\n<p>Debido a esta experiencia de usuario \u00fanica, muchas grandes empresas est\u00e1n pidiendo a gritos que sus sitios web se conviertan en aplicaciones de una sola p\u00e1gina.<\/p>\n<p>Dicho esto, crear una aplicaci\u00f3n de una sola p\u00e1gina puede ser dif\u00edcil para los desarrolladores de Laravel, porque les obligar\u00eda a empezar a utilizar Vue.js o React en lugar de plantillas de hoja, lo que supondr\u00eda la p\u00e9rdida de muchas gemas de Laravel que ahorran tiempo y esfuerzo.<\/p>\n<p>Sin embargo, ahora que tenemos Inertia.js, eso ha cambiado.<\/p>\n<h2>\u00bfPor qu\u00e9 Inertia?<\/h2>\n<p>Si los desarrolladores de Laravel construyeran SPA web con Vue antes de Inertia, tendr\u00edan que configurar API y devolver datos JSON con Laravel, y luego utilizar algo como AXIOS para recuperar los datos en componentes Vue. Tambi\u00e9n necesitar\u00edan algo como Vue Router para gestionar las rutas, lo que significar\u00eda perder el enrutamiento de Laravel, as\u00ed como los middlewares y controladores.<\/p>\n<p>Inertia.js, por otro lado, permite a los desarrolladores construir modernas aplicaciones Vue, React y Svelte de una sola p\u00e1gina utilizando enrutamiento y controladores cl\u00e1sicos del lado del servidor. Inertia se dise\u00f1\u00f3 para que los desarrolladores de Laravel, Ruby on Rails y Django pudieran crear aplicaciones sin cambiar sus t\u00e9cnicas de codificaci\u00f3n de creaci\u00f3n de controladores, obtenci\u00f3n de datos de una base de datos y representaci\u00f3n de vistas<\/p>\n<p>Gracias a Inertia.js, los desarrolladores de Laravel se sentir\u00e1n como en casa.<\/p>\n<h2>C\u00f3mo funciona Inertia<\/h2>\n<p>Construir SPA s\u00f3lo con Laravel y Vue te dar\u00e1 una p\u00e1gina JavaScript completa para tu frontend, pero esto no te proporcionar\u00e1 una experiencia de aplicaci\u00f3n de una sola p\u00e1gina. Cada enlace pulsado har\u00e1 que tu framework del lado del cliente se reinicie en la siguiente carga de p\u00e1gina.<\/p>\n<p>Aqu\u00ed es donde entra en escena la Inertia.<\/p>\n<p>Inertia es b\u00e1sicamente una biblioteca de enrutamiento del lado del cliente. Te permite navegar entre p\u00e1ginas sin tener que recargar toda la p\u00e1gina. Esto se consigue mediante el componente <code>&lt;Link&gt;<\/code>, que es una envoltura ligera alrededor de una etiqueta de anclaje est\u00e1ndar.<\/p>\n<p>Cuando haces clic en un enlace Inertia intercepta el clic y te redirige a XHR. El navegador no recargar\u00e1 la p\u00e1gina de esta forma, proporcionando al usuario una experiencia completa de una sola p\u00e1gina.<\/p>\n<h2>Primeros pasos con Inertia<\/h2>\n<figure id=\"attachment_134651\" aria-describedby=\"caption-attachment-134651\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134651 size-large\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/kinsta-laravel-inertiajs-tutorial-1024x640.png\" alt=\"Una p\u00e1gina de ejemplo hecha con Inertia.js\" width=\"1024\" height=\"640\"><figcaption id=\"caption-attachment-134651\" class=\"wp-caption-text\">Una p\u00e1gina de ejemplo hecha con Inertia.js<\/figcaption><\/figure>\n<p>Para entender Inertia y c\u00f3mo integrarlo con Laravel, vamos a construir una aplicaci\u00f3n web de blog llamada <strong>Kinsta Blog<\/strong> utilizando el combo m\u00e1s potente, Laravel para el backend, Vue.js para el frontend JavaScript, y Tailwind CSS para el estilo.<\/p>\n<p>Si prefieres seguir este tutorial en un entorno local, puedes utilizar <a href=\"https:\/\/kinsta.com\/es\/devkinsta\/\">DevKinsta<\/a>, una potente herramienta para desarrolladores, dise\u00f1adores y agencias que les permite construir aplicaciones web de WordPress de una o varias p\u00e1ginas. Afortunadamente, WordPress puede integrarse f\u00e1cilmente con Laravel utilizando el paquete <a href=\"https:\/\/github.com\/corcel\/corcel\">Corcel<\/a>.<\/p>\n<h3>Requisitos previos<\/h3>\n<p>Para sacar el m\u00e1ximo partido a este tutorial, debes estar familiarizado con lo siguiente:<\/p>\n<ul>\n<li>Conceptos b\u00e1sicos de Laravel (instalaci\u00f3n, base de datos, migraciones de base de datos, Eloquent Models, controladores y enrutamiento)<\/li>\n<li>Conceptos b\u00e1sicos de Vue.js (instalaci\u00f3n, estructura y formularios)<\/li>\n<\/ul>\n<p>Si te sientes inseguro, consulta estos fant\u00e1sticos <a href=\"https:\/\/kinsta.com\/es\/blog\/tutoriales-laravel\/\">tutoriales gratuitos y de pago de Laravel<\/a>. De lo contrario, empecemos.<\/p>\n<h3>Paso 1: Instalar los elementos principales<\/h3>\n<p>Para centrarte en Inertia.js y pasar directamente a la parte divertida, aseg\u00farate de tener lista la siguiente configuraci\u00f3n:<\/p>\n<ol>\n<li>Proyecto Laravel 9 reci\u00e9n instalado con nombre <code>kinsta-blog<\/code><\/li>\n<li>Tailwind CSS CLI instalado en nuestro proyecto Laravel<\/li>\n<li>Archivo de imagen \u00abkinsta-logo.png\u00bb. Descarga y desempaqueta el paquete de logos de Kinsta desde <a href=\"https:\/\/kinsta.com\/es\/prensa\/\">https:\/\/kinsta.com\/press\/<\/a>, y copia kinsta-logo2.png al directorio public\/images como kinsta-logo.png.<\/li>\n<li>Dos componentes blade en <strong>kinsta-blog\/resources\/views<\/strong> para ver la p\u00e1gina de inicio del blog y un solo art\u00edculo del blog, como se muestra a continuaci\u00f3n:\u00bb\/resources\/views\/<strong>index.blade.php<\/strong>\u00ab:\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"{{ str_replace('_', '-', app()-&gt;getLocale()) }}\"&gt;\n  &lt;head&gt;\n    &lt;meta charset=\"utf-8\" \/&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/&gt;\n\n    &lt;title&gt;Kinsta Blog&lt;\/title&gt;\n  &lt;\/head&gt;\n\n  &lt;body&gt;\n    &lt;header&gt;\n      &lt;h1&gt;Kinsta Blog&lt;\/h1&gt;\n    &lt;\/header&gt;\n\n    &lt;main&gt;\n      &lt;h2&gt;Read our latest articles&lt;\/h2&gt;\n\n      &lt;section&gt;\n        &lt;article&gt;\n          &lt;div&gt;\n            &lt;img src=\"\/images\/kinsta-logo.png\" alt=\"Article thumbnail\" \/&gt;\n          &lt;\/div&gt;\n\n          &lt;h3&gt;Title for the blog&lt;\/h3&gt;\n          &lt;p&gt;\n            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Illum rem\n            itaque error vel perferendis aliquam numquam dignissimos, expedita\n            perspiciatis consectetur!\n          &lt;\/p&gt;\n\n          &lt;a href=\"#\"&gt;Read more&lt;\/a&gt;\n        &lt;\/article&gt;\n      &lt;\/section&gt;\n    &lt;\/main&gt;\n\n    &lt;footer&gt;\n      &lt;h2&gt;Join our Newsletter&lt;\/h2&gt;\n\n      &lt;input type=\"email\" \/&gt;\n    &lt;\/footer&gt;\n  &lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>\u00ab\/resources\/views\/<strong>show.blade.php<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"{{ str_replace('_', '-', app()-&gt;getLocale()) }}\"&gt;\n  &lt;head&gt;\n    &lt;meta charset=\"utf-8\" \/&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/&gt;\n\n    &lt;title&gt;Kinsta Blog&lt;\/title&gt;\n  &lt;\/head&gt;\n\n  &lt;body&gt;\n    &lt;main&gt;\n      &lt;article&gt;\n        &lt;div&gt;\n          &lt;img src=\"\/images\/kinsta-logo.png\" alt=\"Article thumbnail\" \/&gt;\n        &lt;\/div&gt;\n\n        &lt;h1&gt;Title for the blog&lt;\/h1&gt;\n\n        &lt;p&gt;Article content goes here&lt;\/p&gt;\n      &lt;\/article&gt;\n    &lt;\/main&gt;\n\n    &lt;footer&gt;\n      &lt;h2&gt;Join our Newsletter&lt;\/h2&gt;\n\n      &lt;input type=\"email\" \/&gt;\n    &lt;\/footer&gt;\n  &lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<\/li>\n<li>Base de datos local MySQL denominada <code>kinsta_blog<\/code> conectada a nuestro proyecto:\u00bb<strong>.env<\/strong>\u00ab:\n<pre><code class=\"language-js\">DB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=kinsta_blog\nDB_USERNAME=root\nDB_PASSWORD=<\/code><\/pre>\n<\/li>\n<li>Modelo de art\u00edculo, migraciones y f\u00e1bricas: \u00abapp\/Models\/<strong>Article.php<\/strong>\u00ab:\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Article extends Model\n{\n    use HasFactory;\n\n    protected $fillable = ['title', 'excerpt', 'body'];\n}<\/code><\/pre>\n<p>\u00abdatabase\/migrations\/<strong>create_articles_table.php<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n\n    public function up()\n    {\n        Schema::create('articles', function (Blueprint $table) {\n            $table-&gt;id();\n            $table-&gt;string('title');\n            $table-&gt;text('excerpt');\n            $table-&gt;text('body');\n            $table-&gt;timestamps();\n        });\n    }\n\n    public function down()\n    {\n        Schema::dropIfExists('articles');\n    }\n};<\/code><\/pre>\n<p>\u00abdatabase\/factories\/<strong>ArticleFactory.php<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace DatabaseFactories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\n\nclass ArticleFactory extends Factory\n{\n\n    public function definition()\n    {\n        return [\n            'title' =&gt; $this-&gt;faker-&gt;sentence(6),\n            'excerpt' =&gt; $this-&gt;faker-&gt;paragraph(4),\n            'body' =&gt; $this-&gt;faker-&gt;paragraph(15),\n        ];\n    }\n}<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>\u00a1Esto es todo lo que necesitamos para empezar! Ahora pong\u00e1monos manos a la obra e introduzcamos Inertia.js a nuestro proyecto.<\/p>\n<h3>Paso 2: Instalar Inertia<\/h3>\n<p>El proceso de instalaci\u00f3n de Inertia se divide en dos fases principales: del lado del servidor (Laravel) y del lado del cliente (VueJs).<\/p>\n<p>La gu\u00eda oficial de instalaci\u00f3n en la documentaci\u00f3n de Inertia est\u00e1 un poco desfasada porque <a href=\"https:\/\/vitejs.dev\/guide\/#scaffolding-your-first-vite-project\">Laravel 9 ahora utiliza Vite<\/a> por defecto, pero tambi\u00e9n la revisaremos.<\/p>\n<h4>1. Del lado del servidor<\/h4>\n<p>Lo primero que tenemos que hacer es instalar los adaptadores Inertia del lado del servidor con el siguiente comando de terminal a trav\u00e9s de Composer.<\/p>\n<pre><code class=\"language-bash\">composer require inertiajs\/inertia-laravel<\/code><\/pre>\n<p>Ahora configuraremos nuestra plantilla ra\u00edz, que ser\u00e1 un \u00fanico archivo blade que se utilizar\u00e1 para cargar tus archivos CSS y JS, as\u00ed como una ra\u00edz Inertia que se utilizar\u00e1 para lanzar nuestra aplicaci\u00f3n JavaScript.<\/p>\n<p>Como estamos utilizando la versi\u00f3n m\u00e1s reciente Laravel 9 v9.3.1, tambi\u00e9n debemos habilitar Vite para que haga su magia incluy\u00e9ndolo dentro de nuestras etiquetas en \/resources\/views\/<strong>app.blade.php<\/strong> :<\/p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"{{ str_replace('_', '-', app()-&gt;getLocale()) }}\"&gt;\n  &lt;head&gt;\n    &lt;meta charset=\"utf-8\" \/&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/&gt;\n\n    <!-- Fetch project name dynamically -->\n    &lt;title inertia&gt;{{ config('app.name', 'Laravel') }}&lt;\/title&gt;\n\n    <!-- Scripts -->\n    @vite('resources\/js\/app.js') @inertiaHead\n  &lt;\/head&gt;\n\n  &lt;body class=\"font-sans antialiased\"&gt;\n    @inertia\n  &lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>Observa c\u00f3mo podemos obtener el t\u00edtulo del proyecto de forma din\u00e1mica a\u00f1adiendo el atributo <code>inertia<\/code> a las etiquetas <code>&lt;title&gt;<\/code>.<\/p>\n<p>Tambi\u00e9n a\u00f1adimos la directiva <code>@vite<\/code> a la cabecera para que Vite conozca la ruta de nuestro archivo principal JavaScript donde creamos nuestra aplicaci\u00f3n e importamos nuestro CSS. Vite es una herramienta que ayuda en el desarrollo de JavaScript y CSS permitiendo a los desarrolladores ver los cambios en el frontend sin tener que actualizar la p\u00e1gina durante el desarrollo local.<\/p>\n<p>Nuestro siguiente paso ser\u00e1 crear el middleware <strong>HandleInertiaRequests<\/strong> y publicarlo en nuestro proyecto. Podemos hacerlo ejecutando el siguiente comando de terminal dentro del directorio ra\u00edz de nuestro proyecto:<\/p>\n<pre><code class=\"language-bash\">php artisan inertia:middleware<\/code><\/pre>\n<p>Una vez completado esto, dir\u00edgete a \u00abApp\/Http\/<strong>Kernel.php<\/strong>\u00bb y registra <code>HandleInertiaRequests<\/code> como el \u00faltimo elemento de tus middlewares web:<\/p>\n<pre><code class=\"language-php\">'web' =&gt; [\n    \/\/ ...\n    App\\Http\\Middleware\\HandleInertiaRequests::class,\n],<\/code><\/pre>\n<h4>2. Lado del Cliente<\/h4>\n<p>A continuaci\u00f3n, tenemos que instalar las dependencias de nuestro frontend Vue.js 3 del mismo modo que en el lado del servidor:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/inertia @inertiajs\/inertia-vue3\n\/\/ or\nyarn add @inertiajs\/inertia @inertiajs\/inertia-vue3<\/code><\/pre>\n<p>A continuaci\u00f3n, tienes que instalar Vue.js 3:<\/p>\n<pre><code class=\"language-bash\">npm install vue@next<\/code><\/pre>\n<p>A continuaci\u00f3n, actualiza tu archivo JavaScript principal para inicializar Inertia.js con Vue.js 3, Vite y Laravel:<\/p>\n<p>\u00abresources\/js\/<strong>app.js<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-js\">import \".\/bootstrap\";\nimport \"..\/css\/app.css\";\n\nimport { createApp, h } from \"vue\";\nimport { createInertiaApp } from \"@inertiajs\/inertia-vue3\";\nimport { resolvePageComponent } from \"laravel-vite-plugin\/inertia-helpers\";\n\ncreateInertiaApp({\n  title: (title) =&gt; `${title} - ${appName}`,\n  resolve: (name) =&gt;\n    resolvePageComponent(\n      `.\/Pages\/${name}.vue`,\n      import.meta.glob(\".\/Pages\/**\/*.vue\")\n    ),\n  setup({ el, app, props, plugin }) {\n    return createApp({ render: () =&gt; h(app, props) })\n      .use(plugin)\n      .mount(el);\n  },\n});<\/code><\/pre>\n<p>En el fragmento de c\u00f3digo anterior, utilizamos el plugin de Laravel <code>resolvePageComponent<\/code>, y le decimos que resuelva nuestros componentes desde el directorio <strong>.\/Pages\/$name.vue<\/strong>. Esto se debe a que guardaremos nuestros componentes Inertia en este directorio m\u00e1s adelante en nuestro proyecto, y este plugin nos ayudar\u00e1 a cargar autom\u00e1ticamente esos componentes desde el directorio correcto.<\/p>\n<p>Lo \u00fanico que nos queda es instalar <code>vitejs\/plugin-vue<\/code>:<\/p>\n<pre><code class=\"language-bash\">npm i @vitejs\/plugin-vue<\/code><\/pre>\n<p>Y actualizar el archivo <strong>vite.config.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">import { defineConfig } from \"vite\";\nimport laravel from \"laravel-vite-plugin\";\nimport vue from \"@vitejs\/plugin-vue\";\n\nexport default defineConfig({\n  plugins: [\n    laravel({\n      input: [\"resources\/css\/app.css\", \"resources\/js\/app.js\"],\n      refresh: true,\n    }),\n    vue({\n      template: {\n        transformAssetUrls: {\n          base: null,\n          includeAbsolute: false,\n        },\n      },\n    }),\n  ],\n});<\/code><\/pre>\n<p>El \u00faltimo paso es instalar nuestras dependencias y compilar nuestros archivos:<\/p>\n<pre><code class=\"language-bash\">npm install\n\nnpm run dev<\/code><\/pre>\n<p>\u00a1Y voil\u00e0! Ya tienes una aplicaci\u00f3n Laravel 9 funcionando con Vue.js 3 y Vite. \u00a1Ahora tenemos que verlo en acci\u00f3n!<\/p>\n<h2>Crear p\u00e1ginas de Inertia<\/h2>\n<p>\u00bfRecuerdas esos dos archivos blade (<strong>index<\/strong> y <strong>show<\/strong>) para ver nuestra p\u00e1gina de inicio y un solo art\u00edculo?<\/p>\n<p>El \u00fanico archivo blade que necesitaremos mientras utilicemos Inertia es <strong>app.blade.php<\/strong>, que ya utilizamos una vez cuando instalamos Inertia. \u00bfQu\u00e9 ocurre ahora con esos archivos?<\/p>\n<p>Transformaremos esos archivos de componentes blade en componentes Inertia.js.<\/p>\n<p>Cada p\u00e1gina de tu aplicaci\u00f3n tiene su propio controlador y componente JavaScript con Inertia. Esto te permite obtener s\u00f3lo los datos necesarios para esa p\u00e1gina, sin utilizar una API. Las p\u00e1ginas Inertia no son m\u00e1s que componentes JavaScript, en nuestro caso, son componentes Vue.js. No tienen nada especialmente destacable. As\u00ed que lo que haremos ser\u00e1 envolver todo el contenido HTML entre etiquetas <code>&lt;template&gt;<\/code> y todo lo relacionado con JavaScript se envolver\u00e1 con etiquetas <code>&lt;script&gt;<\/code>.<\/p>\n<p>Crea una carpeta llamada \u00abPages\u00bb y mueve tus archivos all\u00ed. As\u00ed que tendremos \u00ab<strong>index.blade.php<\/strong>\u00bb y \u00ab<strong>show.blade.php<\/strong>\u00bb en \u00ab<strong>.\/resources\/js\/Pages<\/strong>\u00ab. A continuaci\u00f3n, cambiaremos el formato del archivo a \u00ab.vue\u00bb en lugar de \u00ab.blade.php\u00bb, haremos que la primera letra de sus nombres est\u00e9 en may\u00fasculas y convertiremos su contenido en un componente Vue.js est\u00e1ndar. Excluiremos las etiquetas <code>&lt;html&gt;<\/code>, <code>&lt;head&gt;<\/code> y <code>&lt;body&gt;<\/code> porque ya est\u00e1n incluidas en el componente ra\u00edz principal de blade.<\/p>\n<p>\u00abresources\/js\/Pages\/<strong>Index.vue<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\n  \/\/\n&lt;\/script&gt;\n\n&lt;template&gt;\n  &lt;header&gt;\n    &lt;h1&gt;Kinsta Blog&lt;\/h1&gt;\n  &lt;\/header&gt;\n\n  &lt;main&gt;\n    &lt;h2&gt;Read our latest articles&lt;\/h2&gt;\n\n    &lt;section&gt;\n      &lt;article&gt;\n        &lt;div&gt;\n          &lt;img src=\"\/images\/kinsta-logo.png\" alt=\"Article thumbnail\" \/&gt;\n        &lt;\/div&gt;\n\n        &lt;h3&gt;Title for the blog&lt;\/h3&gt;\n        &lt;p&gt;\n          Lorem, ipsum dolor sit amet consectetur adipisicing elit. Illum rem\n          itaque error vel perferendis aliquam numquam dignissimos, expedita\n          perspiciatis consectetur!\n        &lt;\/p&gt;\n\n        &lt;a href=\"#\"&gt;Read more&lt;\/a&gt;\n      &lt;\/article&gt;\n    &lt;\/section&gt;\n  &lt;\/main&gt;\n\n  &lt;footer&gt;\n    &lt;h2&gt;Join our Newsletter&lt;\/h2&gt;\n\n    &lt;input type=\"email\" \/&gt;\n  &lt;\/footer&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<p>\u00abresources\/js\/Pages\/<strong>Show.vue<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\n  \/\/\n&lt;\/script&gt;\n\n&lt;template&gt;\n  &lt;header&gt;\n    &lt;h1&gt;Welcome to Kinsta Blog&lt;\/h1&gt;\n  &lt;\/header&gt;\n\n  &lt;main&gt;\n    &lt;article&gt;\n      &lt;h1&gt;Title for the blog&lt;\/h1&gt;\n\n      &lt;p&gt;Article content goes here&lt;\/p&gt;\n    &lt;\/article&gt;\n  &lt;\/main&gt;\n\n  &lt;footer&gt;\n    &lt;h2&gt;Join our Newsletter&lt;\/h2&gt;\n\n    &lt;input type=\"email\" \/&gt;\n  &lt;\/footer&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<p>\u00a1Hay algo que me molesta mucho! Seguimos copiando y pegando nuestro encabezado y pie de p\u00e1gina en cada componente, lo que no es una pr\u00e1ctica muy buena. Vamos a crear un Layout b\u00e1sico de Inertia para almacenar nuestros componentes persistentes.<\/p>\n<p>Crea una carpeta llamada \u00abLayouts\u00bb en \u00ab<strong>\/resources\/js<\/strong>\u00bb y dentro de esa carpeta crea un archivo llamado \u00abKinstaLayout.vue\u00bb. Este archivo tendr\u00e1 nuestra cabecera y pie de p\u00e1gina y el <code>main<\/code> con un <code>&lt;slot \/&gt;<\/code> para permitir que todos los componentes envueltos con este dise\u00f1o se incrusten dentro de \u00e9l. Este archivo deber\u00eda tener el siguiente aspecto :<\/p>\n<p>\u00abresources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;&lt;\/script&gt;\n\n&lt;template&gt;\n    &lt;header&gt;\n    &lt;h1&gt;Kinsta Blog&lt;\/h1&gt;\n  &lt;\/header&gt;\n\n  &lt;main&gt;\n        &lt;slot \/&gt;\n  &lt;\/main&gt;\n\n  &lt;footer&gt;\n    &lt;h2&gt;Join our Newsletter&lt;\/h2&gt;\n\n    &lt;input type=\"email\" \/&gt;\n  &lt;\/footer&gt;\n\n&lt;\/template&gt;<\/code><\/pre>\n<p>A continuaci\u00f3n, vamos a importar este nuevo dise\u00f1o en nuestras p\u00e1ginas y envolver todo el contenido HTML con \u00e9l. Nuestros componentes deber\u00edan tener este aspecto:<\/p>\n<p><strong>Index.vue<\/strong>:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\nimport KinstaLayout from \"..\/Layouts\/KinstaLayout.vue\";\n&lt;\/script&gt;\n\n&lt;template&gt;\n  &lt;KinstaLayout&gt;\n    &lt;section&gt;\n      &lt;h2&gt;Read our latest articles&lt;\/h2&gt;\n      &lt;article&gt;\n        &lt;div&gt;\n          &lt;img src=\"\/images\/kinsta-logo.png\" alt=\"Article thumbnail\" \/&gt;\n        &lt;\/div&gt;\n\n        &lt;h3&gt;Title for the blog&lt;\/h3&gt;\n        &lt;p&gt;\n          Lorem, ipsum dolor sit amet consectetur adipisicing elit. Illum rem\n          itaque error vel perferendis aliquam numquam dignissimos, expedita\n          perspiciatis consectetur!\n        &lt;\/p&gt;\n\n        &lt;a href=\"#\"&gt;Read more&lt;\/a&gt;\n      &lt;\/article&gt;\n    &lt;\/section&gt;\n  &lt;\/KinstaLayout&gt;\n &lt;\/template&gt;<\/code><\/pre>\n<p><strong>Show.vue<\/strong>:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\n import KinstaLayout from \"..\/Layouts\/KinstaLayout.vue\";\n&lt;\/script&gt;\n\n&lt;template&gt;\n  &lt;KinstaLayout&gt;\n    &lt;article&gt;\n      &lt;h1&gt;Title for the blog&lt;\/h1&gt;\n\n      &lt;p&gt;Article content goes here&lt;\/p&gt;\n    &lt;\/article&gt;\n  &lt;\/KinstaLayout&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<h2>Rutas Laravel e Inertia Render<\/h2>\n<p>Primero vamos a utilizar el archivo \u00ab<strong>ArticleFactory<\/strong>\u00bb que tenemos desde el punto de partida de nuestro tutorial y a sembrar algunos art\u00edculos en nuestra base de datos.<\/p>\n<p>\u00abdatabase\/seeders\/<strong>databaseSeeder.php<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace Database\\Seeders;\n\nuse App\\Models\\Article;\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    public function run()\n    {\n        Article::factory(10)-&gt;create();\n    }\n}<\/code><\/pre>\n<p>A continuaci\u00f3n, utiliza el siguiente comando de terminal para migrar tus tablas y sembrar los datos falsos de las factory:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh --seed<\/code><\/pre>\n<p>Esto crear\u00e1 10 art\u00edculos falsos en la base de datos, que tendremos que pasar a nuestra vista utilizando las rutas de Laravel. Ahora que estamos utilizando Inertia para renderizar vistas, la forma en que sol\u00edamos escribir nuestras rutas cambiar\u00e1 ligeramente. Creemos nuestra primera ruta Laravel Inertia en \u00abroutes\/<strong>web.php<\/strong>\u00bb y devolvamos la vista de la p\u00e1gina principal desde \u00ab\/resources\/js\/Pages\/<strong>Index.vue<\/strong>\u00ab.<\/p>\n<p>\u00abroutes\/<strong>web.php<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse App\\Models\\Article;\nuse Illuminate\\Support\\Facades\\Route;\nuse Inertia\\Inertia;\n\nRoute::get('\/', function () {\n    return Inertia::render('Index', [\n        'articles' =&gt; Article::latest()-&gt;get()\n    ]);\n})-&gt;name('home');<\/code><\/pre>\n<p>Observa que hemos importado <code>Inertia<\/code> y no hemos utilizado el ayudante de Laravel <code>view()<\/code> para devolver la vista, sino que hemos utilizado <code>Inertia::render<\/code>. Inertia tambi\u00e9n buscar\u00e1 por defecto el nombre de archivo que mencionamos en nuestra ruta en la carpeta <strong>Pages<\/strong> en \u00abresources\/js\u00bb.<\/p>\n<p>Dir\u00edgete al archivo \u00edndice y establece los datos recuperados como prop y haz un bucle sobre ellos con <code>v-for<\/code> para mostrar los resultados. Entre las etiquetas script, define los datos pasados como prop. Todo lo que Inertia necesita saber es qu\u00e9 tipo de datos esperas, que en nuestro caso es un objeto \u00abarticles\u00bb que contiene una matriz de art\u00edculos.<\/p>\n<p>\u00abresources\/js\/Pages\/<strong>Index.vue<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\nimport KinstaLayout from \"..\/Layouts\/KinstaLayout.vue\";\n\n  defineProps({\n    articles: Object,\n  });\n&lt;\/script&gt;<\/code><\/pre>\n<p>Ten en cuenta que basta con definirlo como prop sin devolverlo porque estamos utilizando el formato <code>setup<\/code> para la API de composici\u00f3n de Vue.js 3. Si utiliz\u00e1ramos la API de opciones, tendr\u00edamos que devolverla.<\/p>\n<p>Hagamos el bucle:<\/p>\n<pre><code class=\"language-html\">&lt;template&gt;\n  &lt;KinstaLayout&gt;\n    &lt;h2&gt;Read our latest articles&lt;\/h2&gt;\n\n    &lt;section&gt;\n      \/\/ Looping over articles\n      &lt;article v-for=\"article in articles\":key=\"article.id\"&gt;\n        &lt;div&gt;\n          &lt;img src=\"\/images\/kinsta-logo.png\" alt=\"Article thumbnail\" \/&gt;\n        &lt;\/div&gt;\n\n        &lt;h3&gt;{{article.title}}&lt;\/h3&gt;\n        &lt;p&gt;{{article.excerpt}}&lt;\/p&gt;\n\n        &lt;a href=\"#\"&gt;Read more&lt;\/a&gt;\n      &lt;\/article&gt;\n    &lt;\/section&gt;\n  &lt;\/KinstaLayout&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<p><code>npm run dev<\/code> (d\u00e9jalo en ejecuci\u00f3n porque estamos utilizando Vite) y <code>php artisan serve<\/code> para iniciar el servidor de desarrollo laravel y acceder a nuestro sitio web, veremos la p\u00e1gina esperada mostrando los diez art\u00edculos de la base de datos.<\/p>\n<p>Ahora, estamos utilizando la extensi\u00f3n <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/vuejs-devtools\/nhdogjmejiglipccpnnnanhbledajbpd?hl=en\">Vue DevTools de Google Chrome<\/a>, que nos permite depurar mi aplicaci\u00f3n. Vamos a mostrarte c\u00f3mo se pasan nuestros datos al componente.<\/p>\n<figure id=\"attachment_134667\" aria-describedby=\"caption-attachment-134667\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134667 size-large\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/inspect-Inertia-passed-data-1024x543.png\" alt=\"Inspeccionando las propiedades de Inertia.\" width=\"1024\" height=\"543\"><figcaption id=\"caption-attachment-134667\" class=\"wp-caption-text\">Inspeccionando las propiedades de Inertia.<\/figcaption><\/figure>\n<p>\u00abarticles\u00bb se pasa al componente como un objeto prop que contiene una matriz de art\u00edculos; cada art\u00edculo de la matriz es tambi\u00e9n un objeto con propiedades que corresponden a los datos que adquiri\u00f3 de la base de datos. Esto significa que cualquier dato que transfiramos de Laravel a Inertia ser\u00e1 tratado como un objeto prop.<\/p>\n<h2>Uso de Tailwind CSS con Inertia.js<\/h2>\n<p>Dado que ya hemos instalado Tailwind en nuestro proyecto en el punto de partida, todo lo que tenemos que hacer es decirle que lea nuestros componentes de Inertia. Esto se puede conseguir editando \u00ab<strong>tailwind.config.js<\/strong>\u00bb de la siguiente manera:<\/p>\n<pre><code class=\"language-js\">\/** @type {import('tailwindcss').Config} *\/\nmodule.exports = {\n  content: [\n    \".\/storage\/framework\/views\/*.php\",\n    \".\/resources\/views\/**\/*.blade.php\",\n    \".\/resources\/js\/**\/*.vue\",\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n};<\/code><\/pre>\n<p>A continuaci\u00f3n, aseg\u00farate de que hemos importado nuestro archivo CSS en \u00abresources\/js\/<strong>app.js<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-js\">import \"..\/css\/app.css\";<\/code><\/pre>\n<p>Y ahora estamos listos para dar estilo a nuestros componentes.<\/p>\n<p>\u00abresources\/js\/Pages\/<strong>Index.vue<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\nimport KinstaLayout from \"..\/Layouts\/KinstaLayout.vue\";\n\n  defineProps({\n    articles: Object,\n  });\n&lt;\/script&gt;\n\n&lt;template&gt;\n &lt;KinstaLayout&gt;\n    &lt;h2 class=\"text-2xl font-bold py-10\"&gt;Read our latest articles&lt;\/h2&gt;\n\n    &lt;section class=\"space-y-5 border-b-2 pb-10\"&gt;\n      &lt;article\n        v-for=\"article in articles\"\n        :key=\"article.id\"\n        class=\"flex justify-center items-center shadow-md bg-white rounded-xl p-4 mx-auto max-w-3xl\"\n      &gt;\n\n         &lt;img\n            src=\"\/images\/kinsta-logo.png\"\n            class=\"w-32 h-32 rounded-xl object-cover\"\n            alt=\"\"\n         \/&gt;\n\n        &lt;div class=\"flex flex-col text-left justify-between pl-3 space-y-5\"&gt;\n          &lt;h3\n            class=\"text-xl font-semibold text-indigo-600 hover:text-indigo-800\"\n          &gt;\n            &lt;a href=\"#\"&gt;{{ article.title }}&lt;\/a&gt;\n          &lt;\/h3&gt;\n          &lt;p&gt;\n           {{ article.excerpt }}\n          &lt;\/p&gt;\n          &lt;a\n            href=\"#\"\n            class=\"text-indigo-600 hover:text-indigo-800 w-fit self-end font-semibold\"\n            &gt;Read more&lt;\/a\n          &gt;\n        &lt;\/div&gt;\n      &lt;\/article&gt;\n    &lt;\/section&gt;\n &lt;\/KinstaLayout&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<p>\u00abresources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;&lt;\/script&gt;\n\n&lt;template&gt;\n    &lt;header\n        class=\"bg-gradient-to-r from-blue-700 via-indigo-700 to-blue-700 w-full text-center py-4\"\n    &gt;\n        &lt;h1 class=\"text-white font-bold text-4xl\"&gt;Kinsta Blog&lt;\/h1&gt;\n    &lt;\/header&gt;\n\n    &lt;main class=\"container mx-auto text-center\"&gt;\n        &lt;slot \/&gt;\n    &lt;\/main&gt;\n\n    &lt;footer\n        class=\"bg-gradient-to-b from-transparent to-gray-300 w-full text-center mt-5 py-10 mx-auto\"\n    &gt;\n        &lt;h2 class=\"font-bold text-xl pb-5\"&gt;Join our Newsletter&lt;\/h2&gt;\n\n        &lt;input\n            class=\"rounded-xl w-80 h-12 px-3 py-2 shadow-md\"\n            type=\"email\"\n            placeholder=\"Write your email..\"\n        \/&gt;\n    &lt;\/footer&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<p>Si miras el navegador, ver\u00e1s que Vite ya ha actualizado la p\u00e1gina con la magia de Tailwind.<\/p>\n<figure id=\"attachment_134669\" aria-describedby=\"caption-attachment-134669\" style=\"width: 911px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134669 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/kinsta-laravel-inertiajs-blog.gif\" alt=\"Renderizando las propiedades de Inertia.\" width=\"911\" height=\"620\"><figcaption id=\"caption-attachment-134669\" class=\"wp-caption-text\">Renderizando las propiedades de Inertia.<\/figcaption><\/figure>\n<h2>Enlaces de Inertia<\/h2>\n<p>Ahora que tenemos una p\u00e1gina de inicio que funciona y que puede mostrar todos los art\u00edculos de la base de datos, necesitamos crear otra ruta para mostrar art\u00edculos individuales. Creemos una nueva ruta y establezcamos la URL con un comod\u00edn \u00abid\u00bb:<\/p>\n<p>\u00abroutes\/<strong>web.php<\/strong>\u00bb<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse App\\Models\\Article;\nuse Illuminate\\Support\\Facades\\Route;\nuse Inertia\\Inertia;\n\nRoute::get('\/', function () {\n    return Inertia::render('Index', [\n        'articles' =&gt; Article::latest()-&gt;get()\n    ]);\n})-&gt;name('home');\n\nRoute::get('\/posts\/{article:id}', function (Article $article) {\n    return Inertia::render('Show', [\n        'article' =&gt; $article\n    ]);\n})-&gt;name('article.show');<\/code><\/pre>\n<p>Importamos el modelo \u00abArt\u00edculo\u00bb y a\u00f1adimos una nueva ruta para devolver el componente <strong>Show.vue<\/strong> Inertia. Tambi\u00e9n aprovechamos <a href=\"https:\/\/laravel.com\/docs\/master\/routing#customizing-the-key\">la vinculaci\u00f3n del modelo de rutas de Laravel<\/a>, que permite a Laravel obtener autom\u00e1ticamente el art\u00edculo al que nos referimos.<\/p>\n<p>Todo lo que necesitamos ahora es una forma de visitar esta ruta haciendo clic en un enlace de la p\u00e1gina principal sin tener que recargar toda la p\u00e1gina. Esto es posible con la herramienta m\u00e1gica de Inertia <code>&lt;Link&gt;<\/code>. Hemos mencionado en la introducci\u00f3n que Inertia utiliza <code>&lt;Link&gt;<\/code> como envoltorio de una etiqueta de anclaje est\u00e1ndar <code>&lt;a&gt;<\/code>, y que este envoltorio est\u00e1 pensado para que las visitas a la p\u00e1gina sean lo m\u00e1s fluidas posible. En Inertia, la etiqueta <code>&lt;Link&gt;<\/code> puede comportarse como una etiqueta de anclaje que realiza peticiones <code>&lt;GET&gt;<\/code>, pero tambi\u00e9n puede actuar como una <code>&lt;button&gt;<\/code> y una <code>&lt;form&gt;<\/code> al mismo tiempo. Veamos c\u00f3mo podemos aplicarlo a nuestro proyecto.<\/p>\n<p>En nuestro Index.vue, importaremos <code>&lt;Link&gt;<\/code> de Inertia, y eliminaremos las etiquetas de anclaje <code>&lt;a&gt;<\/code> y las sustituiremos por etiquetas <code>&lt;Link&gt;<\/code> de Inertia. El atributo <code>href<\/code> se establecer\u00e1 en la URL de la ruta que hicimos anteriormente para ver el art\u00edculo:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\nimport KinstaLayout from \"..\/Layouts\/KinstaLayout.vue\";\nimport { Link } from \"@inertiajs\/inertia-vue3\";\n\ndefineProps({\n    articles: Object,\n});\n&lt;\/script&gt;\n\n&lt;template&gt;\n    &lt;KinstaLayout&gt;\n        &lt;section class=\"space-y-5 border-b-2 pb-10\"&gt;\n            &lt;h2 class=\"text-2xl font-bold pt-10 mx-auto text-center\"&gt;\n                Read our latest articles\n            &lt;\/h2&gt;\n\n            &lt;article\n                v-for=\"article in articles\"\n                :key=\"article.id\"\n                class=\"flex justify-center items-center shadow-md bg-white rounded-xl p-4 mx-auto max-w-3xl\"\n            &gt;\n                &lt;img\n                    src=\"\/images\/kinsta-logo.png\"\n                    class=\"w-32 h-32 rounded-xl object-cover\"\n                    alt=\"\"\n                \/&gt;\n\n                &lt;div\n                    class=\"flex flex-col text-left justify-between pl-3 space-y-5\"\n                &gt;\n                    &lt;h3\n                        class=\"text-xl font-semibold text-indigo-600 hover:text-indigo-800\"\n                    &gt;\n                        &lt;Link :href=\"'\/posts\/' + article.id\"&gt;{{\n                            article.title\n                        }}&lt;\/Link&gt;\n                    &lt;\/h3&gt;\n                    &lt;p&gt;\n                        {{ article.excerpt }}\n                    &lt;\/p&gt;\n                    &lt;Link\n                        :href=\"'\/posts\/' + article.id\"\n                        class=\"text-indigo-600 hover:text-indigo-800 w-fit self-end font-semibold\"\n                        &gt;Read more\n                    &lt;\/Link&gt;\n                &lt;\/div&gt;\n            &lt;\/article&gt;\n        &lt;\/section&gt;\n    &lt;\/KinstaLayout&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<p>Estilicemos <strong>Show.vue<\/strong> con Tailwind para que parezca un poco m\u00e1s arreglado y listo para nuestra visita. Y tambi\u00e9n tenemos que hacerle saber que debe esperar un objeto \u00abArt\u00edculo\u00bb y establecerlo como prop:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\nimport KinstaLayout from \"..\/Layouts\/KinstaLayout.vue\";\n\ndefineProps({\n    article: Object,\n});\n&lt;\/script&gt;\n\n&lt;template&gt;\n    &lt;KinstaLayout&gt;\n        &lt;article class=\"mx-auto mt-10 flex justify-center max-w-5xl border-b-2\"&gt;\n            &lt;img\n                src=\"\/images\/kinsta-logo.png\"\n                class=\"w-80 h-80 rounded-xl mx-auto py-5\"\n                alt=\"\"\n            \/&gt;\n            &lt;div class=\"text-left flex flex-col pt-5 pb-10 px-10\"&gt;\n                &lt;h1 class=\"text-xl font-semibold mb-10\"&gt;{{ article.title }}&lt;\/h1&gt;\n                &lt;p&gt;{{ article.body }}&lt;\/p&gt;\n            &lt;\/div&gt;\n        &lt;\/article&gt;\n    &lt;\/KinstaLayout&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<p>Ahora, cuando hagamos clic en el t\u00edtulo del art\u00edculo o en \u00abRead more\u00bb, seremos transportados m\u00e1gicamente a <strong>Show.vue<\/strong> sin actualizar la p\u00e1gina.<\/p>\n<figure id=\"attachment_134671\" aria-describedby=\"caption-attachment-134671\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134671 size-large\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/kinsta-laravel-inertiajs-Link-1024x596.gif\" alt=\"Enlaces de Inertia en su sitio.\" width=\"1024\" height=\"596\"><figcaption id=\"caption-attachment-134671\" class=\"wp-caption-text\">Enlaces de Inertia en su sitio.<\/figcaption><\/figure>\n<p>En nuestro caso, estamos utilizando <code>&lt;Link&gt;<\/code> como etiqueta de anclaje que env\u00eda una petici\u00f3n <code>GET<\/code> a la ruta y devuelve los nuevos datos, pero podemos utilizar <code>&lt;Link&gt;<\/code> para tambi\u00e9n <code>POST<\/code>, <code>PUT<\/code>, <code>PATCH<\/code> y <code>DELETE<\/code><\/p>\n<p>\u00abroutes\/<strong>web.php<\/strong>\u00ab:<\/p>\n<pre><code class=\"language-html\">&lt;Link href=\"\/logout\" method=\"post\" as=\"button\" type=\"button\"&gt;Logout&lt;\/Link&gt;<\/code><\/pre>\n<h2>Trucos y consejos de Laravel Inertia que debes conocer<\/h2>\n<p>Ya tenemos una SPA funcional construida con Laravel, Inertia y Tailwind CSS. Pero Inertia puede ayudarnos a conseguir mucho m\u00e1s. Es hora de adquirir algunas t\u00e9cnicas de Inertia que ayudar\u00e1n tanto a los desarrolladores como a los visitantes de la aplicaci\u00f3n.<\/p>\n<h3>Generar URLs<\/h3>\n<p>Te habr\u00e1s dado cuenta de que hemos estado a\u00f1adiendo nombres a nuestras rutas Laravel sin utilizarlas. Inertia nos permite utilizar nuestras rutas con nombre dentro de nuestros componentes en lugar de escribir manualmente la ruta completa.<\/p>\n<p>Podemos conseguirlo <a href=\"https:\/\/github.com\/tighten\/ziggy#installation\">instalando el paquete Ziggy<\/a> en nuestro proyecto:<\/p>\n<pre><code class=\"language-bash\">composer require tightenco\/ziggy<\/code><\/pre>\n<p>A continuaci\u00f3n, dir\u00edgete a \u00abresources\/js\/app.js\u00bb y actual\u00edzalo de la siguiente manera:<\/p>\n<pre><code class=\"language-js\">import \".\/bootstrap\";\nimport \"..\/css\/app.css\";\n\nimport { createApp, h } from \"vue\";\nimport { createInertiaApp } from \"@inertiajs\/inertia-vue3\";\nimport { resolvePageComponent } from \"laravel-vite-plugin\/inertia-helpers\";\nimport { ZiggyVue } from \"..\/..\/vendor\/tightenco\/ziggy\/dist\/vue.m\";\n\ncreateInertiaApp({\n    title: (title) =&gt; `${title} - ${appName}`,\n    resolve: (name) =&gt;\n        resolvePageComponent(\n            `.\/Pages\/${name}.vue`,\n            import.meta.glob(\".\/Pages\/**\/*.vue\")\n        ),\n    setup({ el, app, props, plugin }) {\n        return createApp({ render: () =&gt; h(app, props) })\n            .use(plugin)\n            .use(ZiggyVue, Ziggy)\n            .mount(el);\n    },\n});<\/code><\/pre>\n<p>Dir\u00edgete a \u00ab\/resources\/views\/<strong>app.blade.php<\/strong>\u00bb y actualiza la cabecera con la directiva <code>@routes<\/code>:<\/p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"{{ str_replace('_', '-', app()-&gt;getLocale()) }}\"&gt;\n\n&lt;head&gt;\n    &lt;meta charset=\"utf-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"&gt;\n\n    <!-- Fetch project name dynamically -->\n    &lt;title inertia&gt;{{ config('app.name', 'Laravel') }}&lt;\/title&gt;\n\n    <!-- Scripts -->\n    @routes\n    @vite('resources\/js\/app.js')\n    @inertiaHead\n&lt;\/head&gt;\n\n&lt;body class=\"font-sans antialiased\"&gt;\n    @inertia\n&lt;\/body&gt;\n\n&lt;\/html&gt;<\/code><\/pre>\n<p>&#8230;y actualiza tus paquetes NPM pulsando los dos comandos de terminal siguientes:<\/p>\n<pre><code class=\"language-bash\">npm install && npm run dev<\/code><\/pre>\n<p>Este paquete nos permite utilizar rutas con nombre dentro de nuestros componentes Inertia, as\u00ed que dirij\u00e1monos a <strong>Index.vue<\/strong> y eliminaremos la antigua ruta manual y la sustituiremos por el nombre de la ruta mientras pasamos los datos normalmente como si estuvi\u00e9ramos en nuestro controlador.<\/p>\n<p>Reemplazaremos esto<\/p>\n<pre><code class=\"language-html\">&lt;Link :href=\"'\/posts\/' + article.id\"&gt;\n   {{ article.title }}\n&lt;\/Link&gt;<\/code><\/pre>\n<p>&#8230;por esto:<\/p>\n<pre><code class=\"language-html\">&lt;Link :href=\"route('article.show', article.id)\"&gt;\n   {{ article.title }}\n&lt;\/Link&gt;<\/code><\/pre>\n<p>Esto nos dar\u00e1 exactamente el mismo comportamiento que ten\u00edamos, pero es m\u00e1s amigable para el desarrollador y extremadamente \u00fatil cuando tu ruta espera muchos par\u00e1metros.<\/p>\n<h3>Indicadores de progreso<\/h3>\n<p>Esta es una de las caracter\u00edsticas m\u00e1s agradables de Inertia.js; dado que SPA proporciona una experiencia de usuario interactiva, disponer de informaci\u00f3n constante sobre si una solicitud se est\u00e1 cargando ser\u00eda una fant\u00e1stica adici\u00f3n a la aplicaci\u00f3n. Esto puede conseguirse mediante una biblioteca independiente que ofrece Inertia.<\/p>\n<p>La biblioteca \u00ab@inertiajs\/progress\u00bb es una envoltura alrededor de <a href=\"https:\/\/ricostacruz.com\/nprogress\/\">NProgress<\/a> que muestra condicionalmente los indicadores de carga seg\u00fan los eventos de Inertia. Realmente no necesitas saber c\u00f3mo funciona esto entre bastidores, as\u00ed que vamos a ponerlo en marcha.<\/p>\n<p>Podemos instalar esta biblioteca con el siguiente comando de terminal:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/progress<\/code><\/pre>\n<p>Una vez instalada, tenemos que importarla en \u00ab<strong>resources\/js\/app.js<\/strong>\u00bb<\/p>\n<pre><code class=\"language-js\">import \".\/bootstrap\";\nimport \"..\/css\/app.css\";\n\nimport { createApp, h } from \"vue\";\nimport { createInertiaApp } from \"@inertiajs\/inertia-vue3\";\nimport { resolvePageComponent } from \"laravel-vite-plugin\/inertia-helpers\";\nimport { ZiggyVue } from \"..\/..\/vendor\/tightenco\/ziggy\/dist\/vue.m\";\nimport { InertiaProgress } from \"@inertiajs\/progress\";\n\ncreateInertiaApp({\n    title: (title) =&gt; `${title} - ${appName}`,\n    resolve: (name) =&gt;\n        resolvePageComponent(\n            `.\/Pages\/${name}.vue`,\n            import.meta.glob(\".\/Pages\/**\/*.vue\")\n        ),\n    setup({ el, app, props, plugin }) {\n        return createApp({ render: () =&gt; h(app, props) })\n            .use(plugin)\n            .use(ZiggyVue, Ziggy)\n            .mount(el);\n    },\n});\n\nInertiaProgress.init({ color: \"#000000\", showSpinner: true });<\/code><\/pre>\n<p>Esto mostrar\u00e1 una barra de carga y un spinner de carga en color negro, pero podemos cambiar el color junto con otras opciones \u00fatiles que se pueden encontrar en <a href=\"https:\/\/inertiajs.com\/progress-indicators\">la documentaci\u00f3n del indicador de progreso Inertia.js<\/a>.<\/p>\n<figure id=\"attachment_134672\" aria-describedby=\"caption-attachment-134672\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134672 size-large\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Inertia-progress-indicator-1024x83.gif\" alt=\"El indicador de progreso de Inertia (arriba a la derecha).\" width=\"1024\" height=\"83\"><figcaption id=\"caption-attachment-134672\" class=\"wp-caption-text\">El indicador de progreso de Inertia (arriba a la derecha).<\/figcaption><\/figure>\n<h3>Gesti\u00f3n del desplazamiento<\/h3>\n<p>En algunos casos, puede que quieras navegar a una nueva p\u00e1gina manteniendo la misma posici\u00f3n de desplazamiento. Quiz\u00e1 lo necesites si permites a los usuarios dejar comentarios; esto enviar\u00e1 un formulario y cargar\u00e1 el nuevo comentario desde la base de datos a tu componente; querr\u00e1s que esto ocurra sin que el usuario pierda la posici\u00f3n de desplazamiento. Inertia se encarga de esto por nosotros.<\/p>\n<p>En nuestro caso, vamos a aplicarlo a nuestra etiqueta <code>&lt;Link&gt;<\/code> en <strong>Index.vue<\/strong>. Para conservar la posici\u00f3n de desplazamiento al redirigir a una p\u00e1gina diferente con <code>&lt;Link&gt;<\/code> de Inertia, lo \u00fanico que tenemos que hacer es a\u00f1adir el atributo <code>preserve-scroll<\/code> a la etiqueta <code>&lt;Link&gt;<\/code>:<\/p>\n<pre><code class=\"language-html\">&lt;Link :href=\"route('article.show', article.id)\" preserve-scroll&gt;\n  {{ article.title }}\n&lt;\/Link&gt;<\/code><\/pre>\n<h2>Consejos SEO<\/h2>\n<p>Desde el nacimiento de las SPA, la gente se ha preocupado por la optimizaci\u00f3n para motores de b\u00fasqueda (SEO). Se sabe que si utilizas el enfoque SPA, los motores de b\u00fasqueda tendr\u00e1n dificultades para rastrear tu aplicaci\u00f3n web porque todo se renderiza en el lado del cliente, lo que hace que tu sitio web no aparezca en los primeros resultados de b\u00fasqueda; sin embargo, \u00bfc\u00f3mo es que plataformas tan populares como Facebook y Github son ahora SPA y siguen funcionando bien en SEO?<\/p>\n<p>Bueno, esto ya no es una misi\u00f3n imposible. Inertia ofrece algunas soluciones para ayudar a que tu SPA sea amigable con el SEO.<\/p>\n<h3>Inertia Vue SSR con Laravel y Vite<\/h3>\n<p>Los motores de b\u00fasqueda siempre buscan HTML en tu sitio web para identificar el contenido; sin embargo, si no tienes HTML en tus URL, este trabajo se hace m\u00e1s dif\u00edcil. Cuando desarrollas SPAs, todo lo que tienes en tu p\u00e1gina es JavaScript y JSON. Inertia introdujo una funci\u00f3n de renderizado del lado del servidor (SSR) que puedes a\u00f1adir a tu aplicaci\u00f3n. Esto permite a tu aplicaci\u00f3n pre-renderizar una visita inicial a la p\u00e1gina en el servidor y luego enviar el HTML renderizado al navegador. Esto permite a los usuarios ver e interactuar con tus p\u00e1ginas antes de que se carguen completamente, y tambi\u00e9n tiene otras ventajas, como acortar el tiempo que tardan los motores de b\u00fasqueda en indexar tu sitio.<\/p>\n<p>Para resumir c\u00f3mo funciona, Inertia identificar\u00e1 si se est\u00e1 ejecutando en un servidor Node.js y renderizar\u00e1 en HTML los nombres de los componentes, las propiedades, la URL y la versi\u00f3n de los activos. Esto proporcionar\u00e1 al usuario y al motor de b\u00fasqueda pr\u00e1cticamente todo lo que tu p\u00e1gina tiene que ofrecer.<\/p>\n<p>Sin embargo, como estamos tratando con Laravel, esto no tiene mucho sentido porque Laravel es un framework PHP y no se ejecuta en un servidor Node.js. Por lo tanto, reenviaremos la petici\u00f3n a un servicio Node.js, que renderizar\u00e1 la p\u00e1gina y devolver\u00e1 HTML. Esto har\u00e1 que nuestra aplicaci\u00f3n Laravel Vue sea SEO friendly por defecto.<\/p>\n<p>En primer lugar, tenemos que instalar el paquete npm Vue.js SSR:<\/p>\n<pre><code class=\"language-bash\">npm install @vue\/server-renderer<\/code><\/pre>\n<p>Otro \u00fatil paquete \u00abNPM\u00bb de Inertia proporciona un sencillo servidor \u00abHTTP\u00bb. Se recomienda encarecidamente que lo instales:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/server<\/code><\/pre>\n<p>A continuaci\u00f3n, en \u00abresources\/js\/\u00bb, a\u00f1adiremos un nuevo archivo llamado <strong>ssr.js<\/strong>. Este archivo ser\u00e1 muy similar al archivo <strong>app.js<\/strong> que creamos al instalar Inertia, s\u00f3lo que se ejecutar\u00e1 en Node.js en lugar de en el navegador:<\/p>\n<pre><code class=\"language-js\">import { createSSRApp, h } from \"vue\";\nimport { renderToString } from \"@vue\/server-renderer\";\nimport { createInertiaApp } from \"@inertiajs\/inertia-vue3\";\nimport createServer from \"@inertiajs\/server\";\nimport { resolvePageComponent } from \"laravel-vite-plugin\/inertia-helpers\";\nimport { ZiggyVue } from \"..\/..\/vendor\/tightenco\/ziggy\/dist\/vue.m\";\n\nconst appName = \"Laravel\";\n\ncreateServer((page) =&gt;\n    createInertiaApp({\n        page,\n        render: renderToString,\n        title: (title) =&gt; `${title} - ${appName}`,\n        resolve: (name) =&gt;\n            resolvePageComponent(\n                `.\/Pages\/${name}.vue`,\n                import.meta.glob(\".\/Pages\/**\/*.vue\")\n            ),\n        setup({ app, props, plugin }) {\n            return createSSRApp({ render: () =&gt; h(app, props) })\n                .use(plugin)\n                .use(ZiggyVue, {\n                    ...page.props.ziggy,\n                    location: new URL(page.props.ziggy.location),\n                });\n        },\n    })\n);<\/code><\/pre>\n<p>Aseg\u00farate de no incluir todo en el archivo <strong>ssr.js<\/strong>, ya que no ser\u00e1 visible para los visitantes; este archivo es s\u00f3lo para que los motores de b\u00fasqueda y los navegadores muestren los datos dentro de tu p\u00e1gina, as\u00ed que incluye s\u00f3lo lo que sea importante para tus datos o s\u00f3lo lo que haga que tus datos est\u00e9n disponibles.<\/p>\n<p>\u00abPor defecto, el servidor SSR de Inertia funcionar\u00e1 en el puerto 13714. Sin embargo, puedes cambiar esto proporcionando un segundo argumento al m\u00e9todo createServer\u00bb. Inertia DOCss.<\/p>\n<p>Los DOCs de Inertia.js no explican c\u00f3mo integrar el SSR de Inertia con Vite, pero lo haremos ahora. Dir\u00edgete a <strong>vite.config.js<\/strong> y pega lo siguiente:<\/p>\n<pre><code class=\"language-js\">import { defineConfig } from \"vite\";\nimport laravel from \"laravel-vite-plugin\";\nimport vue from \"@vitejs\/plugin-vue\";\n\nexport default defineConfig({\n    plugins: [\n        laravel({\n            input: \"resources\/js\/app.js\",\n            ssr: \"resources\/js\/ssr.js\",\n        }),\n        vue({\n            template: {\n                transformAssetUrls: {\n                    base: null,\n                    includeAbsolute: false,\n                },\n            },\n        }),\n    ],\n});<\/code><\/pre>\n<p>A continuaci\u00f3n, dir\u00edgete a <strong>package.json<\/strong> y cambia el script de compilaci\u00f3n:<\/p>\n<pre><code class=\"language-json\">\"build\": \"vite build && vite build --ssr\"<\/code><\/pre>\n<p>Ahora, si ejecutamos <code>npm run build<\/code>, Vite construir\u00e1 nuestro paquete SSR para producci\u00f3n. Para m\u00e1s informaci\u00f3n sobre esto puedes visitar <a href=\"https:\/\/inertiajs.com\/server-side-rendering\">Inertia SSR DOCs<\/a> y <a href=\"https:\/\/laravel-vite.dev\/guide\/features\/ssr.html#building\">Vite SSR DOCs<\/a>.<\/p>\n<h3>T\u00edtulo y Meta<\/h3>\n<p>Dado que las aplicaciones JavaScript se renderizan dentro del <code>&lt;body&gt;<\/code> del documento, no pueden renderizar marcas en el <code>&lt;head&gt;<\/code> del documento porque est\u00e1n fuera de su alcance. Inertia tiene un componente <code>&lt;Head&gt;<\/code> que puede utilizarse para establecer la p\u00e1gina <code>&lt;title&gt;<\/code>, las etiquetas <code>&lt;meta&gt;<\/code> y otros componentes <code>&lt;head&gt;<\/code>.<\/p>\n<p>Para a\u00f1adir el elemento <code>&lt;head&gt;<\/code> a tu p\u00e1gina, debemos importar <code>&lt;Head&gt;<\/code> de Inertia igual que hicimos con el componente <code>&lt;Link&gt;<\/code>:<\/p>\n<pre><code class=\"language-js\">import { Head } from '@inertiajs\/inertia-vue3'\n\n&lt;Head&gt;\n  &lt;title&gt;Kinsta Blog&lt;\/title&gt;\n  &lt;meta name=\"description\" content=\"Kinsta blog for developers\"&gt;\n&lt;\/Head&gt;<\/code><\/pre>\n<p>Tambi\u00e9n podemos a\u00f1adir un t\u00edtulo global para todas las p\u00e1ginas, esto a\u00f1adir\u00e1 el nombre de tu aplicaci\u00f3n junto al t\u00edtulo en todas las p\u00e1ginas. Ya lo hemos hecho en el archivo <strong>app.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">createInertiaApp({\n    title: (title) =&gt; `${title} - ${appName}`,\n    \/\/\n});<\/code><\/pre>\n<p>Lo que significa que si a\u00f1adimos <code>&lt;Head title=\"Home\"&gt;<\/code> en la p\u00e1gina principal de nuestra aplicaci\u00f3n con un t\u00edtulo, \u00e9ste se mostrar\u00e1 as\u00ed: <code>&lt;title&gt;Home - My App&lt;\/title&gt;<\/code>.<\/p>\n<h3>Monitorizar tu aplicaci\u00f3n<\/h3>\n<p>La velocidad es uno de los factores m\u00e1s importantes para optimizar el rendimiento SEO de tu sitio web. Si utilizas WordPress para tu sitio web, por esta raz\u00f3n, <a href=\"https:\/\/kinsta.com\/es\/herramienta-apm\/\">Kinsta APM<\/a> te ayudar\u00e1 a monitorizar y vigilar de cerca tu aplicaci\u00f3n en acci\u00f3n. Te ayuda a identificar los problemas de rendimiento de WordPress y est\u00e1 disponible de forma gratuita para todos los sitios alojados en Kinsta.<\/p>\n<h2>Resumen<\/h2>\n<p>Inertia.js es una de las tecnolog\u00edas m\u00e1s significativas disponibles; m\u00e9zclala con Laravel y tendr\u00e1s una moderna aplicaci\u00f3n de una sola p\u00e1gina construida con PHP y JavaScript. Taylor Otwell, el creador de Laravel, est\u00e1 tan interesado en Inertia que Laravel ha lanzado sus kits de inicio m\u00e1s populares, Laravel Breeze y Jetstream, con soporte para Inertia y SSR.<br \/>\n<br \/>\nSi eres un fan de Laravel o un desarrollador profesional, Inertia.js sin duda te llamar\u00e1 la atenci\u00f3n. En este tutorial, hemos creado un blog muy b\u00e1sico y sencillo en s\u00f3lo unos minutos. Todav\u00eda hay mucho que aprender sobre Inertia, y \u00e9ste puede ser s\u00f3lo el primero de muchos art\u00edculos y tutoriales.<\/p>\n<p>\u00bfQu\u00e9 m\u00e1s te gustar\u00eda que explor\u00e1ramos sobre Laravel? H\u00e1znoslo saber en la secci\u00f3n de comentarios m\u00e1s abajo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las aplicaciones multip\u00e1gina (MPA &#8211; Multi-Page App en ingl\u00e9s) son cada d\u00eda menos populares. Plataformas famosas como Facebook, Twitter, YouTube, Github y muchas otras ya utilizan &#8230;<\/p>\n","protected":false},"author":266,"featured_media":60939,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[1200,867,766,1093,1218],"topic":[1303],"class_list":["post-60764","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-inertia-js","tag-javascript","tag-laravel","tag-php-frameworks","tag-spa","topic-laravel"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel<\/title>\n<meta name=\"description\" content=\"En este art\u00edculo, exploraremos c\u00f3mo utilizar Inertia.js junto con Laravel, Vue y Tailwind CSS para crear una aplicaci\u00f3n web moderna.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel\" \/>\n<meta property=\"og:description\" content=\"En este art\u00edculo, exploraremos c\u00f3mo utilizar Inertia.js junto con Laravel, Vue y Tailwind CSS para crear una aplicaci\u00f3n web moderna.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-12T15:02:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-17T13:41:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Mostafa Said\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"En este art\u00edculo, exploraremos c\u00f3mo utilizar Inertia.js junto con Laravel, Vue y Tailwind CSS para crear una aplicaci\u00f3n web moderna.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mostafa Said\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/\"},\"author\":{\"name\":\"Mostafa Said\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\"},\"headline\":\"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel\",\"datePublished\":\"2022-12-12T15:02:16+00:00\",\"dateModified\":\"2025-01-17T13:41:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/\"},\"wordCount\":4335,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png\",\"keywords\":[\"inertia.js\",\"JavaScript\",\"laravel\",\"php frameworks\",\"spa\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/\",\"name\":\"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png\",\"datePublished\":\"2022-12-12T15:02:16+00:00\",\"dateModified\":\"2025-01-17T13:41:31+00:00\",\"description\":\"En este art\u00edculo, exploraremos c\u00f3mo utilizar Inertia.js junto con Laravel, Vue y Tailwind CSS para crear una aplicaci\u00f3n web moderna.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png\",\"width\":1460,\"height\":730,\"caption\":\"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\",\"name\":\"Mostafa Said\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/96bb303b019e8ddbdbaea885a36fee51?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/96bb303b019e8ddbdbaea885a36fee51?s=96&d=mm&r=g\",\"caption\":\"Mostafa Said\"},\"description\":\"I\u2019m Mostafa, a full-stack developer with a knack for all things Laravel, Inertia, and JavaScript frameworks. When I'm not coding, you can find me sharing my knowledge through tutorials, diving into hackathons (and winning a few), and spreading the love for tech by teaching what I've learned.\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/mostafasaid\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel","description":"En este art\u00edculo, exploraremos c\u00f3mo utilizar Inertia.js junto con Laravel, Vue y Tailwind CSS para crear una aplicaci\u00f3n web moderna.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel","og_description":"En este art\u00edculo, exploraremos c\u00f3mo utilizar Inertia.js junto con Laravel, Vue y Tailwind CSS para crear una aplicaci\u00f3n web moderna.","og_url":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2022-12-12T15:02:16+00:00","article_modified_time":"2025-01-17T13:41:31+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png","type":"image\/png"}],"author":"Mostafa Said","twitter_card":"summary_large_image","twitter_description":"En este art\u00edculo, exploraremos c\u00f3mo utilizar Inertia.js junto con Laravel, Vue y Tailwind CSS para crear una aplicaci\u00f3n web moderna.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png","twitter_creator":"@Kinsta_ES","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Mostafa Said","Tiempo de lectura":"24 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/"},"author":{"name":"Mostafa Said","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996"},"headline":"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel","datePublished":"2022-12-12T15:02:16+00:00","dateModified":"2025-01-17T13:41:31+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/"},"wordCount":4335,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png","keywords":["inertia.js","JavaScript","laravel","php frameworks","spa"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/","url":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/","name":"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png","datePublished":"2022-12-12T15:02:16+00:00","dateModified":"2025-01-17T13:41:31+00:00","description":"En este art\u00edculo, exploraremos c\u00f3mo utilizar Inertia.js junto con Laravel, Vue y Tailwind CSS para crear una aplicaci\u00f3n web moderna.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/12\/laravel-inertia-1.png","width":1460,"height":730,"caption":"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/laravel-inertia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/es\/secciones\/laravel\/"},{"@type":"ListItem","position":3,"name":"C\u00f3mo Usar Inertia.js en Tus Proyectos Laravel"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996","name":"Mostafa Said","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/96bb303b019e8ddbdbaea885a36fee51?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/96bb303b019e8ddbdbaea885a36fee51?s=96&d=mm&r=g","caption":"Mostafa Said"},"description":"I\u2019m Mostafa, a full-stack developer with a knack for all things Laravel, Inertia, and JavaScript frameworks. When I'm not coding, you can find me sharing my knowledge through tutorials, diving into hackathons (and winning a few), and spreading the love for tech by teaching what I've learned.","url":"https:\/\/kinsta.com\/es\/blog\/author\/mostafasaid\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/60764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/266"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=60764"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/60764\/revisions"}],"predecessor-version":[{"id":65568,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/60764\/revisions\/65568"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/translations\/dk"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/60764\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/60939"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=60764"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=60764"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=60764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}