{"id":55644,"date":"2022-12-12T12:19:47","date_gmt":"2022-12-12T15:19:47","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=55644&#038;preview=true&#038;preview_id=55644"},"modified":"2023-08-22T03:40:07","modified_gmt":"2023-08-22T06:40:07","slug":"laravel-inertia","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/","title":{"rendered":"Como usar o Inertia.js em seus projetos Laravel"},"content":{"rendered":"<p>Os aplicativos de v\u00e1rias p\u00e1ginas (MPAs) est\u00e3o ficando menos populares a cada dia. Plataformas famosas como Facebook, Twitter, YouTube, Github, e muitas outras j\u00e1 est\u00e3o usando a tecnologia de aplicativos de uma p\u00e1gina (SPA).<\/p>\n<p>Essa tecnologia popular permite que os usu\u00e1rios interajam com aplicativos web de maneira r\u00e1pida e responsiva, porque tudo \u00e9 renderizado do lado do cliente. No entanto, pode ser um problema para os desenvolvedores que constroem aplicativos renderizadas do lado do servidor com frameworks como Laravel ou Django.<\/p>\n<p>Felizmente, o Inertia.js entrou em cena para simplificar.<\/p>\n\n<p>Neste artigo, mostraremos como voc\u00ea pode come\u00e7ar a usar o Inertia.js e como us\u00e1-lo com Laravel, Vue.js e Tailwind CSS para criar um moderno aplicativo web de blog. Tamb\u00e9m compartilharemos como tornar os SPAs mais amig\u00e1veis em termos de SEO, bem como alguns outros truques.<\/p>\n<p>Se voc\u00ea est\u00e1 apenas come\u00e7ando com Laravel, recomendamos que voc\u00ea leia <a href=\"https:\/\/kinsta.com\/pt\/blog\/desenvolvedor-laravel\/\">este artigo primeiro<\/a> para que voc\u00ea esteja preparado para come\u00e7ar.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Por que SPA?<\/h2>\n<p>Antes de perguntarmos por que devemos usar o Inertia, devemos primeiro perguntar: \u201cPor que SPA?\u201d<\/p>\n<p>Por que algu\u00e9m preferiria aplicativos renderizados do lado do cliente em vez dos tradicionais aplicativos do lado do servidor? O que levaria um desenvolvedor full-stack do Laravel a dizer adeus aos <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-laravel\/#templating\">componentes blade<\/a>?<\/p>\n<p>A resposta b\u00e1sica \u00e9: porque velocidade e capacidade de resposta s\u00e3o essenciais para qualquer engajamento bem-sucedido do usu\u00e1rio.<\/p>\n<p>No caso de MPAs, o navegador envia constantemente pedidos ao backend, que ent\u00e3o executa in\u00fameras consultas ao banco de dados. Depois que o banco de dados e o servidor processam as consultas e as entregam ao navegador, a p\u00e1gina \u00e9 renderizada.<\/p>\n<p>Mas os SPAs s\u00e3o diferentes. O aplicativo traz tudo que o usu\u00e1rio precisaria diretamente para a p\u00e1gina, eliminando a necessidade do navegador enviar consultas ou recarregar a p\u00e1gina para renderizar novos elementos HTML.<\/p>\n<p>Devido a esta experi\u00eancia \u00fanica do usu\u00e1rio, grandes empresas est\u00e3o clamando para que seus sites se tornem aplicativos de uma \u00fanica p\u00e1gina.<\/p>\n<p>Dito isso, criar um aplicativo de p\u00e1gina \u00fanica pode ser dif\u00edcil para os desenvolvedores de Laravel porque seria necess\u00e1rio que eles come\u00e7assem a usar Vue.js ou React em vez de modelos de blade, resultando na perda de muitas ferramentas \u00fateis do Laravel que economizam tempo e esfor\u00e7o.<\/p>\n<p>Agora que temos o Inertia.js, tudo isso mudou.<\/p>\n<h2>Por que Inertia?<\/h2>\n<p>Caso os desenvolvedores do Laravel fossem criar SPAs da web com o Vue antes do Inertia, eles teriam que configurar APIs e retornar dados JSON com o Laravel, depois usar algo como AXIOS para recuperar os dados nos componentes Vue. Eles tamb\u00e9m precisariam de algo como o Vue Router para gerenciar rotas, o que significaria perder o roteamento do Laravel, bem como middlewares e controladores.<\/p>\n<p>Por outro lado, o Inertia.js permite que os desenvolvedores criem aplicativos modernos de p\u00e1gina \u00fanica com Vue, React e Svelte usando o roteamento e os controladores cl\u00e1ssicos do lado do servidor. O Inertia foi projetado para desenvolvedores do Laravel, Ruby on Rails e Django, permitindo que eles construam aplicativos sem mudar suas t\u00e9cnicas de codifica\u00e7\u00e3o para criar controladores, buscar dados de um banco de dados e renderizar visualiza\u00e7\u00f5es.<\/p>\n<p>Gra\u00e7as ao Inertia.js, os desenvolvedores de Laravel se sentir\u00e3o em casa.<\/p>\n<h2>Como funciona o Inertia<\/h2>\n<p>Construir SPA somente com Laravel e Vue lhe dar\u00e1 uma p\u00e1gina JavaScript completa para o seu frontend, mas isso n\u00e3o lhe proporcionar\u00e1 uma experi\u00eancia de aplicativo de uma \u00fanica p\u00e1gina. Cada link clicado far\u00e1 com que seu framework do lado do cliente seja reinicializado na pr\u00f3xima p\u00e1gina de carregamento.<\/p>\n<p>\u00c9 aqui que a Inertia entra em cena.<\/p>\n<p>A Inertia \u00e9 basicamente uma biblioteca de roteamento do lado do cliente. Ela permite que voc\u00ea navegue entre as p\u00e1ginas sem ter que recarregar a p\u00e1gina inteira. Isso \u00e9 feito atrav\u00e9s do componente <code>&lt;Link&gt;<\/code>, que \u00e9 um wrapper leve em torno de uma etiqueta de \u00e2ncora padr\u00e3o.<\/p>\n<p>Quando voc\u00ea clica em um link do Inertia, ele intercepta o clique e redireciona para XHR em vez disso. O navegador n\u00e3o recarrega a p\u00e1gina desta forma, dando ao usu\u00e1rio uma experi\u00eancia completa de p\u00e1gina \u00fanica.<\/p>\n<h2>Come\u00e7ando com\u00a0Inertia<\/h2>\n<figure id=\"attachment_134651\" aria-describedby=\"caption-attachment-134651\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-134651\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/kinsta-laravel-inertiajs-tutorial-1024x640.png\" alt=\"Uma p\u00e1gina de exemplo feita com o Inertia.js.\" width=\"1024\" height=\"640\"><figcaption id=\"caption-attachment-134651\" class=\"wp-caption-text\">Uma p\u00e1gina de exemplo feita com o Inertia.js<\/figcaption><\/figure>\n<p>Para entender o Inertia e como integr\u00e1-lo com o Laravel, vamos construir um aplicativo web de blog chamado <strong>Kinsta Blog<\/strong> usando a combina\u00e7\u00e3o mais poderosa: Laravel para o backend, Vue.js para o frontend em JavaScript e Tailwind CSS para o estilo.<\/p>\n<p>Se voc\u00ea preferir seguir este tutorial em um ambiente local, voc\u00ea pode usar <a href=\"https:\/\/kinsta.com\/pt\/devkinsta\/\">DevKinsta<\/a>, uma ferramenta poderosa para desenvolvedores, designers e ag\u00eancias que os habilita a construir aplicativos web WordPress de uma e v\u00e1rias p\u00e1ginas. Felizmente, o WordPress pode ser facilmente integrado com o Laravel usando o plano <a href=\"https:\/\/github.com\/corcel\/corcel\">Corcel<\/a>.<\/p>\n<h3>Pr\u00e9-requisitos<\/h3>\n<p>Para obter o m\u00e1ximo deste tutorial, voc\u00ea deve estar familiarizado com o seguinte:<\/p>\n<ul>\n<li>No\u00e7\u00f5es b\u00e1sicas de Laravel (instala\u00e7\u00e3o, banco de dados, migra\u00e7\u00f5es de banco de dados, Templates Eloquentes, controladores e roteamento)<\/li>\n<li>Vue.js b\u00e1sico (instala\u00e7\u00e3o, estruturas e formul\u00e1rios)<\/li>\n<\/ul>\n<p>Caso voc\u00ea n\u00e3o esteja se sentindo seguro, confira estes fant\u00e1sticos <a href=\"https:\/\/kinsta.com\/pt\/blog\/tutoriais-laravel\/\">tutoriais gratuitos e pagos do Laravel<\/a>. Caso contr\u00e1rio, vamos come\u00e7ar.<\/p>\n<h3>Passo 1: Instalando os elementos principais<\/h3>\n<p>Para focar no Inertia.js e ir direto para a parte divertida, certifique-se de ter a seguinte configura\u00e7\u00e3o pronta para usar:<\/p>\n<ol>\n<li>Projeto Laravel 9, rec\u00e9m-instalado, chamado <code>kinsta-blog<\/code><\/li>\n<li>CSS CLI Tailwind instalado em nosso projeto Laravel<\/li>\n<li>Arquivo de imagem \u201ckinsta-logo.png\u201d. Baixe e descompacte o pacote de logos da Kinsta em <a href=\"https:\/\/kinsta.com\/pt\/imprensa\/\" target=\"_new\" rel=\"noopener\">https:\/\/kinsta.com\/press\/<\/a> e copie o arquivo kinsta-logo2.png para o diret\u00f3rio public\/images como kinsta-logo.png.<\/li>\n<li>Dois componentes blade em <strong>kinsta-blog\/resources\/views<\/strong> para visualizar a p\u00e1gina inicial do blog e um \u00fanico artigo no blog, como mostrado abaixo em \u201c\/resources\/views\/<strong>index.blade.php<\/strong>\u201d.\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>\u201c\/resources\/views\/<strong>show.blade.php<\/strong>\u201d:<\/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>Banco de dados local MySQL chamado <code>kinsta_blog<\/code> conectado ao nosso projeto:&#8221;<strong>.env<\/strong>\u201d:\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 artigo, migra\u00e7\u00f5es e f\u00e1bricas: \u201capp\/Models\/<strong>Article.php<\/strong>\u201d:\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>\u201cdatabase\/migrations\/<strong>create_articles_table.php<\/strong>\u201d:<\/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>\u201cdatabase\/factories\/<strong>ArticleFactory.php<\/strong>\u201d:<\/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>Isso \u00e9 tudo o que precisamos para come\u00e7ar! Agora vamos ao que interessa e apresentar o Inertia.js ao nosso projeto.<\/p>\n<h3>Passo 2: Instalando o Inertia<\/h3>\n<p>O processo de instala\u00e7\u00e3o do Inertia \u00e9 dividido em duas fases principais: do lado do servidor (Laravel) e do lado do cliente (VueJs).<\/p>\n<p>O guia oficial de instala\u00e7\u00e3o na documenta\u00e7\u00e3o da Inertia est\u00e1 um pouco desatualizado porque <a href=\"https:\/\/vitejs.dev\/guide\/#scaffolding-your-first-vite-project\">Laravel 9 agora usa Vite<\/a> por padr\u00e3o, mas passaremos por isso tamb\u00e9m.<\/p>\n<h4>1. Server-Side<\/h4>\n<p>A primeira coisa que precisamos fazer \u00e9 instalar adaptadores Inertia server-side com o comando de terminal abaixo via Composer.<\/p>\n<pre><code class=\"language-bash\">composer require inertiajs\/inertia-laravel<\/code><\/pre>\n<p>Agora configuraremos nosso modelo raiz, que ser\u00e1 um \u00fanico arquivo blade que ser\u00e1 usado para carregar seus arquivos CSS e JS, assim como uma raiz Inertia que ser\u00e1 usada para abrir nosso aplicativo JavaScript.<\/p>\n<p>Como estamos usando a vers\u00e3o mais recente do Laravel 9 v9.3.1, devemos permitir tamb\u00e9m que a Vite fa\u00e7a sua m\u00e1gica incluindo-a em \/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>Observe como podemos buscar o t\u00edtulo do projeto dinamicamente adicionando o atributo <code>inertia<\/code> \u00e0s tags <code>&lt;title&gt;<\/code>.<\/p>\n<p>Tamb\u00e9m adicionamos a diretiva <code>@vite<\/code> ao cabe\u00e7alho para informar ao Vite o caminho do nosso arquivo principal JavaScript, onde criamos nosso aplicativo e importamos nosso CSS. O Vite \u00e9 uma ferramenta que ajuda no desenvolvimento de JavaScript e CSS, permitindo que os desenvolvedores visualizem as altera\u00e7\u00f5es de frontend sem precisar atualizar a p\u00e1gina durante o desenvolvimento local.<\/p>\n<p>Nosso pr\u00f3ximo passo ser\u00e1 criar o <strong>HandleInertiaRequests<\/strong> middleware e public\u00e1-lo em nosso projeto. Podemos fazer isso disparando o comando do terminal abaixo dentro do diret\u00f3rio raiz do nosso projeto:<\/p>\n<pre><code class=\"language-bash\">php artisan inertia:middleware<\/code><\/pre>\n<p>Uma vez que isso esteja completo, v\u00e1 para \u201cApp\/Http\/<strong>Kernel.php<\/strong>\u201d e registre <code>HandleInertiaRequests<\/code> como o \u00faltimo item em seus middlewares da web:<\/p>\n<pre><code class=\"language-php\">'web' =&gt; [\n    \/\/ ...\n App\\Http\\Middleware\\HandleInertiaRequests::class,\n],<\/code><\/pre>\n<h4>2. Client-Side<\/h4>\n<p>Em seguida, precisamos instalar as depend\u00eancias do nosso frontend Vue.js 3 da mesma maneira que no lado do 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>Em seguida, \u00e9 necess\u00e1rio importar o Vue.js 3:<\/p>\n<pre><code class=\"language-bash\">npm install vue@next<\/code><\/pre>\n<p>Ent\u00e3o atualize seu arquivo principal JavaScript para inicializar o Inertia.js com Vue.js 3, Vite e Laravel:<\/p>\n<p>\u201crecursos\/js\/<strong>app.js<\/strong>\u201d:<\/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>No snippet de c\u00f3digo acima, usamos o plugin do Laravel <code>resolvePageComponent<\/code>, e dizemos para resolver nossos componentes no diret\u00f3rio <strong>.\/Pages\/$name.vue<\/strong>. Isso porque salvaremos nossos componentes Inertia nesse diret\u00f3rio mais tarde em nosso projeto, e este plugin nos ajudar\u00e1 a carregar automaticamente estes componentes do diret\u00f3rio correto.<\/p>\n<p>Tudo o que resta \u00e9 instalar <code>vitejs\/plugin-vue<\/code>:<\/p>\n<pre><code class=\"language-bash\">npm i @vitejs\/plugin-vue<\/code><\/pre>\n<p>E atualizar o arquivo <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>O passo final \u00e9 instalar nossas depend\u00eancias e compilar nossos arquivos:<\/p>\n<pre><code class=\"language-bash\">npm install\n\nnpm run dev<\/code><\/pre>\n<p>E pronto! Voc\u00ea tem um aplicativo Laravel 9 funcional com Vue.js 3 e Vite. Agora \u00e9 hora de ver o aplicativo em a\u00e7\u00e3o!<\/p>\n<h2>Criando p\u00e1ginas de Inertia<\/h2>\n<p>Voc\u00ea se lembra desses dois arquivos de blade (<strong>index<\/strong> e <strong>show<\/strong>) para visualizar nossa p\u00e1gina inicial e um \u00fanico artigo?<\/p>\n<p>O \u00fanico arquivo blade que precisaremos enquanto usamos Inertia \u00e9 o <strong>app.blade.php<\/strong>, que j\u00e1 usamos uma vez quando est\u00e1vamos instalando Inertia. Ent\u00e3o o que acontece com esses arquivos agora?<\/p>\n<p>Transformaremos esses arquivos de componentes de blade em componentes do Inertia.js.<\/p>\n<p>Cada p\u00e1gina em seu aplicativo tem seu pr\u00f3prio controlador e componente JavaScript com Inertia. Isso permite que voc\u00ea obtenha apenas os dados necess\u00e1rios para aquela p\u00e1gina, sem utilizar uma API. As p\u00e1ginas Inertia nada mais s\u00e3o do que componentes JavaScript, no nosso caso, s\u00e3o componentes Vue.js. Eles n\u00e3o t\u00eam nada particularmente digno de nota sobre eles. Ent\u00e3o o que faremos \u00e9 compactar todo o conte\u00fado HTML entre as tags <code>&lt;template&gt;<\/code> e qualquer coisa relacionada ao JavaScript ser\u00e1 empacotada com as tags <code>&lt;script&gt;<\/code>.<\/p>\n<p>Crie uma pasta chamada \u201cP\u00e1ginas\u201d e mova seus arquivos para l\u00e1. Ent\u00e3o teremos \u201c<strong>index.blade.php<\/strong>\u201d e \u201c<strong>show.blade.php<\/strong>\u201d em \u201c<strong>.\/resources\/js\/Pages<\/strong>\u201d. Ent\u00e3o alteraremos o formato do arquivo para \u201c.vue\u201d ao inv\u00e9s de \u201c.blade.php\u201d enquanto fazemos a primeira letra de seus nomes em mai\u00fasculas e transformamos seu conte\u00fado em um componente padr\u00e3o do Vue.js. Excluiremos as tags <code>&lt;html&gt;<\/code>, <code>&lt;head&gt;<\/code>, e <code>&lt;body&gt;<\/code> porque elas j\u00e1 est\u00e3o inclu\u00eddas no componente raiz principal da blade.<\/p>\n<p>\u201cresources\/js\/Pages\/<strong>Index.vue<\/strong>\u201d:<\/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>\u201cresources\/js\/Pages\/<strong>Show.vue<\/strong>\u201d:<\/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>Como voc\u00ea pode perceber, continuamos copiando e colando nosso cabe\u00e7alho e rodap\u00e9 em cada componente, o que n\u00e3o \u00e9 uma pr\u00e1tica boa. Criaremos um Layout b\u00e1sico de Inertia para armazenar nossos persistentes componentes.<\/p>\n<p>Crie uma pasta chamada \u201cLayouts\u201d em \u201c<strong>\/resources\/js<\/strong>\u201d e dentro dessa pasta crie um arquivo chamado \u201cKinstaLayout.vue\u201d. Este arquivo ter\u00e1 nosso cabe\u00e7alho e rodap\u00e9 e o <code>main<\/code> com um <code>&lt;slot \/&gt;<\/code> para permitir que todos os componentes envoltos com este layout sejam incorporados dentro dele. Este arquivo deve ser parecido com esse:<\/p>\n<p>\u201cresources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>\u201d:<\/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>Ent\u00e3o importaremos este novo layout em nossas p\u00e1ginas e envolver todo o conte\u00fado HTML com ele. Nossos componentes devem se parecer com isso:<\/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>Rotas de Laravel e renderiza\u00e7\u00e3o de Inertia<\/h2>\n<p>Primeiro usaremos o arquivo \u201c<strong>ArticleFactory<\/strong>\u201d que temos do nosso ponto de partida tutorial e semear alguns artigos em nosso banco de dados.<\/p>\n<p>\u201cdatabase\/seeders\/<strong>databaseSeeder.php<\/strong>\u201d:<\/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>Ent\u00e3o clique o comando do terminal abaixo para migrar suas tabelas e semear os dados falsos das f\u00e1bricas:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh --seed<\/code><\/pre>\n<p>Isso criar\u00e1 10 artigos falsos no banco de dados, que precisaremos passar para a nossa vis\u00e3o usando o roteamento Laravel. Agora que estamos usando Inertia para renderizar views, a maneira como costum\u00e1vamos escrever nossas rotas ir\u00e1 mudar ligeiramente. Criaremos nossa primeira rota Laravel Inertia em \u201crotas\/<strong>web.php<\/strong>\u201d e retornar a visualiza\u00e7\u00e3o da p\u00e1gina inicial de \u201c\/resources\/js\/Pages\/<strong>Index.vue<\/strong>\u201d.<\/p>\n<p>\u201croutes\/<strong>web.php<\/strong>\u201c:<\/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>Note que importamos <code>Inertia<\/code> e n\u00e3o utilizamos o helper <code>view()<\/code> Laravel para retornar a visualiza\u00e7\u00e3o, mas em vez disso usamos o <code>Inertia::render<\/code>. Inertia tamb\u00e9m procurar\u00e1 por padr\u00e3o o nome do arquivo que mencionamos em nossa rota na pasta <strong>P\u00e1ginas<\/strong> em \u201cresources\/js\u201d.<\/p>\n<p>V\u00e1 para o arquivo Index e defina os dados recuperados como uma propriedade e fa\u00e7a um loop sobre eles com <code>v-for<\/code>\u00a0para mostrar os resultados. Entre as tags script, defina os dados passados \u200b\u200bcomo uma propriedade. Tudo o que o Inertia precisa saber \u00e9 que tipo de dados voc\u00ea est\u00e1 esperando, que, no nosso caso, \u00e9 um objeto &#8216;articles&#8217; contendo um array de artigos.<\/p>\n<p>\u201cresources\/js\/Pages\/<strong>Index.vue<\/strong>\u201d:<\/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>Note que \u00e9 suficiente defini-lo apenas como um adere\u00e7o sem devolv\u00ea-lo porque estamos usando o formato <code>setup<\/code> para a API de composi\u00e7\u00e3o do Vue.js 3. Se estivermos usando a API de op\u00e7\u00f5es, ent\u00e3o precisar\u00edamos devolv\u00ea-la.<\/p>\n<p>Realizemos o loop:<\/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> (deixe-o funcionando porque estamos usando Vite) e <code>php artisan serve<\/code> para iniciar o servidor de desenvolvimento de larvas e acessar nosso site, veremos a p\u00e1gina esperada exibindo todos os dez artigos no banco de dados.<\/p>\n<p>Agora, estamos usando a extens\u00e3o <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/vuejs-devtools\/nhdogjmejiglipccpnnnanhbledajbpd?hl=en\">Vue DevTools do Google Chrome<\/a>, que nos permite depurar o aplicativo. Mostraremos como nossos dados est\u00e3o sendo passados para o 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=\"size-large wp-image-134667\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/inspect-Inertia-passed-data-1024x543.png\" alt=\"Inspecionando propriedades de Inertia.\" width=\"1024\" height=\"543\"><figcaption id=\"caption-attachment-134667\" class=\"wp-caption-text\">Inspecionando propriedades de Inertia.<\/figcaption><\/figure>\n<p>\u201carticles\u201d \u00e9 passado para o componente como um objeto de adere\u00e7o contendo uma array de artigos; cada artigo da array \u00e9 tamb\u00e9m um objeto com propriedades que correspondem aos dados que ele adquiriu do banco de dados. Isso significa que qualquer dado que transferirmos de Laravel para Inertia ser\u00e1 tratado como um adere\u00e7o.<\/p>\n<h2>Usando o CSS Tailwind com o Inertia.js<\/h2>\n<p>Como o Tailwind j\u00e1 est\u00e1 instalado em nosso projeto desde o in\u00edcio, tudo o que precisamos fazer \u00e9 dizer a ele para ler nossos componentes Inertia. Isso pode ser feito editando o arquivo \u201c<strong>tailwind.config.js<\/strong>\u201d da seguinte forma:<\/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>Ent\u00e3o certifique-se de que importamos nosso arquivo CSS em \u201cresources\/js\/<strong>app.js<\/strong>\u201d:<\/p>\n<pre><code class=\"language-js\">import \"..\/css\/app.css\";<\/code><\/pre>\n<p>E agora estamos prontos para dar estilo aos nossos componentes.<\/p>\n<p>\u201cresources\/js\/Pages\/<strong>Index.vue<\/strong>\u201d:<\/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>\u201cresources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>\u201d:<\/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>Se voc\u00ea olhar para o navegador, ver\u00e1 que o Vite j\u00e1 atualizou a p\u00e1gina com as propriedades m\u00e1gicas do 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=\"size-full wp-image-134669\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/kinsta-laravel-inertiajs-blog.gif\" alt=\"Renderiza\u00e7\u00e3o de propriedades de Inertia.\" width=\"911\" height=\"620\"><figcaption id=\"caption-attachment-134669\" class=\"wp-caption-text\">Renderiza\u00e7\u00e3o de propriedades de Inertia.<\/figcaption><\/figure>\n<h2>Links de Inertia<\/h2>\n<p>Agora que temos uma p\u00e1gina inicial funcional que pode exibir todos os artigos no banco de dados, precisamos criar outra rota para exibir artigos individuais. Criaremos uma nova rota e definiremos a URL para um wildcard de \u201cid\u201d:<\/p>\n<p>\u201crotas\/<strong>web.php<\/strong>\u201d<\/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 o modelo \u201cArtigo\u201d e adicionamos uma nova rota para retornar o componente <strong>Show.vue<\/strong> Inertia. Tamb\u00e9m aproveitamos a <a href=\"https:\/\/laravel.com\/docs\/master\/routing#customizing-the-key\">liga\u00e7\u00e3o do modelo de rota de Laravel<\/a>, o que permite que Laravel obtenha automaticamente o artigo ao qual nos referimos.<\/p>\n<p>Tudo o que precisamos agora \u00e9 de uma maneira de visitar esta rota clicando em um link da p\u00e1gina inicial sem ter que recarregar a p\u00e1gina inteira. Isso \u00e9 poss\u00edvel com a ferramenta m\u00e1gica do Inertia <code>&lt;Link&gt;<\/code>. Mencionamos na introdu\u00e7\u00e3o que o Inertia usa <code>&lt;Link&gt;<\/code> como um wrapper para uma etiqueta de \u00e2ncora padr\u00e3o <code>&lt;a&gt;<\/code>, e que este wrapper tem o objetivo de fazer com que as visitas \u00e0 p\u00e1gina sejam o mais perfeitas poss\u00edvel. No Inertia, a etiqueta <code>&lt;Link&gt;<\/code> pode se comportar como uma etiqueta de \u00e2ncora que realiza pedidos <code>&lt;GET&gt;<\/code>, mas tamb\u00e9m pode agir como um <code>&lt;button&gt;<\/code> e um <code>&lt;form&gt;<\/code> ao mesmo tempo. Veremos como podemos aplic\u00e1-la ao nosso projeto.<\/p>\n<p>Em nosso Index.vue, vamos importar <code>&lt;Link&gt;<\/code> do Inertia, e remover as etiquetas de \u00e2ncora <code>&lt;a&gt;<\/code> e substitu\u00ed-las por etiquetas do Inertia <code>&lt;Link&gt;<\/code>. O atributo <code>href<\/code> ser\u00e1 definido para a URL da rota que fizemos anteriormente para ver o artigo:<\/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>Vamos estilizar o arquivo <strong>Show.vue<\/strong> com o Tailwind para deix\u00e1-lo um pouco mais elegante e pronto para receber nossas visitas. Tamb\u00e9m precisamos informar que ele deve esperar um objeto \u201cArticle\u201d e defini-lo como uma propriedade:<\/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>Agora quando clicarmos no t\u00edtulo do artigo ou \u201cLeia mais\u201d, seremos transportados magicamente para <strong>Show.vue<\/strong> sem refrescar a 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=\"size-large wp-image-134671\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/kinsta-laravel-inertiajs-Link-1024x596.gif\" alt=\"Links de Inertia no lugar.\" width=\"1024\" height=\"596\"><figcaption id=\"caption-attachment-134671\" class=\"wp-caption-text\">Links de Inertia no lugar.<\/figcaption><\/figure>\n<p>Em nosso caso, estamos usando <code>&lt;Link&gt;<\/code> como uma etiqueta de \u00e2ncora que envia um pedido <code>GET<\/code> para a rota e devolve os novos dados, mas podemos usar <code>&lt;Link&gt;<\/code> para tamb\u00e9m <code>POST<\/code>, <code>PUT<\/code>, <code>PATCH<\/code> e <code>DELETE<\/code><\/p>\n<p>\u201crotas\/web<strong>.php<\/strong>\u201d:<\/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>Laravel Inertia: dicas e truques que voc\u00ea deve conhecer<\/h2>\n<p>Agora temos um SPA funcional constru\u00eddo com Laravel, Inertia e Tailwind CSS. Mas a Inertia pode nos ajudar a alcan\u00e7ar muito mais. \u00c9 hora de adquirir algumas t\u00e9cnicas de Inertia que ir\u00e3o ajudar tanto os desenvolvedores quanto os visitantes de aplicativos.<\/p>\n<h3>Gerando URLs<\/h3>\n<p>Voc\u00ea deve ter notado que temos adicionado nomes \u00e0s nossas rotas Laravel sem us\u00e1-la. A Inertia nos permite usar nossas rotas nomeadas dentro de nossos componentes ao inv\u00e9s de anotar manualmente a rota completa.<\/p>\n<p>Podemos conseguir isso <a href=\"https:\/\/github.com\/tighten\/ziggy#installation\">instalando o pacote Ziggy<\/a> em nosso projeto:<\/p>\n<pre><code class=\"language-bash\">composer require tightenco\/ziggy<\/code><\/pre>\n<p>A seguir v\u00e1 para \u201crecursos\/js\/app.js\u201d e atualize-o assim:<\/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>Ir para \u201c\/resources\/views\/<strong>app.blade.php<\/strong>\u201d e atualizar o cabe\u00e7alho com a diretiva <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;e atualize seus pacotes de NPM, pressionando os dois comandos de terminal abaixo:<\/p>\n<pre><code class=\"language-bash\">npm install && npm run dev<\/code><\/pre>\n<p>Este pacote nos permite usar rotas nomeadas dentro de nossos componentes Inertia, ent\u00e3o vamos ao <strong>Index.vue<\/strong> e removamos a rota manual antiga e a substituamos pelo nome da rota enquanto passamos os dados normalmente como se estiv\u00e9ssemos em nosso controlador.<\/p>\n<p>Substituiremos isso:<\/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;com isso:<\/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>Isso nos dar\u00e1 o mesmo comportamento que tivemos, mas \u00e9 mais amig\u00e1vel para o desenvolvedor e extremamente \u00fatil quando a sua rota espera muitos par\u00e2metros.<\/p>\n<h3>Indicadores de progresso<\/h3>\n<p>Essa \u00e9 uma das melhores funcionalidades do Inertia.js; porque o SPA oferece uma experi\u00eancia interativa ao usu\u00e1rio, ter um feedback constante sobre se uma solicita\u00e7\u00e3o est\u00e1 carregando seria uma adi\u00e7\u00e3o fant\u00e1stica ao aplicativo. Isso pode ser feito por meio de uma biblioteca separada que o Inertia est\u00e1 oferecendo.<\/p>\n<p>A biblioteca \u201c@inertiajs\/progress\u201d \u00e9 uma camada em torno do <a href=\"https:\/\/ricostacruz.com\/nprogress\/\">NProgress<\/a> que mostra condicionalmente os indicadores de carregamento de acordo com eventos de Inertia. Voc\u00ea\u00a0 n\u00e3o precisa\u00a0realmente saber como isso funciona nos bastidores, ent\u00e3o vamos apenas coloc\u00e1-lo em funcionamento.<\/p>\n<p>Podemos instalar esta biblioteca com o comando de terminal abaixo:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/progress<\/code><\/pre>\n<p>Uma vez instalado, precisamos import\u00e1-lo em &#8220;<strong>recursos\/js\/app.js<\/strong>&#8221;<\/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>Isso mostrar\u00e1 uma barra de carregamento e um spinner de carregamento na cor preta, mas podemos mudar a cor com outras op\u00e7\u00f5es \u00fateis que podem ser encontradas na <a href=\"https:\/\/inertiajs.com\/progress-indicators\">documenta\u00e7\u00e3o do indicador de progresso 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=\"size-large wp-image-134672\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Inertia-progress-indicator-1024x83.gif\" alt=\"O indicador de progresso da Inertia (canto superior direito).\" width=\"1024\" height=\"83\"><figcaption id=\"caption-attachment-134672\" class=\"wp-caption-text\">O indicador de progresso da Inertia (canto superior direito).<\/figcaption><\/figure>\n<h3>Gerenciamento de rolagem<\/h3>\n<p>Em alguns casos, voc\u00ea pode querer navegar para uma nova p\u00e1gina enquanto mant\u00e9m a mesma posi\u00e7\u00e3o de rolagem. Talvez voc\u00ea precise disso se voc\u00ea permitir que os usu\u00e1rios deixem coment\u00e1rios; isso enviar\u00e1 um formul\u00e1rio e carregar\u00e1 o novo coment\u00e1rio do banco de dados em seu componente; voc\u00ea vai querer que isso aconte\u00e7a sem que o usu\u00e1rio perca a posi\u00e7\u00e3o de rolagem. A Inertia cuida disso.<\/p>\n<p>Em nosso caso, aplicaremos isso \u00e0 nossa tag <code>&lt;Link&gt;<\/code> no <strong>Index.vue<\/strong>. Para preservar a posi\u00e7\u00e3o de rolagem enquanto redirecionamos para uma p\u00e1gina diferente com o <code>&lt;Link&gt;<\/code> do Inertia, tudo o que precisamos fazer \u00e9 adicionar o atributo <code>preserve-scroll<\/code> ao <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>Dicas de SEO<\/h2>\n<p>Desde o surgimento dos SPAs, as pessoas t\u00eam se preocupado com a otimiza\u00e7\u00e3o para mecanismos de pesquisa (SEO). \u00c9 comum saber que, se voc\u00ea usar a abordagem SPA, os mecanismos de pesquisa ter\u00e3o dificuldade para rastrear seu aplicativo web, pois tudo \u00e9 renderizado do lado do cliente, resultando em seu site n\u00e3o aparecendo no topo dos resultados de pesquisa; no entanto, como plataformas populares como o Facebook e o Github agora s\u00e3o SPAs e ainda t\u00eam um bom desempenho em SEO?<\/p>\n<p>Bem, isso n\u00e3o \u00e9 mais uma miss\u00e3o imposs\u00edvel. O Inertia oferece algumas solu\u00e7\u00f5es para ajudar seu SPA a se tornar amig\u00e1vel para SEO.<\/p>\n<h3>Inertia Vue SSR com Laravel e Vite<\/h3>\n<p>Os mecanismos de pesquisa est\u00e3o sempre procurando HTML em seu site para identificar o conte\u00fado; entretanto, caso voc\u00ea n\u00e3o tenha HTML em suas URLs, este trabalho fica mais dif\u00edcil. Ao desenvolver SPAs, tudo o que voc\u00ea tem em sua p\u00e1gina \u00e9 JavaScript e JSON. A Inertia introduziu um recurso de renderiza\u00e7\u00e3o do lado do servidor (SSR) que voc\u00ea pode adicionar ao seu aplicativo. Isso permite que seu aplicativo fa\u00e7a uma pr\u00e9-renderiza\u00e7\u00e3o da p\u00e1gina inicial no servidor e ent\u00e3o envie o HTML renderizado para o navegador. Isso permite que os usu\u00e1rios vejam e interajam com suas p\u00e1ginas antes que elas sejam totalmente carregadas, e tamb\u00e9m tem outras vantagens, como encurtar o tempo que os mecanismos de pesquisa levam para indexar seu site.<\/p>\n<p>Para resumir como funciona, Inertia identificar\u00e1 se ele est\u00e1 rodando em um servidor Node.js e renderizar\u00e1 os nomes dos componentes, propriedades, URL e vers\u00e3o dos ativos em HTML. Isso fornecer\u00e1 ao usu\u00e1rio e ao mecanismo de pesquisa praticamente tudo o que sua p\u00e1gina tem a oferecer.<\/p>\n<p>Entretanto, porque estamos lidando com Laravel, isso n\u00e3o faz muito sentido porque Laravel \u00e9 um framework PHP e n\u00e3o roda em um servidor Node.js. Portanto, encaminharemos o pedido para um servi\u00e7o Node.js, que ir\u00e1 renderizar a p\u00e1gina e retornar HTML. Isso tornar\u00e1 nosso aplicativo Laravel Vue SEO amig\u00e1vel por padr\u00e3o.<\/p>\n<p>Primeiro, precisamos instalar o pacote Vue.js SSR npm:<\/p>\n<pre><code class=\"language-bash\">npm install @vue\/server-renderer<\/code><\/pre>\n<p>Outro pacote \u00fatil do Inertia \u201cNPM\u201d fornece um servidor \u201cHTTP\u201d simples. \u00c9 fortemente recomendado que voc\u00ea o instale:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/server<\/code><\/pre>\n<p>Ent\u00e3o, em \u201crecursos\/js\/&#8221;, adicionaremos um novo arquivo chamado <strong>ssr.js<\/strong>. Este arquivo ser\u00e1 muito similar ao arquivo <strong>app.js<\/strong> que criamos ao instalar o Inertia, ele ser\u00e1 executado somente no Node.js ao inv\u00e9s do 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>Certifique-se de n\u00e3o incluir tudo no arquivo <strong>ssr.js<\/strong>, pois ele n\u00e3o ser\u00e1 vis\u00edvel aos visitantes; este arquivo \u00e9 apenas para que os mecanismos de pesquisa e navegadores mostrem os dados dentro da sua p\u00e1gina, portanto inclua apenas o que \u00e9 importante para os seus dados ou apenas o que ir\u00e1 tornar seus dados dispon\u00edveis.<\/p>\n<p>\u201cPor padr\u00e3o, o servidor SSR da Inertia ir\u00e1 operar na porta 13714. Entretanto, voc\u00ea pode mudar isso fornecendo um segundo argumento para o m\u00e9todo createServer\u201d DOCss do Inertia.<\/p>\n<p>Os DOCs do Inertia.js n\u00e3o est\u00e3o explicando como integrar a SSR do Inertia com o Vite, mas explicaremos isso agora. V\u00e1 para o <strong>vite.config.js<\/strong> e cole o abaixo:<\/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 seguir, v\u00e1 para <strong>package.json<\/strong> e mude o script de build:<\/p>\n<pre><code class=\"language-json\">\"build\": \"vite build && vite build --ssr\"<\/code><\/pre>\n<p>Agora se rodarmos <code>npm run build<\/code>, a Vite ir\u00e1 construir nosso pacote SSR para produ\u00e7\u00e3o. Para mais informa\u00e7\u00f5es sobre isso voc\u00ea pode visitar <a href=\"https:\/\/inertiajs.com\/server-side-rendering\">Inertia SSR DOCs<\/a> e <a href=\"https:\/\/laravel-vite.dev\/guide\/features\/ssr.html#building\">Vite SSR DOCs<\/a>.<\/p>\n<h3>Title e meta<\/h3>\n<p>Como os aplicativos JavaScript s\u00e3o renderizados no documento <code>&lt;body&gt;<\/code>, eles n\u00e3o podem renderizar a marca\u00e7\u00e3o para o documento <code>&lt;head&gt;<\/code> porque ele est\u00e1 fora do seu escopo. Inertia tem um componente <code>&lt;Head&gt;<\/code> que pode ser usado para definir a p\u00e1gina <code>&lt;title&gt;<\/code>, tags <code>&lt;meta&gt;<\/code>, e outros componentes <code>&lt;head&gt;<\/code>.<\/p>\n<p>Para adicionar o elemento <code>&lt;head&gt;<\/code> \u00e0 sua P\u00e1gina, devemos importar <code>&lt;Head&gt;<\/code> do Inertia da mesma forma que fizemos com o 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>Tamb\u00e9m podemos adicionar um t\u00edtulo global para todas as p\u00e1ginas, isso adicionar\u00e1 o nome do seu aplicativo ao lado do t\u00edtulo em cada p\u00e1gina. J\u00e1 fizemos isso no arquivo <strong>app.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">createInertiaApp({\n    title: (title) =&gt; `${title} - ${appName}`,\n    \/\/\n});<\/code><\/pre>\n<p>O que significa que se adicionarmos <code>&lt;Head title=\"Home\"&gt;<\/code> na p\u00e1gina inicial do nosso aplicativo com um t\u00edtulo, este ser\u00e1 renderizado da seguinte forma: <code>&lt;title&gt;Home - My App&lt;\/title&gt;<\/code>.<\/p>\n<h3>Monitorando seu aplicativo<\/h3>\n<p>A velocidade \u00e9 um dos fatores mais importantes para otimizar o desempenho de SEO em seu site. Caso voc\u00ea use WordPress para o seu site, <a href=\"https:\/\/kinsta.com\/pt\/ferramenta-apm\/\">Kinsta APM<\/a> ir\u00e1 ajud\u00e1-lo a monitorar e acompanhar de perto o seu aplicativo em a\u00e7\u00e3o. Ele ajuda voc\u00ea a identificar problemas de desempenho do WordPress e est\u00e1 dispon\u00edvel gratuitamente em todos os sites hospedados pelo Kinsta.<\/p>\n<h2>Resumo<\/h2>\n<p>O Inertia.js \u00e9 uma das tecnologias mais significativas dispon\u00edveis; combinando-o com o Laravel, voc\u00ea tem um aplicativo moderno de p\u00e1gina \u00fanica constru\u00eddo com PHP e JavaScript. Taylor Otwell, o criador do Laravel, est\u00e1 t\u00e3o interessado no Inertia que o Laravel lan\u00e7ou seus kits de in\u00edcio mais populares, Laravel Breeze e Jetstream, com suporte para Inertia e SSR.<\/p>\n\n<p>Se voc\u00ea \u00e9 um f\u00e3 de Laravel ou um desenvolvedor profissional, Inertia.js sem d\u00favida chamar\u00e1 sua aten\u00e7\u00e3o. Neste tutorial, criamos um blog muito b\u00e1sico e direto em apenas alguns minutos. Ainda h\u00e1 muito a aprender sobre Inertia, e este pode ser apenas o primeiro de muitos artigos e tutoriais.<\/p>\n<p>O que mais sobre Laravel voc\u00ea gostaria de explorar? Nos informe na se\u00e7\u00e3o de coment\u00e1rios abaixo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Os aplicativos de v\u00e1rias p\u00e1ginas (MPAs) est\u00e3o ficando menos populares a cada dia. Plataformas famosas como Facebook, Twitter, YouTube, Github, e muitas outras j\u00e1 est\u00e3o usando &#8230;<\/p>\n","protected":false},"author":266,"featured_media":55645,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[864,523,416,884,912],"topic":[984],"class_list":["post-55644","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>Como usar o Inertia.js em seus projetos Laravel - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Este artigo mostrar\u00e1 como usar o Inertia.js com o Laravel, Vue e Tailwind CSS para criar um aplicativo web moderno. Ser\u00e3o apresentados exemplos pr\u00e1ticos de como implementar essa tecnologia em seus projetos Laravel.\" \/>\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\/pt\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como usar o Inertia.js em seus projetos Laravel\" \/>\n<meta property=\"og:description\" content=\"Este artigo mostrar\u00e1 como usar o Inertia.js com o Laravel, Vue e Tailwind CSS para criar um aplicativo web moderno. Ser\u00e3o apresentados exemplos pr\u00e1ticos de como implementar essa tecnologia em seus projetos Laravel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-12T15:19:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-22T06:40:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.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=\"Este artigo mostrar\u00e1 como usar o Inertia.js com o Laravel, Vue e Tailwind CSS para criar um aplicativo web moderno. Ser\u00e3o apresentados exemplos pr\u00e1ticos de como implementar essa tecnologia em seus projetos Laravel.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mostafa Said\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\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\/pt\/blog\/laravel-inertia\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/\"},\"author\":{\"name\":\"Mostafa Said\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\"},\"headline\":\"Como usar o Inertia.js em seus projetos Laravel\",\"datePublished\":\"2022-12-12T15:19:47+00:00\",\"dateModified\":\"2023-08-22T06:40:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/\"},\"wordCount\":4208,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png\",\"keywords\":[\"inertia.js\",\"JavaScript\",\"laravel\",\"php frameworks\",\"spa\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/\",\"name\":\"Como usar o Inertia.js em seus projetos Laravel - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png\",\"datePublished\":\"2022-12-12T15:19:47+00:00\",\"dateModified\":\"2023-08-22T06:40:07+00:00\",\"description\":\"Este artigo mostrar\u00e1 como usar o Inertia.js com o Laravel, Vue e Tailwind CSS para criar um aplicativo web moderno. Ser\u00e3o apresentados exemplos pr\u00e1ticos de como implementar essa tecnologia em seus projetos Laravel.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png\",\"width\":1460,\"height\":730,\"caption\":\"Como Usar o Inertia.js em seus Projetos Laravel\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Como usar o Inertia.js em seus projetos Laravel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\",\"name\":\"Mostafa Said\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/mostafasaid\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Como usar o Inertia.js em seus projetos Laravel - Kinsta\u00ae","description":"Este artigo mostrar\u00e1 como usar o Inertia.js com o Laravel, Vue e Tailwind CSS para criar um aplicativo web moderno. Ser\u00e3o apresentados exemplos pr\u00e1ticos de como implementar essa tecnologia em seus projetos Laravel.","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\/pt\/blog\/laravel-inertia\/","og_locale":"pt_PT","og_type":"article","og_title":"Como usar o Inertia.js em seus projetos Laravel","og_description":"Este artigo mostrar\u00e1 como usar o Inertia.js com o Laravel, Vue e Tailwind CSS para criar um aplicativo web moderno. Ser\u00e3o apresentados exemplos pr\u00e1ticos de como implementar essa tecnologia em seus projetos Laravel.","og_url":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2022-12-12T15:19:47+00:00","article_modified_time":"2023-08-22T06:40:07+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png","type":"image\/png"}],"author":"Mostafa Said","twitter_card":"summary_large_image","twitter_description":"Este artigo mostrar\u00e1 como usar o Inertia.js com o Laravel, Vue e Tailwind CSS para criar um aplicativo web moderno. Ser\u00e3o apresentados exemplos pr\u00e1ticos de como implementar essa tecnologia em seus projetos Laravel.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Mostafa Said","Tempo estimado de leitura":"24 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/"},"author":{"name":"Mostafa Said","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996"},"headline":"Como usar o Inertia.js em seus projetos Laravel","datePublished":"2022-12-12T15:19:47+00:00","dateModified":"2023-08-22T06:40:07+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/"},"wordCount":4208,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png","keywords":["inertia.js","JavaScript","laravel","php frameworks","spa"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/","url":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/","name":"Como usar o Inertia.js em seus projetos Laravel - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png","datePublished":"2022-12-12T15:19:47+00:00","dateModified":"2023-08-22T06:40:07+00:00","description":"Este artigo mostrar\u00e1 como usar o Inertia.js com o Laravel, Vue e Tailwind CSS para criar um aplicativo web moderno. Ser\u00e3o apresentados exemplos pr\u00e1ticos de como implementar essa tecnologia em seus projetos Laravel.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/12\/laravel-inertia.png","width":1460,"height":730,"caption":"Como Usar o Inertia.js em seus Projetos Laravel"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-inertia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/pt\/topicos\/laravel\/"},{"@type":"ListItem","position":3,"name":"Como usar o Inertia.js em seus projetos Laravel"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996","name":"Mostafa Said","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/mostafasaid\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/55644","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/266"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=55644"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/55644\/revisions"}],"predecessor-version":[{"id":59746,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/55644\/revisions\/59746"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/translations\/dk"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/55644\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/55645"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=55644"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=55644"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=55644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}