{"id":57006,"date":"2022-12-12T16:01:38","date_gmt":"2022-12-12T15:01:38","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=57006&#038;preview=true&#038;preview_id=57006"},"modified":"2023-08-29T06:30:27","modified_gmt":"2023-08-29T05:30:27","slug":"laravel-inertia","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/","title":{"rendered":"Wie du Inertia.js in deinen Laravel-Projekten verwendest"},"content":{"rendered":"<p>Mehrseitige Anwendungen (MPAs) werden von Tag zu Tag weniger beliebt. Ber\u00fchmte Plattformen wie Facebook, Twitter, YouTube, Github und viele andere nutzen stattdessen bereits die Single-Page-Application-Technologie (SPA).<\/p>\n<p>Diese trendige Technologie erm\u00f6glicht es den Nutzern, schnell und reaktionsschnell mit Webanwendungen zu arbeiten, da alles auf der Client-Seite gerendert wird. F\u00fcr Entwicklerinnen und Entwickler, die mit Frameworks wie Laravel oder Django serverseitig gerenderte Anwendungen erstellen, kann dies jedoch ein Problem darstellen.<\/p>\n<p>Zum Gl\u00fcck ist Inertia.js zur Stelle und kommt zur Rettung.<br \/>\n<br \/>\nIn diesem Artikel zeigen wir dir, wie du mit Inertia.js loslegen kannst und wie du es mit Laravel, Vue.js und Tailwind CSS verwendest, um eine moderne Blog-Webanwendung zu erstellen. Au\u00dferdem verraten wir dir, wie du SPAs SEO-freundlicher gestalten kannst, und verraten dir noch ein paar andere Tricks.<\/p>\n<p>Wenn du gerade erst mit Laravel anf\u00e4ngst, empfehlen wir dir, <a href=\"https:\/\/kinsta.com\/de\/blog\/laravel-entwickler\/\">zuerst diesen Artikel<\/a> zu lesen, damit du gleich loslegen kannst.<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>Warum SPA?<\/h2>\n<p>Bevor wir fragen k\u00f6nnen, warum wir Inertia nutzen sollten, m\u00fcssen wir zuerst fragen: &#8222;Warum SPA?&#8220;<\/p>\n<p>Warum sollte jemand client-seitig gerenderte Anwendungen den traditionellen server-seitigen Anwendungen vorziehen? Was w\u00fcrde einen Full-Stack-Laravel-Entwickler dazu bringen, sich von <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-laravel\/#templating\">Blade-Komponenten<\/a> zu verabschieden?<\/p>\n<p>Die kurze Antwort: Weil Geschwindigkeit und Reaktionsf\u00e4higkeit f\u00fcr eine erfolgreiche Nutzeransprache unerl\u00e4sslich sind.<\/p>\n<p>Bei MPAs sendet der Browser st\u00e4ndig Abfragen an das Backend, das dann zahlreiche Datenbankabfragen ausf\u00fchrt. Nachdem die Datenbank und der Server die Abfragen verarbeitet und an den Browser geliefert haben, wird die Seite gerendert.<\/p>\n<p>SPAs sind jedoch anders. Die Anwendung bringt alles, was der\/die Nutzer\/in ben\u00f6tigt, direkt auf die Seite, sodass der Browser keine Abfragen mehr senden oder die Seite neu laden muss, um neue HTML-Elemente zu rendern.<\/p>\n<p>Wegen dieses einzigartigen Nutzererlebnisses dr\u00e4ngen viele namhafte Unternehmen darauf, ihre Websites in Single-Page-Anwendungen umzuwandeln.<\/p>\n<p>Allerdings kann es f\u00fcr Laravel-Entwicklerinnen und -Entwickler schwierig sein, eine Single-Page-Anwendung zu erstellen, weil sie dann Vue.js oder React anstelle von Blade-Templates verwenden m\u00fcssten, wodurch viele Laravel-Vorz\u00fcge verloren gehen, die Zeit und M\u00fche sparen.<\/p>\n<p>Mit Inertia.js hat sich das jedoch ge\u00e4ndert.<\/p>\n<h2>Warum Inertia?<\/h2>\n<p>Wenn Laravel-Entwickler, vor Inertia, Web-SPAs mit Vue bauen wollten, mussten sie APIs einrichten und JSON-Daten mit Laravel zur\u00fcckgeben, und dann etwas wie AXIOS verwenden, um die Daten in Vue-Komponenten abzurufen. Au\u00dferdem br\u00e4uchten sie etwas wie den Vue Router, um Routen zu verwalten, was bedeuten w\u00fcrde, dass Laravel-Routing sowie Middlewares und Controller wegfallen w\u00fcrden.<\/p>\n<p>Inertia.js hingegen erm\u00f6glicht es Entwicklern, moderne einseitige Vue-, React- und Svelte-Apps mit klassischem serverseitigem Routing und Controllern zu erstellen. Inertia wurde f\u00fcr Laravel-, Ruby on Rails- und Django-Entwickler entwickelt, damit sie Apps erstellen k\u00f6nnen, ohne ihre Programmiertechniken wie das Erstellen von Controllern, das Abrufen von Daten aus einer Datenbank und das Rendern von Ansichten zu \u00e4ndern<\/p>\n<p>Dank Inertia.js werden sich Laravel-Entwickler wie zu Hause f\u00fchlen.<\/p>\n<h2>Wie Inertia funktioniert<\/h2>\n<p>Wenn du eine SPA nur mit Laravel und Vue erstellst, erh\u00e4ltst du zwar eine vollst\u00e4ndige JavaScript-Seite f\u00fcr dein Frontend, aber das bedeutet nicht, dass du eine Single-Page-App erleben kannst. Jeder angeklickte Link f\u00fchrt dazu, dass dein clientseitiges Framework beim n\u00e4chsten Laden der Seite neu gestartet wird.<\/p>\n<p>An dieser Stelle kommt Inertia ins Spiel.<\/p>\n<p>Inertia ist im Grunde eine Client-seitige Routing-Bibliothek. Sie erm\u00f6glicht es dir, zwischen Seiten zu navigieren, ohne die gesamte Seite neu laden zu m\u00fcssen. Dies wird \u00fcber die Komponente <code>&lt;Link&gt;<\/code> erreicht, die ein leichtgewichtiger Wrapper um ein Standard-Anker-Tag ist.<\/p>\n<p>Wenn du auf einen Inertia-Link klickst, f\u00e4ngt Inertia den Klick ab und leitet dich stattdessen zu XHR weiter. Der Browser l\u00e4dt die Seite auf diese Weise nicht neu und bietet dem Nutzer ein vollst\u00e4ndiges Single-Page-Erlebnis.<\/p>\n<h2>Erste Schritte mit 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=\"Eine einfache Seite mit \"Kinsta Blog\" in einem blauen Banner am oberen Rand und einer einzelnen Reihe von Beispielartikelkarten\" width=\"1024\" height=\"640\"><figcaption id=\"caption-attachment-134651\" class=\"wp-caption-text\">Eine mit Inertia.js erstellte Beispielseite<\/figcaption><\/figure>\n<p>Um Inertia und seine Integration in Laravel zu verstehen, werden wir eine Blog-Web-App namens <strong>Kinsta Blog<\/strong> erstellen und dabei die m\u00e4chtigste Kombination verwenden: Laravel f\u00fcr das Backend, Vue.js f\u00fcr das JavaScript-Frontend und Tailwind CSS f\u00fcr das Styling.<\/p>\n<p>Wenn du dieses Tutorial lieber in einer lokalen Umgebung verfolgen m\u00f6chtest, kannst du <a href=\"https:\/\/kinsta.com\/de\/devkinsta\/\">DevKinsta<\/a> verwenden, ein leistungsstarkes Tool f\u00fcr Entwickler, Designer und Agenturen, mit dem du ein- und mehrseitige WordPress-Webanwendungen erstellen kannst. Gl\u00fccklicherweise l\u00e4sst sich WordPress mit dem <a href=\"https:\/\/github.com\/corcel\/corcel\">Corcel-Paket<\/a> leicht in Laravel integrieren.<\/p>\n<h3>Voraussetzungen<\/h3>\n<p>Um diese Tutorial optimal nutzen zu k\u00f6nnen, solltest du mit Folgendem vertraut sein:<\/p>\n<ul>\n<li>Laravel-Grundlagen (Installation, Datenbank, Datenbankmigrationen, Eloquent Models, Controller und Routing)<\/li>\n<li>Vue.js-Grundlagen (Installation, Struktur und Formulare)<\/li>\n<\/ul>\n<p>Wenn du dir unsicher bist, schau dir diese fantastischen <a href=\"https:\/\/kinsta.com\/de\/blog\/laravel-tutorial\/\">kostenlosen und kostenpflichtigen Laravel-Tutorials<\/a> an. Ansonsten lass uns loslegen.<\/p>\n<h3>Schritt 1: Installation der Kernelemente<\/h3>\n<p>Damit du dich auf Inertia.js konzentrieren kannst und der Spa\u00dffaktor nicht zu kurz kommt, solltest du die folgenden Einstellungen bereithalten:<\/p>\n<ol>\n<li>Ein frisch installiertes Laravel 9 Projekt mit dem Namen <code>kinsta-blog<\/code><\/li>\n<li>Tailwind CSS CLI installiert in unserem Laravel-Projekt<\/li>\n<li>Bilddatei &#8222;kinsta-logo.png&#8220;. Lade und entpacke das Kinsta-Logo-Paket von <a href=\"https:\/\/kinsta.com\/de\/presse\/\">https:\/\/kinsta.com\/press\/<\/a> Seite herunter und kopiere kinsta-logo2.png in das Verzeichnis public\/images als kinsta-logo.png.<\/li>\n<li>Zwei Blade-Komponenten in <strong>kinsta-blog\/resources\/views<\/strong> f\u00fcr die Anzeige der Blog-Startseite und eines einzelnen Artikels im Blog wie unten gezeigt:&#8220;\/resources\/views\/<strong>index.blade.php<\/strong>&#8222;:\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>&#8222;\/resources\/views\/<strong>show.blade.php<\/strong>&#8222;:<\/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>Die lokale MySQL-Datenbank mit dem Namen <code>kinsta_blog<\/code> ist mit unserem Projekt verbunden: &#8222;<strong>.env<\/strong>&#8222;:\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>Artikelmodell, Migrationen und Factories:<br \/>\n&#8222;app\/Models\/<strong>Article.php<\/strong>&#8222;:<\/p>\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>&#8222;database\/migrations\/<strong>create_articles_table.php<\/strong>&#8222;:<\/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>&#8222;datenbank\/factories\/<strong>ArticleFactory.php<\/strong>&#8222;:<\/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>Das ist alles, was wir brauchen, um loszulegen! Jetzt k\u00f6nnen wir zur Sache kommen und Inertia.js in unser Projekt einf\u00fchren.<\/p>\n<h3>Schritt 2: Inertia installieren<\/h3>\n<p>Der Installationsprozess von Inertia ist in zwei Hauptphasen unterteilt: serverseitig (Laravel) und clientseitig (VueJs).<\/p>\n<p>Die offizielle Installationsanleitung in der Inertia-Dokumentation ist ein wenig veraltet, weil <a href=\"https:\/\/vitejs.dev\/guide\/#scaffolding-your-first-vite-project\">Laravel 9 jetzt standardm\u00e4\u00dfig Vite verwendet<\/a>, aber auch das werden wir durchgehen.<\/p>\n<h4>1. Serverseitig<\/h4>\n<p>Als Erstes m\u00fcssen wir die serverseitigen Adapter von Inertia mit dem folgenden Terminalbefehl \u00fcber Composer installieren.<\/p>\n<pre><code class=\"language-bash\">composer require inertiajs\/inertia-laravel<\/code><\/pre>\n<p>Jetzt richten wir unser Root-Template ein. Das ist eine einzelne Blade-Datei, die zum Laden deiner CSS- und JS-Dateien verwendet wird, sowie ein Inertia-Root, das zum Starten unserer JavaScript-Anwendung verwendet wird.<\/p>\n<p>Da wir die neueste Version von Laravel 9 v9.3.1 verwenden, m\u00fcssen wir auch Vite aktivieren, indem wir es in unsere Tags in \/resources\/views\/<strong>app.blade.php<\/strong> aufnehmen:<\/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>Beachte, wie wir den Projekttitel dynamisch abrufen k\u00f6nnen, indem wir das Attribut <code>inertia<\/code> zu den <code>&lt;title&gt;<\/code> Tags hinzuf\u00fcgen.<\/p>\n<p>Au\u00dferdem haben wir die Direktive <code>@vite<\/code> in den Head eingef\u00fcgt, um Vite den Pfad zu unserer JavaScript-Hauptdatei mitzuteilen, in der wir unsere App erstellt und unser CSS importiert haben. Vite ist ein Tool, das bei der JavaScript- und CSS-Entwicklung hilft, indem es Entwicklern erm\u00f6glicht, Frontend-\u00c4nderungen zu sehen, ohne die Seite w\u00e4hrend der lokalen Entwicklung aktualisieren zu m\u00fcssen.<\/p>\n<p>Als N\u00e4chstes erstellen wir die Middleware <strong>HandleInertiaRequests<\/strong> und ver\u00f6ffentlichen sie in unserem Projekt. Dazu rufen wir den folgenden Terminalbefehl im Stammverzeichnis unseres Projekts auf:<\/p>\n<pre><code class=\"language-bash\">php artisan inertia:middleware<\/code><\/pre>\n<p>Sobald dies abgeschlossen ist, gehst du zu &#8222;App\/Http\/<strong>Kernel.php<\/strong>&#8220; und registrierst <code>HandleInertiaRequests<\/code> als letztes Element in deinen Web-Middlewares:<\/p>\n<pre><code class=\"language-php\">'web' =&gt; [\n    \/\/ ...\n    App\\Http\\Middleware\\HandleInertiaRequests::class,\n],<\/code><\/pre>\n<h4>2. Clientseitig<\/h4>\n<p>Als N\u00e4chstes m\u00fcssen wir unsere Vue.js 3-Abh\u00e4ngigkeiten f\u00fcr das Frontend auf die gleiche Weise installieren wie auf der Serverseite:<\/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>Als N\u00e4chstes musst du Vue.js 3 einbinden:<\/p>\n<pre><code class=\"language-bash\">npm install vue@next<\/code><\/pre>\n<p>Aktualisiere dann deine prim\u00e4re JavaScript-Datei, um Inertia.js mit Vue.js 3, Vite und Laravel zu initialisieren:<\/p>\n<p>&#8222;resources\/js\/<strong>app.js<\/strong>&#8222;:<\/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>Im obigen Codeschnipsel verwenden wir das Laravel-Plugin <code>resolvePageComponent<\/code> und weisen es an, unsere Komponenten aus dem Verzeichnis <strong>.\/Pages\/$name.vue<\/strong> aufzul\u00f6sen. Der Grund daf\u00fcr ist, dass wir unsere Inertia-Komponenten sp\u00e4ter in unserem Projekt in diesem Verzeichnis speichern werden und das Plugin uns dabei helfen wird, diese Komponenten automatisch aus dem richtigen Verzeichnis zu laden.<\/p>\n<p>Jetzt m\u00fcssen wir nur noch <code>vitejs\/plugin-vue<\/code> installieren:<\/p>\n<pre><code class=\"language-bash\">npm i @vitejs\/plugin-vue<\/code><\/pre>\n<p>Und die Datei <strong>vite.config.js<\/strong> aktualisieren:<\/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>Der letzte Schritt besteht darin, unsere Abh\u00e4ngigkeiten zu installieren und unsere Dateien zu kompilieren:<\/p>\n<pre><code class=\"language-bash\">npm install\n\nnpm run dev<\/code><\/pre>\n<p>Und voil\u00e0! Du hast jetzt eine funktionierende Laravel 9 Anwendung mit Vue.js 3 und Vite. Jetzt m\u00fcssen wir nur noch sehen, was in Aktion passiert!<\/p>\n<h2>Inertia-Seiten erstellen<\/h2>\n<p>Erinnerst du dich an die beiden Blade-Dateien (<strong>index<\/strong> und <strong>show<\/strong>) f\u00fcr die Anzeige unserer Homepage und eines einzelnen Artikels?<\/p>\n<p>Die einzige Blade-Datei, die wir bei der Verwendung von Inertia brauchen, ist <strong>app.blade.php<\/strong>, die wir schon einmal bei der Installation von Inertia verwendet haben. Was passiert jetzt mit diesen Dateien?<\/p>\n<p>Wir werden diese Dateien von Blade-Komponenten in Inertia.js-Komponenten umwandeln.<\/p>\n<p>Jede Seite in deiner Anwendung hat ihren eigenen Controller und ihre eigene JavaScript-Komponente mit Inertia. So kannst du nur die Daten abrufen, die f\u00fcr die jeweilige Seite ben\u00f6tigt werden, ohne eine API zu verwenden. Inertia-Seiten sind nichts anderes als JavaScript-Komponenten, in unserem Fall sind es Vue.js-Komponenten. Sie haben nichts besonders Bemerkenswertes an sich. Wir werden also alle HTML-Inhalte zwischen <code>&lt;template&gt;<\/code> Tags einpacken und alles, was mit JavaScript zu tun hat, wird mit <code>&lt;script&gt;<\/code> Tags eingepackt.<\/p>\n<p>Erstelle einen Ordner namens &#8222;Seiten&#8220; und verschiebe deine Dateien dorthin. Wir werden also &#8222;<strong>index.blade.php<\/strong>&#8220; und &#8222;<strong>show.blade.php<\/strong>&#8220; in &#8222;<strong>.\/resources\/js\/Pages<\/strong>&#8220; ablegen. Dann \u00e4ndern wir das Dateiformat in &#8222;.vue&#8220; anstelle von &#8222;.blade.php&#8220;, wobei wir den ersten Buchstaben des Namens in Gro\u00dfbuchstaben schreiben und den Inhalt in eine Standard-Vue.js-Komponente verwandeln. Wir lassen die Tags <code>&lt;html&gt;<\/code>, <code>&lt;head&gt;<\/code> und <code>&lt;body&gt;<\/code> weg, da sie bereits in der Root-Blade-Komponente enthalten sind.<\/p>\n<p>&#8222;resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8222;:<\/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>&#8222;resources\/js\/Seiten\/<strong>Show.vue<\/strong>&#8222;:<\/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>Da ist etwas, das mich wirklich st\u00f6rt! Wir kopieren und f\u00fcgen unsere Kopf- und Fu\u00dfzeile in jede Komponente ein, was keine gute Vorgehensweise ist. Lass uns ein Inertia-Basislayout erstellen, um unsere dauerhaften Komponenten zu speichern.<\/p>\n<p>Erstelle einen Ordner namens &#8222;Layouts&#8220; in &#8222;<strong>\/resources\/js<\/strong>&#8220; und erstelle in diesem Ordner eine Datei namens &#8222;KinstaLayout.vue&#8220;. Diese Datei wird unsere Kopf- und Fu\u00dfzeile und die <code>main<\/code> mit einer <code>&lt;slot \/&gt;<\/code> enthalten, damit alle Komponenten, die mit diesem Layout verpackt sind, darin eingebettet werden k\u00f6nnen. Diese Datei sollte wie folgt aussehen:<\/p>\n<p>&#8222;resources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>&#8222;:<\/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>Dann werden wir dieses neue Layout in unsere Seiten importieren und den gesamten HTML-Inhalt damit umh\u00fcllen. Unsere Komponenten sollten wie folgt aussehen:<\/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>Laravel Routes und Inertia Rendering<\/h2>\n<p>Als Erstes verwenden wir die &#8222;<strong>ArticleFactory<\/strong>&#8222;-Datei, die wir aus unserem Tutorial kennen, und legen einige Artikel in unserer Datenbank an.<\/p>\n<p>&#8222;database\/seeders\/<strong>databaseSeeder.php<\/strong>&#8222;:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace Database\\Seeders;\n\nuse AppModelsArticle;\nuse IlluminateDatabaseSeeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    public function run()\n    {\n        Article::factory(10)-&gt;create();\n    }\n}<\/code><\/pre>\n<p>Gib dann den folgenden Terminalbefehl ein, um deine Tabellen zu migrieren und die gef\u00e4lschten Daten aus den Fabriken zu seeden:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh --seed<\/code><\/pre>\n<p>Dadurch werden 10 gef\u00e4lschte Artikel in der Datenbank erstellt, die wir mithilfe des Laravel-Routings an unsere View \u00fcbergeben m\u00fcssen. Da wir nun Inertia zum Rendern von Views verwenden, wird sich die Art und Weise, wie wir unsere Routen schreiben, leicht \u00e4ndern. Wir erstellen unsere erste Laravel-Inertia-Route in &#8222;routes\/<strong>web.php<\/strong>&#8220; und geben die Homepage-Ansicht aus &#8222;\/resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8220; zur\u00fcck.<\/p>\n<p>&#8222;routes\/<strong>web.php<\/strong>&#8222;:<\/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>Beachte, dass wir <code>Inertia<\/code> importiert und nicht den <code>view()<\/code> Laravel-Helper verwendet haben, um die Ansicht zur\u00fcckzugeben, sondern stattdessen <code>Inertia::render<\/code>. Inertia sucht auch standardm\u00e4\u00dfig nach dem Dateinamen, den wir in unserer Route im Ordner <strong>Pages<\/strong> unter &#8222;resources\/js&#8220; angegeben haben.<\/p>\n<p>Gehe zur Indexdatei und setze die abgerufenen Daten als Prop und f\u00fchre mit <code>v-for<\/code> eine Schleife dar\u00fcber, um die Ergebnisse anzuzeigen. Definiere zwischen den Skript-Tags die \u00fcbergebenen Daten als Requisite. Inertia muss nur wissen, welche Art von Daten du erwartest. In unserem Fall ist es ein &#8222;articles&#8220;-Objekt, das ein Array von Artikeln enth\u00e4lt.<\/p>\n<p>&#8222;resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8222;:<\/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>Beachte, dass es ausreicht, ihn nur als Prop zu definieren, ohne ihn zur\u00fcckzugeben, weil wir das <code>setup<\/code> Format f\u00fcr die Vue.js 3 Composition API verwenden. Wenn wir die Options-API verwenden w\u00fcrden, m\u00fcssten wir sie zur\u00fcckgeben.<\/p>\n<p>Lass uns die Schleife erstellen:<\/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> (lass es laufen, weil wir Vite verwenden) und <code>php artisan serve<\/code>, um den Laravel-Entwicklungsserver zu starten und auf unsere Website zuzugreifen, wir sehen die erwartete Seite, die alle zehn Artikel in der Datenbank anzeigt.<\/p>\n<p>Jetzt verwenden wir die <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/vuejs-devtools\/nhdogjmejiglipccpnnnanhbledajbpd?hl=en\">Vue DevTools-Erweiterung von Google Chrome<\/a>, mit der wir meine Anwendung debuggen k\u00f6nnen. Wir wollen dir zeigen, wie unsere Daten an die Komponente \u00fcbergeben werden.<\/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=\"Die Vue DevTools-Erweiterung von Chrome zeigt eine Liste von Inertia-Eigenschaften f\u00fcr die ge\u00f6ffnete Seite\" width=\"1024\" height=\"543\"><figcaption id=\"caption-attachment-134667\" class=\"wp-caption-text\">Pr\u00fcfen der Eigenschaften von Inertia<\/figcaption><\/figure>\n<p>&#8222;Articles&#8220; wird der Komponente als prop-Objekt \u00fcbergeben, das ein Array von Artikeln enth\u00e4lt. Jeder Artikel im Array ist auch ein Objekt mit Eigenschaften, die den Daten entsprechen, die es aus der Datenbank bezogen hat. Das bedeutet, dass alle Daten, die wir von Laravel zu Inertia \u00fcbertragen, als Prop behandelt werden.<\/p>\n<h2>Verwendung von Tailwind CSS mit Inertia.js<\/h2>\n<p>Da Tailwind bereits in unserem Projekt installiert ist, m\u00fcssen wir ihm nur noch sagen, dass es unsere Inertia-Komponenten lesen soll. Dazu m\u00fcssen wir die Datei &#8222;<strong>tailwind.config.js<\/strong>&#8220; wie folgt bearbeiten:<\/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>Stelle dann sicher, dass wir unsere CSS-Datei in &#8222;resources\/js\/<strong>app.js<\/strong>&#8220; importiert haben:<\/p>\n<pre><code class=\"language-js\">import \"..\/css\/app.css\";<\/code><\/pre>\n<p>Jetzt sind wir bereit, unsere Komponenten zu gestalten.<\/p>\n<p>&#8222;resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8222;:<\/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>&#8222;resources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>&#8222;:<\/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>Wenn du dir den Browser ansiehst, wirst du feststellen, dass Vite die Seite bereits mit der Tailwind-Magie aktualisiert hat.<\/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=\"Ein scrollendes Bild, das eine funktionierende Version des \"Kinsta Blog\"-Beispiels von vorhin zeigt\" width=\"911\" height=\"620\"><figcaption id=\"caption-attachment-134669\" class=\"wp-caption-text\">Rendering der Inertia-Eigenschaften<\/figcaption><\/figure>\n<h2>Inertia-Links<\/h2>\n<p>Da wir nun eine funktionierende Homepage haben, die alle Artikel in der Datenbank anzeigen kann, m\u00fcssen wir eine weitere Route erstellen, um einzelne Artikel anzuzeigen. Erstellen wir eine neue Route und setzen wir die URL auf einen &#8222;id&#8220;-Platzhalter:<\/p>\n<p>&#8222;routes\/<strong>web.php<\/strong>&#8220;<\/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>Wir haben das Modell &#8222;Artikel&#8220; importiert und eine neue Route hinzugef\u00fcgt, die die <strong>Show.vue<\/strong> Inertia-Komponente zur\u00fcckgibt. Au\u00dferdem haben wir die <a href=\"https:\/\/laravel.com\/docs\/master\/routing#customizing-the-key\">Laravel-Routenmodellbindung<\/a> genutzt, mit der Laravel automatisch den Artikel abrufen kann, auf den wir uns beziehen.<\/p>\n<p>Jetzt brauchen wir nur noch eine M\u00f6glichkeit, diese Route zu besuchen, indem wir auf einen Link auf der Homepage klicken, ohne die gesamte Seite neu laden zu m\u00fcssen. Das ist mit dem magischen Tool von Inertia <code>&lt;Link&gt;<\/code> m\u00f6glich. In der Einleitung haben wir bereits erw\u00e4hnt, dass Inertia <code>&lt;Link&gt;<\/code> als Wrapper f\u00fcr ein Standard-Anker-Tag <code>&lt;a&gt;<\/code> verwendet und dass dieser Wrapper daf\u00fcr gedacht ist, den Seitenbesuch so nahtlos wie m\u00f6glich zu gestalten. In Inertia kann sich das <code>&lt;Link&gt;<\/code> Tag als Anker-Tag verhalten, das <code>&lt;GET&gt;<\/code> Anfragen ausf\u00fchrt, aber es kann auch gleichzeitig als <code>&lt;button&gt;<\/code> und <code>&lt;form&gt;<\/code> fungieren. Schauen wir uns an, wie wir es in unserem Projekt anwenden k\u00f6nnen.<\/p>\n<p>In unserer Index.vue importieren wir <code>&lt;Link&gt;<\/code> von Inertia und entfernen die Anker-Tags <code>&lt;a&gt;<\/code> und ersetzen sie durch Inertia-Tags <code>&lt;Link&gt;<\/code>. Das Attribut <code>href<\/code> wird auf die URL der Route gesetzt, die wir zuvor f\u00fcr die Anzeige des Artikels erstellt haben:<\/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>Lass uns <strong>Show.vue<\/strong> mit Tailwind stylen, damit es ein bisschen schicker aussieht und f\u00fcr unseren Besuch bereit ist. Au\u00dferdem m\u00fcssen wir dem Programm mitteilen, dass es ein &#8222;Artikel&#8220;-Objekt erwarten und es als Requisite setzen soll:<\/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>Wenn wir nun auf den Artikeltitel oder &#8222;Weiterlesen&#8220; klicken, werden wir auf magische Weise zu <strong>Show.vue<\/strong> transportiert, ohne dass die Seite aktualisiert werden muss.<\/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=\"Die Beispielseite \"Kinsta Blog\" zeigt Artikelkarten mit funktionierenden Links\" width=\"1024\" height=\"596\"><figcaption id=\"caption-attachment-134671\" class=\"wp-caption-text\">Inertia-Links im Einsatz<\/figcaption><\/figure>\n<p>In unserem Fall verwenden wir <code>&lt;Link&gt;<\/code> als Anker-Tag, das eine <code>GET<\/code> Anfrage an die Route sendet und die neuen Daten zur\u00fcckgibt, aber wir k\u00f6nnen <code>&lt;Link&gt;<\/code> auch f\u00fcr <code>POST<\/code>, <code>PUT<\/code>, <code>PATCH<\/code> und <code>DELETE<\/code><\/p>\n<p>&#8222;routes\/<strong>web.php<\/strong>&#8222;:<\/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 Tipps und Tricks, die du kennen solltest<\/h2>\n<p>Wir haben jetzt eine funktionierende SPA mit Laravel, Inertia und Tailwind CSS gebaut. Aber mit Inertia k\u00f6nnen wir noch viel mehr erreichen. Es ist an der Zeit, sich einige Inertia-Techniken anzueignen, die sowohl den Entwicklern als auch den Besuchern der Anwendung helfen werden.<\/p>\n<h3>URLs generieren<\/h3>\n<p>Du hast vielleicht bemerkt, dass wir unseren Laravel-Routen Namen hinzugef\u00fcgt haben, ohne sie zu benutzen. Mit Inertia k\u00f6nnen wir unsere benannten Routen in unseren Komponenten verwenden, anstatt die vollst\u00e4ndige Route manuell aufzuschreiben.<\/p>\n<p>Wir k\u00f6nnen dies erreichen, indem wir <a href=\"https:\/\/github.com\/tighten\/ziggy#installation\">das Ziggy-Paket in unserem Projekt installieren<\/a>:<\/p>\n<pre><code class=\"language-bash\">composer require tightenco\/ziggy<\/code><\/pre>\n<p>Gehe dann zu &#8222;resources\/js\/app.js&#8220; und aktualisiere es wie folgt:<\/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>Gehe zu &#8222;\/resources\/views\/<strong>app.blade.php<\/strong>&#8220; und aktualisiere den head mit der Direktive <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;und aktualisiere deine NPM-Pakete, indem du die beiden folgenden Terminalbefehle ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">npm install && npm run dev<\/code><\/pre>\n<p>Mit diesem Paket k\u00f6nnen wir benannte Routen in unseren Inertia-Komponenten verwenden. Also gehen wir zu <strong>Index.vue<\/strong> und entfernen die alte manuelle Route und ersetzen sie durch den Routennamen, w\u00e4hrend wir die Daten ganz normal wie in unserem Controller \u00fcbergeben.<\/p>\n<p>Wir werden dies ersetzen:<\/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;durch dies:<\/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>Damit erhalten wir genau das gleiche Verhalten wie vorher, aber es ist entwicklerfreundlicher und extrem hilfreich, wenn deine Route viele Parameter erwartet.<\/p>\n<h3>Fortschrittsindikatoren<\/h3>\n<p>Dies ist eine der sch\u00f6nsten Funktionen von Inertia.js. Da SPA ein interaktives Nutzererlebnis bietet, w\u00e4re eine st\u00e4ndige R\u00fcckmeldung, ob eine Anfrage geladen wird, eine fantastische Erg\u00e4nzung der Anwendung. Dies kann durch eine separate Bibliothek erreicht werden, die Inertia anbietet.<\/p>\n<p>Die Bibliothek &#8222;@inertiajs\/progress&#8220; ist ein Wrapper um <a href=\"https:\/\/ricostacruz.com\/nprogress\/\">NProgress<\/a>, der die Ladeanzeigen abh\u00e4ngig von Inertia-Ereignissen anzeigt. Du musst nicht wirklich wissen, wie das hinter den Kulissen funktioniert, also lass es uns einfach zum Laufen bringen.<\/p>\n<p>Wir k\u00f6nnen diese Bibliothek mit dem folgenden Terminalbefehl installieren:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/progress<\/code><\/pre>\n<p>Sobald sie installiert ist, m\u00fcssen wir sie in &#8222;<strong>resources\/js\/app.js<\/strong>&#8220; importieren:<\/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>Dies zeigt einen Ladebalken und einen Lade-Spinner in schwarzer Farbe an, aber wir k\u00f6nnen die Farbe zusammen mit anderen hilfreichen Optionen \u00e4ndern, die du in der <a href=\"https:\/\/inertiajs.com\/progress-indicators\">Inertia.js-Dokumentation zum Fortschrittsindikator<\/a> findest.<\/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=\"Die blaue Kopfzeile \"Kinsta Blog\" mit dem sich drehenden Indikator oben rechts\" width=\"1024\" height=\"83\"><figcaption id=\"caption-attachment-134672\" class=\"wp-caption-text\">Der Inertia-Fortschrittsindikator (oben rechts).<\/figcaption><\/figure>\n<h3>Scroll-Management<\/h3>\n<p>In manchen F\u00e4llen m\u00f6chtest du vielleicht zu einer neuen Seite navigieren und dabei die gleiche Bildlaufposition beibehalten. Das ist z. B. notwendig, wenn du Nutzern die M\u00f6glichkeit gibst, Kommentare zu hinterlassen; dabei wird ein Formular abgeschickt und der neue Kommentar aus der Datenbank in deine Komponente geladen; du m\u00f6chtest, dass dies geschieht, ohne dass der Nutzer seine Scrollposition verliert. Inertia \u00fcbernimmt diese Aufgabe f\u00fcr uns.<\/p>\n<p>In unserem Fall wenden wir dies auf unseren <code>&lt;Link&gt;<\/code> Tag in <strong>Index.vue<\/strong> an. Um die Scrollposition beizubehalten, w\u00e4hrend wir mit Inertia&#8217;s <code>&lt;Link&gt;<\/code> zu einer anderen Seite weiterleiten, m\u00fcssen wir nur das Attribut <code>preserve-scroll<\/code> zum <code>&lt;Link&gt;<\/code> hinzuf\u00fcgen:<\/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>SEO-Tipps<\/h2>\n<p>Seit es SPAs gibt, machen sich die Menschen Gedanken \u00fcber die Suchmaschinenoptimierung (SEO). Es ist allgemein bekannt, dass Suchmaschinen eine Webanwendung nur schwer crawlen k\u00f6nnen, weil alles auf der Client-Seite gerendert wird, was dazu f\u00fchrt, dass deine Website nicht ganz oben in den Suchergebnissen auftaucht. Aber wie kommt es dann, dass beliebte Plattformen wie Facebook und Github jetzt SPAs sind und trotzdem gut in der SEO abschneiden?<\/p>\n<p>Nun, das ist keine unm\u00f6gliche Mission mehr. Inertia bietet ein paar L\u00f6sungen an, die deiner SPA helfen, SEO-freundlich zu werden.<\/p>\n<h3>Inertia Vue SSR mit Laravel und Vite<\/h3>\n<p>Suchmaschinen suchen immer nach HTML auf deiner Website, um den Inhalt zu identifizieren; wenn du jedoch kein HTML in deinen URLs hast, wird diese Aufgabe schwieriger. Wenn du SPAs entwickelst, hast du nur JavaScript und JSON auf deiner Seite. Inertia hat ein Server-Side Rendering (SSR) Feature eingef\u00fchrt, das du in deine Anwendung einbauen kannst. Damit kann deine Anwendung einen ersten Seitenbesuch auf dem Server vorrendern und dann das gerenderte HTML an den Browser senden. Auf diese Weise k\u00f6nnen die Nutzer\/innen deine Seiten sehen und mit ihnen interagieren, bevor sie vollst\u00e4ndig geladen sind, und es hat auch andere Vorteile, wie z. B. die Verk\u00fcrzung der Zeit, die Suchmaschinen brauchen, um deine Website zu indizieren.<\/p>\n<p>Um die Funktionsweise zusammenzufassen: Inertia erkennt, ob es auf einem Node.js-Server l\u00e4uft und rendert die Komponentennamen, die Eigenschaften, die URL und die Asset-Version in HTML. Auf diese Weise k\u00f6nnen sowohl der Nutzer als auch die Suchmaschine praktisch alles sehen, was deine Seite zu bieten hat.<\/p>\n<p>Da wir es aber mit Laravel zu tun haben, macht das wenig Sinn, denn Laravel ist ein PHP-Framework und l\u00e4uft nicht auf einem Node.js-Server. Deshalb werden wir die Anfrage an einen Node.js-Dienst weiterleiten, der die Seite rendert und HTML zur\u00fcckgibt. Dadurch wird unsere Laravel-Vue-Anwendung standardm\u00e4\u00dfig SEO-freundlich.<\/p>\n<p>Zuerst m\u00fcssen wir das Vue.js SSR npm-Paket installieren:<\/p>\n<pre><code class=\"language-bash\">npm install @vue\/server-renderer<\/code><\/pre>\n<p>Ein weiteres hilfreiches &#8222;NPM&#8220;-Paket von Inertia bietet einen einfachen &#8222;HTTP&#8220;-Server. Es wird dringend empfohlen, dass du es installierst:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/server<\/code><\/pre>\n<p>Dann f\u00fcgen wir in &#8222;resources\/js\/&#8220; eine neue Datei namens <strong>ssr.js<\/strong> hinzu. Diese Datei ist der <strong>app.js-Datei<\/strong>, die wir bei der Installation von Inertia erstellt haben, sehr \u00e4hnlich, nur dass sie in Node.js und nicht im Browser ausgef\u00fchrt wird:<\/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>Achte darauf, dass du nicht alles in die Datei <strong>ssr.js<\/strong> einf\u00fcgst, da sie f\u00fcr Besucher\/innen nicht sichtbar sein wird. Diese Datei ist nur f\u00fcr Suchmaschinen und Browser gedacht, um die Daten auf deiner Seite anzuzeigen, also f\u00fcge nur das ein, was f\u00fcr deine Daten wichtig ist oder deine Daten verf\u00fcgbar macht.<\/p>\n<p>&#8222;Standardm\u00e4\u00dfig arbeitet der SSR-Server von Inertia auf Port 13714. Du kannst dies jedoch \u00e4ndern, indem du der Methode createServer ein zweites Argument mitgibst.&#8220; Inertia DOCss.<\/p>\n<p>In den Inertia.js DOCs wird nicht erkl\u00e4rt, wie man Inertia SSR in Vite integriert, aber wir werden das jetzt nachholen. Gehe zu <strong>vite.config.js<\/strong> und f\u00fcge den folgenden Text ein:<\/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>Als N\u00e4chstes gehst du zur <strong>package.json<\/strong> und \u00e4nderst das Build-Skript:<\/p>\n<pre><code class=\"language-json\">\"build\": \"vite build && vite build --ssr\"<\/code><\/pre>\n<p>Wenn wir nun <code>npm run build<\/code> ausf\u00fchren, wird Vite unser SSR-B\u00fcndel f\u00fcr die Produktion bauen. Weitere Informationen dazu findest du unter <a href=\"https:\/\/inertiajs.com\/server-side-rendering\">Inertia SSR DOCs<\/a> und <a href=\"https:\/\/laravel-vite.dev\/guide\/features\/ssr.html#building\">Vite SSR DOCs<\/a>.<\/p>\n<h3>Titel und Meta<\/h3>\n<p>Da JavaScript-Anwendungen innerhalb des Dokuments <code>&lt;body&gt;<\/code> gerendert werden, k\u00f6nnen sie kein Markup f\u00fcr das Dokument <code>&lt;head&gt;<\/code> rendern, da es au\u00dferhalb ihres Bereichs liegt. Inertia hat eine <code>&lt;Head&gt;<\/code> Komponente, die verwendet werden kann, um die <code>&lt;title&gt;<\/code>, <code>&lt;meta&gt;<\/code> Tags und andere <code>&lt;head&gt;<\/code> Komponenten zu setzen.<\/p>\n<p>Um das Element <code>&lt;head&gt;<\/code> zu deiner Seite hinzuzuf\u00fcgen, m\u00fcssen wir <code>&lt;Head&gt;<\/code> aus Inertia importieren, genauso wie wir es mit der Komponente <code>&lt;Link&gt;<\/code> gemacht haben:<\/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>Wir k\u00f6nnen auch einen globalen Titel f\u00fcr alle Seiten hinzuf\u00fcgen, damit der Name deiner Anwendung neben dem Titel auf jeder Seite erscheint. Das haben wir bereits in der Datei <strong>app.js<\/strong> getan:<\/p>\n<pre><code class=\"language-js\">createInertiaApp({\n    title: (title) =&gt; `${title} - ${appName}`,\n    \/\/\n});<\/code><\/pre>\n<p>Wenn wir also <code>&lt;Head title=\"Home\"&gt;<\/code> auf der Startseite unserer Anwendung mit einem Titel versehen, wird dieser wie folgt dargestellt: <code>&lt;title&gt;Home - My App&lt;\/title&gt;<\/code>.<\/p>\n<h3>\u00dcberwachung deiner App<\/h3>\n<p>Die Geschwindigkeit ist einer der wichtigsten Faktoren f\u00fcr die Optimierung der SEO-Leistung deiner Website. Wenn du WordPress f\u00fcr deine Website verwendest, hilft dir <a href=\"https:\/\/kinsta.com\/de\/apm-tool\/\">Kinsta APM<\/a> dabei, deine Anwendung in Aktion zu \u00fcberwachen und im Auge zu behalten. Es hilft dir, WordPress-Performance-Probleme zu erkennen und ist f\u00fcr alle von Kinsta gehosteten Websites kostenlos verf\u00fcgbar.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>Inertia.js ist eine der wichtigsten Technologien auf dem Markt. Kombiniere sie mit Laravel und du hast eine moderne Single-Page-Anwendung, die mit PHP und JavaScript erstellt wurde. Taylor Otwell, der Sch\u00f6pfer von Laravel, ist so sehr an Inertia interessiert, dass Laravel seine beliebtesten Starterkits, Laravel Breeze und Jetstream, mit Inertia- und SSR-Unterst\u00fctzung herausgebracht hat.<\/p>\n\n<p>Wenn du ein Laravel-Fan oder ein professioneller Entwickler bist, wird dir Inertia.js zweifellos ins Auge fallen. In diesem Tutorial haben wir in nur wenigen Minuten einen sehr einfachen Blog erstellt. Es gibt noch viel \u00fcber Inertia zu lernen, und dies wird vielleicht nur der erste von vielen Artikeln und Tutorials sein.<\/p>\n<p>Was m\u00f6chtest du noch \u00fcber Laravel erfahren? Lass es uns im Kommentarbereich unten wissen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mehrseitige Anwendungen (MPAs) werden von Tag zu Tag weniger beliebt. Ber\u00fchmte Plattformen wie Facebook, Twitter, YouTube, Github und viele andere nutzen stattdessen bereits die Single-Page-Application-Technologie (SPA). &#8230;<\/p>\n","protected":false},"author":266,"featured_media":57513,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[873,465,400,770,896],"topic":[958],"class_list":["post-57006","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>Wie du Inertia.js in deinen Laravel-Projekten verwendest<\/title>\n<meta name=\"description\" content=\"In diesem Artikel zeigen wir dir, wie du Inertia.js zusammen mit Laravel, Vue und Tailwind CSS verwenden kannst, um eine moderne Web-App zu erstellen.\" \/>\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\/de\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wie du Inertia.js in deinen Laravel-Projekten verwendest\" \/>\n<meta property=\"og:description\" content=\"In diesem Artikel zeigen wir dir, wie du Inertia.js zusammen mit Laravel, Vue und Tailwind CSS verwenden kannst, um eine moderne Web-App zu erstellen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-12T15:01:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-29T05:30:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/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=\"In diesem Artikel zeigen wir dir, wie du Inertia.js zusammen mit Laravel, Vue und Tailwind CSS verwenden kannst, um eine moderne Web-App zu erstellen.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mostafa Said\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"23\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/\"},\"author\":{\"name\":\"Mostafa Said\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\"},\"headline\":\"Wie du Inertia.js in deinen Laravel-Projekten verwendest\",\"datePublished\":\"2022-12-12T15:01:38+00:00\",\"dateModified\":\"2023-08-29T05:30:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/\"},\"wordCount\":3874,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png\",\"keywords\":[\"inertia.js\",\"JavaScript\",\"laravel\",\"php frameworks\",\"spa\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/\",\"name\":\"Wie du Inertia.js in deinen Laravel-Projekten verwendest\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png\",\"datePublished\":\"2022-12-12T15:01:38+00:00\",\"dateModified\":\"2023-08-29T05:30:27+00:00\",\"description\":\"In diesem Artikel zeigen wir dir, wie du Inertia.js zusammen mit Laravel, Vue und Tailwind CSS verwenden kannst, um eine moderne Web-App zu erstellen.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png\",\"width\":1460,\"height\":730,\"caption\":\"Wie du Inertia.js in deinen Laravel-Projekten verwendest\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Wie du Inertia.js in deinen Laravel-Projekten verwendest\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"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\/de\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\",\"name\":\"Mostafa Said\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/mostafasaid\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Wie du Inertia.js in deinen Laravel-Projekten verwendest","description":"In diesem Artikel zeigen wir dir, wie du Inertia.js zusammen mit Laravel, Vue und Tailwind CSS verwenden kannst, um eine moderne Web-App zu erstellen.","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\/de\/blog\/laravel-inertia\/","og_locale":"de_DE","og_type":"article","og_title":"Wie du Inertia.js in deinen Laravel-Projekten verwendest","og_description":"In diesem Artikel zeigen wir dir, wie du Inertia.js zusammen mit Laravel, Vue und Tailwind CSS verwenden kannst, um eine moderne Web-App zu erstellen.","og_url":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2022-12-12T15:01:38+00:00","article_modified_time":"2023-08-29T05:30:27+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png","type":"image\/png"}],"author":"Mostafa Said","twitter_card":"summary_large_image","twitter_description":"In diesem Artikel zeigen wir dir, wie du Inertia.js zusammen mit Laravel, Vue und Tailwind CSS verwenden kannst, um eine moderne Web-App zu erstellen.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png","twitter_creator":"@Kinsta_DE","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Mostafa Said","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/"},"author":{"name":"Mostafa Said","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996"},"headline":"Wie du Inertia.js in deinen Laravel-Projekten verwendest","datePublished":"2022-12-12T15:01:38+00:00","dateModified":"2023-08-29T05:30:27+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/"},"wordCount":3874,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png","keywords":["inertia.js","JavaScript","laravel","php frameworks","spa"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/","url":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/","name":"Wie du Inertia.js in deinen Laravel-Projekten verwendest","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png","datePublished":"2022-12-12T15:01:38+00:00","dateModified":"2023-08-29T05:30:27+00:00","description":"In diesem Artikel zeigen wir dir, wie du Inertia.js zusammen mit Laravel, Vue und Tailwind CSS verwenden kannst, um eine moderne Web-App zu erstellen.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/12\/laravel-inertia-1.png","width":1460,"height":730,"caption":"Wie du Inertia.js in deinen Laravel-Projekten verwendest"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/laravel-inertia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/de\/thema\/laravel\/"},{"@type":"ListItem","position":3,"name":"Wie du Inertia.js in deinen Laravel-Projekten verwendest"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","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\/de\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996","name":"Mostafa Said","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/mostafasaid\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/57006","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/266"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=57006"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/57006\/revisions"}],"predecessor-version":[{"id":61870,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/57006\/revisions\/61870"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/translations\/dk"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/57006\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/57513"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=57006"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=57006"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=57006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}