{"id":47281,"date":"2022-12-12T16:01:15","date_gmt":"2022-12-12T15:01:15","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=47281&#038;preview=true&#038;preview_id=47281"},"modified":"2023-08-24T11:13:50","modified_gmt":"2023-08-24T10:13:50","slug":"laravel-inertia","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/","title":{"rendered":"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter"},"content":{"rendered":"<p>Multi Page Applications (MPA&#8217;er) bliver mindre og mindre popul\u00e6re for hver dag der g\u00e5r. Ber\u00f8mte platforme som Facebook, Twitter, YouTube, Github og mange andre bruger allerede teknologi til single-page applications (SPA) i stedet.<\/p>\n<p>Denne trendy teknologi g\u00f8r det muligt for brugerne at bruge webapplikationer hurtigt og responsivt, fordi alt er klientside-renderet. Det kan dog v\u00e6re en plage for udviklere, der bygger server-side-renderede applikationer med frameworks som Laravel eller Django.<\/p>\n<p>Heldigvis tr\u00e5dte Inertia.js til og kom til unds\u00e6tning.<\/p>\n\n<p>I denne artikel viser vi, hvordan du kan komme i gang med at bruge Inertia.js, og hvordan du kan bruge det sammen med Laravel, Vue.js og Tailwind CSS til at skabe en moderne blog-webapp. Vi vil ogs\u00e5 dele, hvordan du g\u00f8r SPA&#8217;er mere SEO-venlige, samt et par andre tricks.<\/p>\n<p>Hvis du lige er begyndt med Laravel, anbefaler vi, at du l\u00e6ser <a href=\"https:\/\/kinsta.com\/blog\/laravel-developer\/\">denne artikel f\u00f8rst<\/a>, s\u00e5 du er klar til at g\u00e5 i gang.<\/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>Hvorfor SPA?<\/h2>\n<p>F\u00f8r vi kan sp\u00f8rge, hvorfor vi skal bruge Inertia, skal vi f\u00f8rst sp\u00f8rge: &#8220;Hvorfor SPA?&#8221;<\/p>\n<p>Hvorfor skulle nogen foretr\u00e6kke klientside renderede applikationer frem for traditionelle server-side applikationer? Hvad ville tvinge en full-stack Laravel-udvikler til at sige farvel til <a href=\"https:\/\/kinsta.com\/blog\/what-is-laravel\/#templating\">bladkomponenter<\/a>?<\/p>\n<p>Det korte svar: Fordi hastighed og responsivitet er afg\u00f8rende for ethvert succesfuldt brugerengagement.<\/p>\n<p>I tilf\u00e6lde af MPA&#8217;er sender browseren konstant foresp\u00f8rgsler til backend&#8217;en, som derefter udf\u00f8rer adskillige databaseforesp\u00f8rgsler. N\u00e5r databasen og serveren har behandlet foresp\u00f8rgsler og leveret dem til browseren, bliver siden gengivet.<\/p>\n<p>Men SPA&#8217;er er anderledes. Applikationen bringer alt det, brugeren har brug for, direkte til siden, s\u00e5 browseren ikke beh\u00f8ver at sende foresp\u00f8rgsler eller genindl\u00e6se siden for at gengive nye HTML-elementer.<\/p>\n<p>P\u00e5 grund af denne enest\u00e5ende brugeroplevelse kr\u00e6ver mange store virksomheder, at deres websteder bliver til single-page-applikationer.<\/p>\n<p>N\u00e5r det er sagt, kan det v\u00e6re sv\u00e6rt for Laravel-udviklere at skabe en single-page-applikation, fordi det vil kr\u00e6ve, at de begynder at bruge Vue.js eller React i stedet for bladskabeloner, hvilket resulterer i tab af mange Laravel-perler, der sparer tid og kr\u00e6fter.<\/p>\n<p>Men nu hvor vi har Inertia.js, er det hele \u00e6ndret.<\/p>\n<h2>Hvorfor Inertia?<\/h2>\n<p>Hvis Laravel-udviklere skulle bygge web SPA&#8217;er med Vue f\u00f8r Inertia, skulle de ops\u00e6tte API&#8217;er og returnere JSON-data med Laravel og derefter bruge noget som AXIOS til at hente dataene i Vue-komponenter. De ville ogs\u00e5 have brug for noget som Vue Router til at administrere ruter, hvilket ville betyde, at de ville miste Laravel-routing samt middlewares og controllere.<\/p>\n<p>Inertia.js g\u00f8r det derimod muligt for udviklere at bygge moderne enkeltsidede Vue-, React- og Svelte-apps ved hj\u00e6lp af klassisk server-side-routing og controllere. Inertia blev designet til Laravel-, Ruby on Rails- og Django-udviklere for at give dem mulighed for at bygge apps uden at \u00e6ndre deres kodningsteknikker med oprettelse af controllere, hentning af data fra en database og rendering af visninger<\/p>\n<p>Takket v\u00e6re Inertia.js vil Laravel-udviklere f\u00f8le sig hjemme.<\/p>\n<h2>S\u00e5dan fungerer Inertia<\/h2>\n<p>Hvis du kun bygger SPA med Laravel og Vue, f\u00e5r du en fuld JavaScript-side til din frontend, men det giver dig ikke en single-page app-oplevelse. Hvert klikket link vil f\u00e5 dit klientside framework til at genstarte ved n\u00e6ste sideindl\u00e6sning.<\/p>\n<p>Det er her, at Inertia kommer ind i billedet.<\/p>\n<p>Inertia er grundl\u00e6ggende et routing-bibliotek p\u00e5 klientsiden. Det giver dig mulighed for at navigere mellem sider uden at skulle genindl\u00e6se hele siden. Dette opn\u00e5s via komponenten <code>&lt;Link&gt;<\/code>, som er en letv\u00e6gtsindpakning omkring et standard anchor-tag.<\/p>\n<p>N\u00e5r du klikker p\u00e5 et Inertia-link, opfanger Inertia klikket og omdirigerer dig i stedet til XHR. Browseren vil ikke genindl\u00e6se siden p\u00e5 denne m\u00e5de, hvilket giver brugeren en fuld oplevelse med en enkelt side.<\/p>\n<h2>Kom godt i gang med 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=\"En simpel side med \"Kinsta Blog\" i et bl\u00e5t banner \u00f8verst og en enkelt r\u00e6kke af pr\u00f8veartikelkort.\" width=\"1024\" height=\"640\"><figcaption id=\"caption-attachment-134651\" class=\"wp-caption-text\">En eksempelside lavet med Inertia.js<\/figcaption><\/figure>\n<p>For at forst\u00e5 Inertia, og hvordan man integrerer det med Laravel, vil vi bygge en blog-webapp ved navn <strong>Kinsta Blog<\/strong> ved hj\u00e6lp af den mest kraftfulde kombination, Laravel til backend, Vue.js til JavaScript-frontend og Tailwind CSS til styling.<\/p>\n<p>Hvis du foretr\u00e6kker at f\u00f8lge denne vejledning i et lokalt milj\u00f8, kan du bruge <a href=\"https:\/\/kinsta.com\/dk\/devkinsta\/\">DevKinsta<\/a>, et kraftfuldt v\u00e6rkt\u00f8j til udviklere, designere og bureauer, der g\u00f8r det muligt for dem at konstruere WordPress-webapps med en enkelt og flere sider. Heldigvis kan WordPress nemt integreres med Laravel ved hj\u00e6lp af <a href=\"https:\/\/github.com\/corcel\/corcel\">Corcel<\/a>-pakken.<\/p>\n<h3>Foruds\u00e6tninger<\/h3>\n<p>For at f\u00e5 mest muligt ud af denne vejledning b\u00f8r du v\u00e6re bekendt med f\u00f8lgende:<\/p>\n<ul>\n<li>Laravel-grundelementer (installation, database, databasemigrationer, Eloquent Models, controllere og routing)<\/li>\n<li>Vue.js grundl\u00e6ggende (installation, struktur og formularer)<\/li>\n<\/ul>\n<p>Hvis du f\u00f8ler dig usikker, kan du tjekke disse fantastiske <a href=\"https:\/\/kinsta.com\/dk\/blog\/laravel-tutorial\/\">gratis og betalte Laravel-tutorials<\/a>. Ellers, s\u00e5 lad os springe ud i det.<\/p>\n<h3>Trin 1: Installer Core Elements<\/h3>\n<p>For at fokusere p\u00e5 Inertia.js og komme til den sjove del med det samme, skal du sikre dig, at du har f\u00f8lgende ops\u00e6tning klar til at g\u00e5:<\/p>\n<ol>\n<li>Frisk-installeret Laravel 9-projekt ved navn <code>kinsta-blog<\/code><\/li>\n<li>Tailwind CSS CLI installeret i vores Laravel-projekt<\/li>\n<li>Billedfil &#8220;kinsta-logo.png.&#8221; Download og udpak Kinsta-logopakken fra <a href=\"https:\/\/kinsta.com\/dk\/presse\/\">https:\/\/kinsta.com\/press\/<\/a> og kopier kinsta-logo2.png til public\/images-biblioteket som kinsta-logo.png<\/li>\n<li>To blade-komponenter i <strong>kinsta-blog\/resources\/views<\/strong> til visning af bloggens hjemmeside og en enkelt artikel p\u00e5 bloggen som vist nedenfor:&#8221;\/resources\/views\/index<strong>.blade.php<\/strong>&#8220;:\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>&#8220;\/resources\/views\/<strong>show.blade.php<\/strong>&#8220;:<\/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>MySQL lokal database ved navn <code>kinsta_blog<\/code> forbundet til vores projekt:&#8221;<strong>.env<\/strong>&#8220;:\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>Artikelmodel, migreringer og fabrikker: &#8220;app\/Models\/<strong>Article.php<\/strong>&#8220;:\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>&#8220;database\/migrations\/<strong>create_articles_table.php<\/strong>&#8220;:<\/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>&#8220;database\/factories\/<strong>ArticleFactory.php<\/strong>&#8220;:<\/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>Det er alt, hvad vi beh\u00f8ver for at komme i gang! Lad os nu komme til sagen og introducere Inertia.js til vores projekt.<\/p>\n<h3>Trin 2: Installer Inertia<\/h3>\n<p>Inertia installationsprocessen er opdelt i to hovedfaser: server-side (Laravel) og klientside (VueJs).<\/p>\n<p>Den officielle installationsvejledning i Inertia-dokumentationen er lidt for\u00e6ldet, fordi <a href=\"https:\/\/vitejs.dev\/guide\/#scaffolding-your-first-vite-project\">Laravel 9 nu bruger Vite<\/a> som standard, men vi vil ogs\u00e5 gennemg\u00e5 dette.<\/p>\n<h4>1. Server-side<\/h4>\n<p>Det f\u00f8rste vi skal g\u00f8re er at installere Inertia server-side adaptere med nedenst\u00e5ende terminalkommando via Composer.<\/p>\n<pre><code class=\"language-bash\">composer require inertiajs\/inertia-laravel<\/code><\/pre>\n<p>Nu skal vi ops\u00e6tte vores rodskabelon, som vil v\u00e6re en enkelt bladfil, der vil blive brugt til at indl\u00e6se dine CSS- og JS-filer, samt en Inertia-root, der vil blive brugt til at starte vores JavaScript-applikation.<\/p>\n<p>Fordi vi bruger den nyeste version Laravel 9 v9.3.1, skal vi ogs\u00e5 aktivere Vite til at arbejde sin magi ved at inkludere det i vores tags i \/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>Bem\u00e6rk, hvordan vi er i stand til at hente projektets titel dynamisk ved at tilf\u00f8je <code>inertia<\/code> -attributten til <code>&lt;title&gt;<\/code> -tags.<\/p>\n<p>Vi tilf\u00f8jede ogs\u00e5 <code>@vite<\/code> -direktivet til head for at lade Vite kende stien til vores JavaScript-hovedfil, hvor vi oprettede vores app og importerede vores CSS. Vite er et v\u00e6rkt\u00f8j, der hj\u00e6lper med JavaScript- og CSS-udvikling ved at give udviklerne mulighed for at se frontend-\u00e6ndringer uden at skulle opdatere siden under lokal udvikling.<\/p>\n<p>Vores n\u00e6ste skridt bliver at oprette <strong>HandleInertiaRequests<\/strong> middleware og udgive den til vores projekt. Det kan vi g\u00f8re ved at affyre nedenst\u00e5ende terminalkommando i rodmappen for vores projekt:<\/p>\n<pre><code class=\"language-bash\">php artisan inertia:middleware<\/code><\/pre>\n<p>N\u00e5r dette er f\u00e6rdigt, skal du g\u00e5 til &#8220;App\/Http\/<strong>Kernel.php<\/strong>&#8221; og registrere <code>HandleInertiaRequests<\/code> som det sidste element i dine web middlewares:<\/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>Dern\u00e6st skal vi installere vores Vue.js 3-afh\u00e6ngigheder p\u00e5 frontend-siden p\u00e5 samme m\u00e5de som p\u00e5 server-siden:<\/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>Dern\u00e6st skal du tr\u00e6kke Vue.js 3 ind:<\/p>\n<pre><code class=\"language-bash\">npm install vue@next<\/code><\/pre>\n<p>Derefter skal du opdatere din prim\u00e6re JavaScript-fil for at initialisere Inertia.js med Vue.js 3, Vite og Laravel:<\/p>\n<p>&#8220;resources\/js\/<strong>app.js<\/strong>&#8220;:<\/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>I ovenst\u00e5ende kodestykke bruger vi Laravels plugin <code>resolvePageComponent<\/code>, og vi fort\u00e6ller det, at det skal uploade vores komponenter fra mappen <strong>.\/Pages\/$name.vue<\/strong>. Dette skyldes, at vi senere i vores projekt vil gemme vores Inertia-komponenter i denne mappe, og dette plugin vil hj\u00e6lpe os med automatisk at indl\u00e6se disse komponenter fra den korrekte mappe.<\/p>\n<p>Det eneste, der er tilbage, er at installere <code>vitejs\/plugin-vue<\/code>:<\/p>\n<pre><code class=\"language-bash\">npm i @vitejs\/plugin-vue<\/code><\/pre>\n<p>Og opdatere <strong>vite.config.js<\/strong>-filen:<\/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>Det sidste trin er at installere vores afh\u00e6ngigheder og kompilere vores filer:<\/p>\n<pre><code class=\"language-bash\">npm install\n\nnpm run dev<\/code><\/pre>\n<p>Og voil\u00e0! Du har f\u00e5et dig en fungerende Laravel 9-applikation med Vue.js 3 og Vite. Nu skal vi se noget der sker i aktion!<\/p>\n<h2>Oprettelse af inertiesider<\/h2>\n<p>Kan du huske de to blade-filer (<strong>index<\/strong> og <strong>show<\/strong>) til visning af vores hjemmeside og en enkelt artikel?<\/p>\n<p>Den eneste blade-fil vi skal bruge, mens vi bruger Inertia, er <strong>app.blade.php<\/strong>, som vi allerede brugte en gang, da vi installerede Inertia. S\u00e5 hvad sker der med disse filer nu?<\/p>\n<p>Vi vil omdanne disse filer fra blade-komponenter til Inertia.js-komponenter.<\/p>\n<p>Hver side i din applikation har sin egen controller og JavaScript-komponent med Inertia. P\u00e5 den m\u00e5de kan du kun f\u00e5 de data, der er n\u00f8dvendige for den p\u00e5g\u00e6ldende side, uden at bruge en API. Inertia-sider er intet andet end JavaScript-komponenter, i vores tilf\u00e6lde er det Vue.js-komponenter. De har ikke noget s\u00e6rligt bem\u00e6rkelsesv\u00e6rdigt ved dem. S\u00e5 det vi vil g\u00f8re er at indpakke alt HTML-indhold mellem <code>&lt;template&gt;<\/code> tags og alt relateret til JavaScript vil blive indpakket med <code>&lt;script&gt;<\/code> tags.<\/p>\n<p>Opret en mappe kaldet &#8220;Pages&#8221; og flyt dine filer dertil. S\u00e5 vi vil have &#8220;<strong>index.blade.php<\/strong>&#8221; og &#8220;<strong>show.blade.php<\/strong>&#8221; i &#8220;<strong>.\/resources\/js\/Pages<\/strong>&#8220;. Derefter \u00e6ndrer vi filformatet til &#8220;.vue&#8221; i stedet for &#8220;.blade.php&#8221;, mens vi g\u00f8r det f\u00f8rste bogstav i deres navne til store bogstaver og g\u00f8r indholdet til en standard Vue.js-komponent. Vi udelukker <code>&lt;html&gt;<\/code>, <code>&lt;head&gt;<\/code> og <code>&lt;body&gt;<\/code> -taggene, fordi de allerede er inkluderet i hovedroden blade-komponenten.<\/p>\n<p>&#8220;resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8220;:<\/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>&#8220;resources\/js\/Pages\/<strong>Show.vue<\/strong>&#8220;:<\/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>Der er noget, der virkelig generer mig! Vi bliver ved med at kopiere og inds\u00e6tte vores header og footer i hver komponent, hvilket ikke er en s\u00e6rlig god praksis. Lad os oprette et Inertia grundl\u00e6ggende Layout til at gemme vores vedvarende komponenter.<\/p>\n<p>Opret en mappe kaldet &#8220;Layouts&#8221; i &#8220;<strong>\/resources\/js<\/strong>&#8221; og inden for denne mappe opretter du en fil med navnet &#8220;KinstaLayout.vue&#8221;. Denne fil vil have vores header og footer og <code>main<\/code> med en <code>&lt;slot \/&gt;<\/code> for at tillade alle komponenter, der er pakket med dette layout, at blive indlejret i det. Denne fil skal se s\u00e5ledes ud :<\/p>\n<p>&#8220;resources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>&#8220;:<\/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>Vi vil derefter importere dette nye layout i vores sider og pakke alt HTML-indholdet ind i det. Vores komponenter skal se s\u00e5ledes ud:<\/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 og Inertia Render<\/h2>\n<p>Lad os f\u00f8rst bruge &#8220;<strong>ArticleFactory<\/strong>&#8220;-filen, som vi har fra vores tutorial-startpunkt, og s\u00e5 nogle artikler i vores database.<\/p>\n<p>&#8220;database\/seeders\/<strong>databaseSeeder.php<\/strong>&#8220;:<\/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>Derefter trykker du p\u00e5 nedenst\u00e5ende terminalkommando for at migrere dine tabeller og plante de falske data fra fabrikkerne:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh --seed<\/code><\/pre>\n<p>Dette vil oprette 10 falske artikler i databasen, som vi skal sende til vores visning ved hj\u00e6lp af Laravel-routing. Nu hvor vi bruger Inertia til at rendere visninger, vil den m\u00e5de vi plejede at skrive vores routes p\u00e5 \u00e6ndre sig lidt. Lad os oprette vores f\u00f8rste Laravel Inertia-route i &#8220;routes\/<strong>web.php<\/strong>&#8221; og returnere forsidevisningen fra &#8220;\/resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8220;.<\/p>\n<p>&#8220;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');<\/code><\/pre>\n<p>Bem\u00e6rk, at vi importerede <code>Inertia<\/code> og ikke brugte <code>view()<\/code> Laravel-hj\u00e6lperen til at returnere visningen, men i stedet brugte <code>Inertia::render<\/code>. Inertia vil ogs\u00e5 som standard s\u00f8ge efter det filnavn, vi n\u00e6vnte i vores route i <strong>Pages<\/strong>-mappen i &#8220;resources\/js&#8221;.<\/p>\n<p>G\u00e5 til Indeksfilen og indstil de hentede data som en prop og loop over dem med <code>v-for<\/code> for at vise resultaterne. Mellem scripttaggene defineres de overf\u00f8rte data som en prop. Det eneste Inertia skal vide er, hvilken type data du forventer, hvilket i vores tilf\u00e6lde er et &#8220;articles&#8221;-objekt, der indeholder et array af artikler.<\/p>\n<p>&#8220;resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8220;:<\/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>Bem\u00e6rk, at det er nok kun at definere det som en prop uden at returnere det, fordi vi bruger <code>setup<\/code> -formatet for Vue.js 3-kompositions-API. Hvis vi bruger options API, skal vi returnere det.<\/p>\n<p>Lad os lave en 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> (lad den k\u00f8re, fordi vi bruger Vite) og <code>php artisan serve<\/code> for at starte laravel-udviklingsserveren og f\u00e5 adgang til vores websted, vil vi se den forventede side, der viser alle ti artikler i databasen.<\/p>\n<p>Nu bruger vi <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/vuejs-devtools\/nhdogjmejiglipccpnnnanhbledajbpd?hl=en\">Google Chromes Vue DevTools<\/a>-udvidelse, som giver os mulighed for at debugge min applikation. Lad os vise dig, hvordan vores data bliver sendt til komponenten.<\/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=\"Chromes Vue DevTools-udvidelse, der viser en liste over Inertia-egenskaber for den \u00e5bne side.\" width=\"1024\" height=\"543\"><figcaption id=\"caption-attachment-134667\" class=\"wp-caption-text\">Inspektion af inertiegenskaber.<\/figcaption><\/figure>\n<p>&#8220;articles&#8221; overf\u00f8res til komponenten som et prop-objekt, der indeholder et array af artikler; hver artikel i arrayet er ogs\u00e5 et object med egenskaber, der svarer til de data, den har erhvervet fra databasen. Det betyder, at alle data, som vi overf\u00f8rer fra Laravel til Inertia, vil blive behandlet som en prop.<\/p>\n<h2>Brug af Tailwind CSS med Inertia.js<\/h2>\n<p>Da Tailwind allerede er installeret i vores projekt i udgangspunktet, skal vi blot fort\u00e6lle det at l\u00e6se vores Inertia-komponenter. Dette kan g\u00f8res ved at redigere &#8220;<strong>tailwind.config.js<\/strong>&#8221; som f\u00f8lger:<\/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>S\u00f8rg derefter for, at vi har importeret vores CSS-fil i &#8220;resources\/js\/<strong>app.js<\/strong>&#8220;:<\/p>\n<pre><code class=\"language-js\">import \"..\/css\/app.css\";<\/code><\/pre>\n<p>Og nu er vi klar til at style vores komponenter.<\/p>\n<p>&#8220;resources\/js\/js\/Pages\/<strong>Index.vue<\/strong>&#8220;:<\/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>&#8220;resources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>&#8220;:<\/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>Hvis du kigger i browseren, vil du bem\u00e6rke, at Vite allerede har opdateret siden med Tailwind-magi.<\/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=\"Et rullende billede, der viser en fungerende version af \"Kinsta Blog\"-eksemplet fra tidligere.\" width=\"911\" height=\"620\"><figcaption id=\"caption-attachment-134669\" class=\"wp-caption-text\">Rendering af inertiegenskaber.<\/figcaption><\/figure>\n<h2>Inertia-links<\/h2>\n<p>Nu hvor vi har en fungerende hjemmeside, der kan vise alle artikler i databasen, skal vi oprette en anden rute til at vise de enkelte artikler. Lad os oprette en ny rute og indstille URL&#8217;en til et &#8220;id&#8221;-wildcard:<\/p>\n<p>&#8220;routes\/<strong>web.php<\/strong>&#8221;<\/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>Vi importerede modellen &#8220;Article&#8221; og tilf\u00f8jede en ny rute for at returnere <strong>Show.vue<\/strong> Inertia-komponenten. Vi udnyttede ogs\u00e5 <a href=\"https:\/\/laravel.com\/docs\/master\/routing#customizing-the-key\">Laravels route-modelbinding<\/a>, som g\u00f8r det muligt for Laravel automatisk at hente den artikel, vi henviser til.<\/p>\n<p>Nu mangler vi blot en m\u00e5de at bes\u00f8ge denne rute p\u00e5 ved at klikke p\u00e5 et link fra hjemmesiden uden at skulle genindl\u00e6se hele siden. Dette er muligt med Inertias magiske v\u00e6rkt\u00f8j <code>&lt;Link&gt;<\/code>. Vi n\u00e6vnte i indledningen, at Inertia bruger <code>&lt;Link&gt;<\/code> som en wrapper for et standard anchortag <code>&lt;a&gt;<\/code>, og at denne wrapper er beregnet til at g\u00f8re sidebes\u00f8g s\u00e5 problemfri som muligt. I Inertia kan <code>&lt;Link&gt;<\/code> -tagget opf\u00f8re sig som et anchortag, der udf\u00f8rer <code>&lt;GET&gt;<\/code> -foresp\u00f8rgsler, men det kan ogs\u00e5 fungere som <code>&lt;button&gt;<\/code> og <code>&lt;form&gt;<\/code> p\u00e5 samme tid. Lad os se, hvordan vi kan anvende det p\u00e5 vores projekt.<\/p>\n<p>I vores Index.vue vil vi importere <code>&lt;Link&gt;<\/code> fra Inertia og fjerne ankertagget <code>&lt;a&gt;<\/code> og erstatte det med Inertia <code>&lt;Link&gt;<\/code> -tags. Attributten <code>href<\/code> vil blive sat til den rute-URL, som vi tidligere har lavet til visning af artiklen:<\/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>Lad os style <strong>Show.vue<\/strong> med Tailwind for at f\u00e5 den til at se lidt mere p\u00e6nere ud og klar til vores bes\u00f8g. Og vi skal ogs\u00e5 lade den vide, at den skal forvente et &#8220;Artikel&#8221;-object og s\u00e6tte det som en prop:<\/p>\n<pre><code class=\"language-html\">&lt;script setup&gt;\nimport KinstaLayout from \"..\/Layouts\/KinstaLayout.vue\";\n\ndefineProps({\n    article: Object,\n});\n&lt;\/script&gt;\n\n&lt;template&gt;\n    &lt;KinstaLayout&gt;\n        &lt;article class=\"mx-auto mt-10 flex justify-center max-w-5xl border-b-2\"&gt;\n            &lt;img\n                src=\"\/images\/kinsta-logo.png\"\n                class=\"w-80 h-80 rounded-xl mx-auto py-5\"\n                alt=\"\"\n            \/&gt;\n            &lt;div class=\"text-left flex flex-col pt-5 pb-10 px-10\"&gt;\n                &lt;h1 class=\"text-xl font-semibold mb-10\"&gt;{{ article.title }}&lt;\/h1&gt;\n                &lt;p&gt;{{ article.body }}&lt;\/p&gt;\n            &lt;\/div&gt;\n        &lt;\/article&gt;\n    &lt;\/KinstaLayout&gt;\n&lt;\/template&gt;<\/code><\/pre>\n<p>N\u00e5r vi nu klikker p\u00e5 artiklens titel eller p\u00e5 &#8220;L\u00e6s mere&#8221;, vil vi p\u00e5 magisk vis blive transporteret til <strong>Show.vue<\/strong> uden at opdatere siden.<\/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=\"Eksempelsiden \"Kinsta Blog\" viser artikelkort med fungerende links.\" width=\"1024\" height=\"596\"><figcaption id=\"caption-attachment-134671\" class=\"wp-caption-text\">Tr\u00e6ghed links p\u00e5 plads.<\/figcaption><\/figure>\n<p>I vores tilf\u00e6lde bruger vi <code>&lt;Link&gt;<\/code> som et anchor tag, der sender en <code>GET<\/code> -foresp\u00f8rgsel til ruten og returnerer de nye data tilbage, men vi kan bruge <code>&lt;Link&gt;<\/code> til ogs\u00e5 <code>POST<\/code>, <code>PUT<\/code>, <code>PATCH<\/code> og <code>DELETE<\/code><\/p>\n<p>&#8220;routes\/<strong>web.php<\/strong>&#8220;:<\/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 Tips og tricks du b\u00f8r kende<\/h2>\n<p>Vi har nu en fungerende SPA bygget med Laravel, Inertia og Tailwind CSS. Men inertia kan hj\u00e6lpe os med at opn\u00e5 s\u00e5 meget mere. Det er tid til at tilegne sig nogle Inertia teknikker, der vil hj\u00e6lpe b\u00e5de udviklere og applikationsbes\u00f8gende.<\/p>\n<h3>Generering af URL&#8217;er<\/h3>\n<p>Du har m\u00e5ske bem\u00e6rket, at vi har tilf\u00f8jet navne til vores Laravel routes uden at bruge det. Inertia giver os mulighed for at bruge vores navngivne routes i vores komponenter i stedet for manuelt at skrive den fulde route ned.<\/p>\n<p>Vi kan opn\u00e5 dette ved at <a href=\"https:\/\/github.com\/tighten\/ziggy#installation\">installere Ziggy-pakken<\/a> i vores projekt:<\/p>\n<pre><code class=\"language-bash\">composer require tightenco\/ziggy<\/code><\/pre>\n<p>Derefter g\u00e5r vi til &#8220;resources\/js\/app.js&#8221; og opdaterer den p\u00e5 denne m\u00e5de:<\/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>G\u00e5 til &#8220;\/resources\/views\/<strong>app.blade.php<\/strong>&#8220;, og opdater head med <code>@routes<\/code>-direktivet:<\/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;og opdater dine NPM-pakker ved at trykke p\u00e5 de to nedenst\u00e5ende terminalkommandoer:<\/p>\n<pre><code class=\"language-bash\">npm install && npm run dev<\/code><\/pre>\n<p>Denne pakke giver os mulighed for at bruge navngivne ruter i vores Inertia-komponenter, s\u00e5 lad os g\u00e5 til <strong>Index.vue<\/strong> og fjerne den gamle manuelle rute og erstatte den med routenavnet, mens vi videregiver dataene normalt, som hvis vi var i vores controller.<\/p>\n<p>Vi vil erstatte dette:<\/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;med dette:<\/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>Dette giver os n\u00f8jagtig den samme opf\u00f8rsel, som vi havde, men det er mere udviklervenligt og yderst nyttigt, n\u00e5r din rute forventer mange parametre.<\/p>\n<h3>Fremskridtsindikatorer<\/h3>\n<p>Dette er en af de fineste funktioner i Inertia.js; fordi SPA giver en interaktiv brugeroplevelse, ville det v\u00e6re en fantastisk tilf\u00f8jelse til applikationen at have konstant feedback om, hvorvidt en anmodning er ved at blive indl\u00e6st. Dette kan opn\u00e5s ved hj\u00e6lp af et separat bibliotek, som Inertia tilbyder.<\/p>\n<p>Biblioteket &#8220;@inertiajs\/progress&#8221; er en wrapper omkring <a href=\"https:\/\/ricostacruz.com\/nprogress\/\">NProgress<\/a>, der betinget viser indl\u00e6sningsindikatorerne i henhold til Inertia-h\u00e6ndelser. Du beh\u00f8ver ikke rigtig at vide, hvordan dette fungerer bag kulisserne, s\u00e5 lad os bare f\u00e5 det til at virke.<\/p>\n<p>Vi kan installere dette bibliotek med nedenst\u00e5ende terminalkommando:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/progress<\/code><\/pre>\n<p>N\u00e5r det er installeret, skal vi importere det i &#8220;<strong>resources\/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>Dette vil vise en loading bar og en loading spinner i sort farve, men vi kan \u00e6ndre farven sammen med andre nyttige muligheder, der kan findes p\u00e5 <a href=\"https:\/\/inertiajs.com\/progress-indicators\">Inertia.js progress indicator dokumentation<\/a>.<\/p>\n<figure id=\"attachment_134672\" aria-describedby=\"caption-attachment-134672\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134672 size-large\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Inertia-progress-indicator-1024x83.gif\" alt=\"Den bl\u00e5 \"Kinsta Blog\"-header med den roterende indikator \u00f8verst til h\u00f8jre.\" width=\"1024\" height=\"83\"><figcaption id=\"caption-attachment-134672\" class=\"wp-caption-text\">Inertia-progressionsindikatoren (\u00f8verst til h\u00f8jre).<\/figcaption><\/figure>\n<h3>Styring af rulning<\/h3>\n<p>I nogle tilf\u00e6lde vil du m\u00e5ske gerne navigere til en ny side, mens du beholder den samme scrollposition. M\u00e5ske har du brug for dette, hvis du giver brugerne mulighed for at efterlade kommentarer; dette vil sende en formular og indl\u00e6se den nye kommentar fra databasen til din komponent; du \u00f8nsker, at dette skal ske, uden at brugeren mister scrollpositionen. Inertia tager sig af dette for os.<\/p>\n<p>I vores tilf\u00e6lde, lad os anvende dette p\u00e5 vores <code>&lt;Link&gt;<\/code> tag i <strong>Index.vue<\/strong>. For at bevare scrollpositionen, mens vi omdirigerer til en anden side med Inertias <code>&lt;Link&gt;<\/code>, er det eneste, vi skal g\u00f8re, at tilf\u00f8je <code>preserve-scroll<\/code> -attributten til <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>SEO-tips<\/h2>\n<p>Siden SPA&#8217;ernes f\u00f8dsel har folk v\u00e6ret optaget af s\u00f8gemaskineoptimering (SEO). Det er almindeligt kendt, at hvis du bruger SPA-tilgangen, vil s\u00f8gemaskinerne have sv\u00e6rt ved at crawle din webapplikation, fordi alt er klientside-renderet, hvilket resulterer i, at dit websted ikke vises \u00f8verst i s\u00f8geresultaterne; ikke desto mindre, hvordan kan det v\u00e6re, at de popul\u00e6re platforme som Facebook og Github nu er SPA&#8217;er og stadig klarer sig godt i SEO?<\/p>\n<p>N\u00e5, men det er ikke l\u00e6ngere en mission: umuligt. Inertia tilbyder et par l\u00f8sninger, der kan hj\u00e6lpe din SPA med at blive SEO-venlig.<\/p>\n<h3>Inertia Vue SSR med Laravel og Vite<\/h3>\n<p>S\u00f8gemaskinerne leder altid efter HTML p\u00e5 din hjemmeside for at identificere indholdet; men hvis du ikke har HTML i dine URL&#8217;er, bliver dette job vanskeligere. N\u00e5r du udvikler SPA&#8217;er, er JavaScript og JSON alt hvad du har p\u00e5 din side. Inertia introducerede en SSR-funktion (Server-Side Rendering), som du kan tilf\u00f8je til dit program. Dette g\u00f8r det muligt for din applikation at pr\u00e6-rendere et indledende sidebes\u00f8g p\u00e5 serveren og derefter sende den renderede HTML til browseren. Dette giver brugerne mulighed for at se og interagere med dine sider, f\u00f8r de er fuldt indl\u00e6st, og det har ogs\u00e5 andre fordele, f.eks. at det forkorter den tid, det tager s\u00f8gemaskinerne at indeksere dit websted.<\/p>\n<p>For at opsummere, hvordan det fungerer, identificerer Inertia, om den k\u00f8rer p\u00e5 en Node.js-server, og renderer komponentnavne, egenskaber, URL og version af aktiver til HTML. Dette vil give brugeren og s\u00f8gemaskinen praktisk talt alt, hvad din side har at byde p\u00e5.<\/p>\n<p>Men fordi vi har med Laravel at g\u00f8re, giver dette ikke meget mening, fordi Laravel er et PHP-framework og ikke k\u00f8rer p\u00e5 en Node.js-server. Derfor vil vi videresende foresp\u00f8rgslen til en Node.js-tjeneste, som vil rendere siden og returnere HTML. Dette vil g\u00f8re vores Laravel Vue-applikation SEO-venlig som standard.<\/p>\n<p>F\u00f8rst skal vi installere Vue.js SSR npm-pakken Vue.js SSR:<\/p>\n<pre><code class=\"language-bash\">npm install @vue\/server-renderer<\/code><\/pre>\n<p>En anden nyttig Inertia &#8220;NPM&#8221;-pakke indeholder en simpel &#8220;HTTP&#8221;-server. Det anbefales kraftigt, at du installerer den:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/server<\/code><\/pre>\n<p>Derefter tilf\u00f8jer vi en ny fil med navnet <strong>ssr.js<\/strong> i &#8220;resources\/js\/&#8221;. Denne fil vil v\u00e6re meget lig den <strong>app.js<\/strong>-fil, som vi oprettede, da vi installerede Inertia, blot vil den blive udf\u00f8rt i Node.js i stedet for i browseren:<\/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>S\u00f8rg for ikke at inkludere alt i <strong>ssr.js<\/strong>-filen, da den ikke vil v\u00e6re synlig for bes\u00f8gende; denne fil er kun til brug for s\u00f8gemaskiner og browsere til at vise dataene p\u00e5 din side, s\u00e5 inkluder kun det, der er vigtigt for dine data, eller kun det, der vil g\u00f8re dine data tilg\u00e6ngelige.<\/p>\n<p>&#8220;Som standard vil Inertias SSR-server operere p\u00e5 port 13714. Du kan dog \u00e6ndre dette ved at angive et andet argument til metoden createServer.&#8221; Inertia DOCss.<\/p>\n<p>Inertia.js DOCs forklarer ikke, hvordan man integrerer Inertia SSR med Vite, men vi vil gennemg\u00e5 dette nu. G\u00e5 til <strong>vite.config.js<\/strong> og inds\u00e6t nedenst\u00e5ende:<\/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>Derefter skal du g\u00e5 til <strong>package.json<\/strong> og \u00e6ndre build-scriptet:<\/p>\n<pre><code class=\"language-json\">\"build\": \"vite build && vite build --ssr\"<\/code><\/pre>\n<p>Hvis vi nu k\u00f8rer <code>npm run build<\/code>, vil Vite bygge vores SSR-pakke til produktion. For flere oplysninger om dette kan du bes\u00f8ge <a href=\"https:\/\/inertiajs.com\/server-side-rendering\">Inertia SSR DOCs<\/a> og <a href=\"https:\/\/laravel-vite.dev\/guide\/features\/ssr.html#building\">Vite SSR DOCs<\/a>.<\/p>\n<h3>Titel og Meta<\/h3>\n<p>Da JavaScript-programmer gengives inden for dokumentets <code>&lt;body&gt;<\/code>, kan de ikke gengive markup til dokumentets <code>&lt;head&gt;<\/code>, da det ligger uden for deres anvendelsesomr\u00e5de. Inertia har en <code>&lt;Head&gt;<\/code> -komponent, som kan bruges til at indstille siden <code>&lt;title&gt;<\/code>, <code>&lt;meta&gt;<\/code> -tags og andre <code>&lt;head&gt;<\/code> -komponenter.<\/p>\n<p>For at tilf\u00f8je <code>&lt;head&gt;<\/code> -elementet til din side skal vi importere <code>&lt;Head&gt;<\/code> fra Inertia p\u00e5 samme m\u00e5de som vi gjorde med <code>&lt;Link&gt;<\/code> -komponenten:<\/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>Vi kan ogs\u00e5 tilf\u00f8je en global titel for alle sider, dette vil tilf\u00f8je dit programnavn ved siden af titlen p\u00e5 alle sider. Det har vi allerede gjort i <strong>app.js<\/strong>-filen:<\/p>\n<pre><code class=\"language-js\">createInertiaApp({\n    title: (title) =&gt; `${title} - ${appName}`,\n    \/\/\n});<\/code><\/pre>\n<p>Det betyder, at hvis vi tilf\u00f8jer <code>&lt;Head title=\"Home\"&gt;<\/code> p\u00e5 vores applikations hjemmeside med en titel, vil det blive gengivet p\u00e5 f\u00f8lgende m\u00e5de: <code>&lt;title&gt;Home - My App&lt;\/title&gt;<\/code>.<\/p>\n<h3>Overv\u00e5gning af din app<\/h3>\n<p>Hastighed er en af de vigtigste faktorer i optimering af SEO-pr\u00e6stationer p\u00e5 dit websted. Hvis du bruger WordPress til dit websted, vil <a href=\"https:\/\/kinsta.com\/dk\/apm-tool\/\">Kinsta APM<\/a> af denne grund hj\u00e6lpe dig med at overv\u00e5ge og holde et v\u00e5gent \u00f8je med din applikation i aktion. Det hj\u00e6lper dig med at identificere WordPress-ydelsesproblemer og er gratis tilg\u00e6ngeligt p\u00e5 alle Kinsta-hostede websteder.<\/p>\n<h2>Opsummering<\/h2>\n<p>Inertia.js er en af de mest betydningsfulde teknologier, der findes; bland det med Laravel, og du har en moderne Single-Page-applikation bygget med PHP og JavaScript. Taylor Otwell, skaberen af Laravel, er s\u00e5 interesseret i Inertia, at Laravel har lanceret sine mest popul\u00e6re startpakker, Laravel Breeze og Jetstream, med Inertia og SSR-underst\u00f8ttelse.<\/p>\n\n<p>Hvis du er Laravel-fan eller professionel udvikler, vil Inertia.js utvivlsomt fange dit \u00f8je. I denne tutorial har vi lavet en meget grundl\u00e6ggende og ligetil blog p\u00e5 kun f\u00e5 minutter. Der er stadig masser at l\u00e6re om inertia, og dette er m\u00e5ske kun den f\u00f8rste af mange artikler og tutorials.<\/p>\n<p>Hvad mere om Laravel vil du gerne have os til at udforske? Lad os vide det i kommentarfeltet nedenfor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Multi Page Applications (MPA&#8217;er) bliver mindre og mindre popul\u00e6re for hver dag der g\u00e5r. Ber\u00f8mte platforme som Facebook, Twitter, YouTube, Github og mange andre bruger allerede &#8230;<\/p>\n","protected":false},"author":266,"featured_media":47282,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[599,559,285,621,622],"topic":[712],"class_list":["post-47281","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>S\u00e5dan bruger du Inertia.js i dine Laravel-projekter - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"I denne artikel vil vi unders\u00f8ge, hvordan du bruger Inertia.js sammen med Laravel, Vue og Tailwind CSS til at skabe en moderne webapp.\" \/>\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\/dk\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter\" \/>\n<meta property=\"og:description\" content=\"I denne artikel vil vi unders\u00f8ge, hvordan du bruger Inertia.js sammen med Laravel, Vue og Tailwind CSS til at skabe en moderne webapp.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-12T15:01:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T10:13:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/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=\"I denne artikel vil vi unders\u00f8ge, hvordan du bruger Inertia.js sammen med Laravel, Vue og Tailwind CSS til at skabe en moderne webapp.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mostafa Said\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/\"},\"author\":{\"name\":\"Mostafa Said\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\"},\"headline\":\"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter\",\"datePublished\":\"2022-12-12T15:01:15+00:00\",\"dateModified\":\"2023-08-24T10:13:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/\"},\"wordCount\":4012,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png\",\"keywords\":[\"inertia.js\",\"JavaScript\",\"laravel\",\"php frameworks\",\"spa\"],\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/\",\"name\":\"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png\",\"datePublished\":\"2022-12-12T15:01:15+00:00\",\"dateModified\":\"2023-08-24T10:13:50+00:00\",\"description\":\"I denne artikel vil vi unders\u00f8ge, hvordan du bruger Inertia.js sammen med Laravel, Vue og Tailwind CSS til at skabe en moderne webapp.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"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\/dk\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\",\"name\":\"Mostafa Said\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/mostafasaid\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter - Kinsta\u00ae","description":"I denne artikel vil vi unders\u00f8ge, hvordan du bruger Inertia.js sammen med Laravel, Vue og Tailwind CSS til at skabe en moderne webapp.","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\/dk\/blog\/laravel-inertia\/","og_locale":"da_DK","og_type":"article","og_title":"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter","og_description":"I denne artikel vil vi unders\u00f8ge, hvordan du bruger Inertia.js sammen med Laravel, Vue og Tailwind CSS til at skabe en moderne webapp.","og_url":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2022-12-12T15:01:15+00:00","article_modified_time":"2023-08-24T10:13:50+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png","type":"image\/png"}],"author":"Mostafa Said","twitter_card":"summary_large_image","twitter_description":"I denne artikel vil vi unders\u00f8ge, hvordan du bruger Inertia.js sammen med Laravel, Vue og Tailwind CSS til at skabe en moderne webapp.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png","twitter_creator":"@kinsta_dk","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Mostafa Said","Estimeret l\u00e6setid":"23 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/"},"author":{"name":"Mostafa Said","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996"},"headline":"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter","datePublished":"2022-12-12T15:01:15+00:00","dateModified":"2023-08-24T10:13:50+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/"},"wordCount":4012,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png","keywords":["inertia.js","JavaScript","laravel","php frameworks","spa"],"inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/","url":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/","name":"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png","datePublished":"2022-12-12T15:01:15+00:00","dateModified":"2023-08-24T10:13:50+00:00","description":"I denne artikel vil vi unders\u00f8ge, hvordan du bruger Inertia.js sammen med Laravel, Vue og Tailwind CSS til at skabe en moderne webapp.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/12\/laravel-inertia.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/dk\/emner\/laravel\/"},{"@type":"ListItem","position":3,"name":"S\u00e5dan bruger du Inertia.js i dine Laravel-projekter"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","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\/dk\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996","name":"Mostafa Said","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/mostafasaid\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/266"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=47281"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47281\/revisions"}],"predecessor-version":[{"id":50456,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47281\/revisions\/50456"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/translations\/dk"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47281\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/47282"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=47281"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=47281"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=47281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}