{"id":47885,"date":"2022-12-12T15:20:27","date_gmt":"2022-12-12T15:20:27","guid":{"rendered":"https:\/\/kinsta.com\/se\/?p=47885&#038;preview=true&#038;preview_id=47885"},"modified":"2023-05-10T12:17:18","modified_gmt":"2023-05-10T12:17:18","slug":"laravel-inertia","status":"publish","type":"post","link":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/","title":{"rendered":"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt"},"content":{"rendered":"<p>MPA: er (Multi-page applications) blir allt mindre popul\u00e4ra f\u00f6r varje dag som g\u00e5r. Ber\u00f6mda plattformar som Facebook, Twitter, YouTube, Github och m\u00e5nga andra anv\u00e4nder redan SPA-teknik (single-page application) i st\u00e4llet.<\/p>\n<p>Denna trendiga teknik g\u00f6r det m\u00f6jligt f\u00f6r anv\u00e4ndarna att nyttja webbapplikationer snabbt och responsivt eftersom allt \u00e4r renderat p\u00e5 klientsidan. Detta kan dock vara en pl\u00e5ga f\u00f6r utvecklare som bygger serverbaserade renderade applikationer med ramverk som Laravel eller Django.<\/p>\n<p>Lyckligtvis s\u00e5 har Inertia.js kommit till unds\u00e4ttning.<\/p>\n\n<p>I den h\u00e4r artikeln s\u00e5 visar vi hur du kan komma ig\u00e5ng med Inertia.js och hur du kan anv\u00e4nda detta tillsammans med Laravel, Vue.js och Tailwind CSS f\u00f6r att skapa en modern bloggwebbapplikation. Vi kommer \u00e4ven att dela med oss av hur man g\u00f6r SPA: er mer SEO-v\u00e4nliga, samt n\u00e5gra andra knep.<\/p>\n<p>Om du precis har b\u00f6rjat med Laravel s\u00e5 rekommenderar vi att du l\u00e4ser den <a href=\"https:\/\/kinsta.com\/blog\/laravel-developer\/\">h\u00e4r artikeln f\u00f6rst<\/a> s\u00e5 att du \u00e4r redo att k\u00f6ra ig\u00e5ng.<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>Varf\u00f6r SPA?<\/h2>\n<p>Innan vi kan fr\u00e5ga oss varf\u00f6r vi ska anv\u00e4nda Inertia s\u00e5 m\u00e5ste vi fr\u00e5ga: &#8221;Varf\u00f6r SPA?&#8221;<\/p>\n<p>Varf\u00f6r skulle n\u00e5gon f\u00f6redra klient-side renderade applikationer framf\u00f6r traditionella server-side applikationer? Vad kan f\u00e5 en fullstack Laravel-utvecklare att s\u00e4ga adj\u00f6 till <a href=\"https:\/\/kinsta.com\/se\/blog\/vad-ar-laravel\/#templating\">blade-komponenter<\/a>?<\/p>\n<p>Det korta svaret: f\u00f6r att snabbhet och responsivitet \u00e4r avg\u00f6rande f\u00f6r ett framg\u00e5ngsrikt anv\u00e4ndarbeteende.<\/p>\n<p>N\u00e4r det g\u00e4ller MPA: er s\u00e5 skickar webbl\u00e4saren st\u00e4ndigt f\u00f6rfr\u00e5gningar till backend, som sedan utf\u00f6r m\u00e5nga databasfr\u00e5gor. Efter att databasen och servern har bearbetat f\u00f6rfr\u00e5gningarna och levererat dem till webbl\u00e4saren, renderas sidan.<\/p>\n<p>Men SPA fungerar annorlunda. Applikationen tar med sig allt som anv\u00e4ndaren beh\u00f6ver direkt till sidan, vilket g\u00f6r att webbl\u00e4saren inte beh\u00f6ver skicka fr\u00e5gor eller ladda om sidan f\u00f6r att \u00e5terge nya HTML-element.<\/p>\n<p>Tack vare denna unika anv\u00e4ndarupplevelse s\u00e5 kr\u00e4ver m\u00e5nga stora f\u00f6retag att deras webbplatser ska bli ensidiga applikationer.<\/p>\n<p>Med detta sagt s\u00e5 kan det vara sv\u00e5rt f\u00f6r Laravel-utvecklare att skapa en enkelsidesapplikation eftersom det skulle kr\u00e4va att de b\u00f6rjar anv\u00e4nda Vue.js eller React i st\u00e4llet f\u00f6r blade-mallar, vilket leder till att m\u00e5nga Laravel-juveler som sparar tid och arbete g\u00e5r f\u00f6rlorade.<\/p>\n<p>Tack vare Inertia.js s\u00e5 har dock allt detta f\u00f6r\u00e4ndrats.<\/p>\n<h2>Varf\u00f6r Inertia?<\/h2>\n<p>Om Laravel-utvecklare skulle bygga webb-SPA: er med Vue ist\u00e4llet f\u00f6r Inertia s\u00e5 skulle de beh\u00f6va konfigurera API: er och returnera JSON-data med Laravel och sedan anv\u00e4nda n\u00e5got som AXIOS f\u00f6r att h\u00e4mta data i Vue-komponenter. De skulle \u00e4ven beh\u00f6va n\u00e5got som Vue Router f\u00f6r att hantera rutter, vilket skulle inneb\u00e4ra att de skulle f\u00f6rlora Laravel-routning samt middlewares och kontrollerare.<\/p>\n<p>Inertia.js g\u00f6r det \u00e5 andra sidan m\u00f6jligt f\u00f6r utvecklare att bygga moderna enkelsidiga Vue-, React- och Svelte-appar med hj\u00e4lp av klassisk server-side routing och kontrollerare. Inertia utformades f\u00f6r Laravel-, Ruby on Rails- och Django-utvecklare f\u00f6r att de skulle kunna bygga appar utan att \u00e4ndra sina kodningstekniker f\u00f6r att skapa styrenheter. De skulle \u00e4ven kunna h\u00e4mta data fr\u00e5n en databas och rendera vyer.<\/p>\n<p>Tack vare Inertia.js s\u00e5 kommer Laravel-utvecklare att k\u00e4nna sig som hemma.<\/p>\n<h2>Hur Inertia fungerar<\/h2>\n<p>Att bygga SPA med endast Laravel och Vue ger dig en fullst\u00e4ndig JavaScript-sida f\u00f6r din frontend, men inte en enkelsidig app-upplevelse. Varje klickad l\u00e4nk kommer att f\u00e5 ditt ramverk p\u00e5 klientsidan att starta om vid n\u00e4sta sidladdning.<\/p>\n<p>Det \u00e4r h\u00e4r som Inertia kommer in i bilden.<\/p>\n<p>Inertia \u00e4r i princip ett routingbibliotek f\u00f6r klientsidan. Det g\u00f6r det m\u00f6jligt att navigera mellan sidor utan att det kr\u00e4vs en omladdning av hela sidan. Detta sker via komponenten <code>&lt;Link&gt;<\/code>, som \u00e4r en l\u00e4ttviktig omslagsform kring en standard ankartagg.<\/p>\n<p>N\u00e4r du klickar p\u00e5 en Inertia-l\u00e4nk s\u00e5 f\u00e5ngar Inertia upp klicket och omdirigerar dig till XHR i st\u00e4llet. Webbl\u00e4saren kommer inte att ladda om sidan, vilket ger anv\u00e4ndaren en fullst\u00e4ndig upplevelse av en enda sida.<\/p>\n<h2>Komma ig\u00e5ng 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 exempelsida gjord med Inertia.js\" width=\"1024\" height=\"640\"><figcaption id=\"caption-attachment-134651\" class=\"wp-caption-text\">En exempelsida gjord med Inertia.js<\/figcaption><\/figure>\n<p>F\u00f6r att f\u00f6rst\u00e5 Inertia och hur man integrerar det med Laravel s\u00e5 ska vi bygga en bloggwebbapplikation vid namn <strong>Kinsta Blog<\/strong> med hj\u00e4lp av den mest kraftfulla kombinationen. Vi ska nyttja Laravel f\u00f6r backend, Vue.js f\u00f6r JavaScript-frontend och Tailwind CSS f\u00f6r styling.<\/p>\n<p>Om du f\u00f6redrar att f\u00f6lja den h\u00e4r handledningen i en lokal milj\u00f6 s\u00e5 kan du anv\u00e4nda <a href=\"https:\/\/kinsta.com\/se\/devkinsta\/\">DevKinsta<\/a>, ett kraftfullt verktyg f\u00f6r utvecklare, designers och agenturer som g\u00f6r det m\u00f6jligt f\u00f6r dem att konstruera WordPress-webbappar med en eller flera sidor. Lyckligtvis s\u00e5 kan WordPress enkelt integreras med Laravel med hj\u00e4lp av <a href=\"https:\/\/github.com\/corcel\/corcel\">Corcel<\/a>-paketet.<\/p>\n<h3>F\u00f6ruts\u00e4ttningar<\/h3>\n<p>F\u00f6r att f\u00e5 ut s\u00e5 mycket som m\u00f6jligt av den h\u00e4r handledningen s\u00e5 b\u00f6r du k\u00e4nna till f\u00f6ljande:<\/p>\n<ul>\n<li>Laravel-grunderna (installation, databas, databasmigreringar, Eloquent Models, kontrollerare och routing)<\/li>\n<li>Vue.js-grunderna (installation, struktur och formul\u00e4r)<\/li>\n<\/ul>\n<p>Om du k\u00e4nner dig os\u00e4ker s\u00e5 kan du kolla in dessa fantastiska <a href=\"https:\/\/kinsta.com\/se\/blog\/laravel-tutorial\/\">kostnadsfria och betalda handledningarna om Laravel<\/a>. Annars s\u00e5 kan vi k\u00f6ra ig\u00e5ng.<\/p>\n<h3>Steg 1: Installera Core Elements<\/h3>\n<p>F\u00f6r att fokusera p\u00e5 Inertia.js och komma till den roliga delen direkt, se till att du har f\u00f6ljande installation redo:<\/p>\n<ol>\n<li>Ett nyinstallerat Laravel 9-projekt med namnet <code>kinsta-blog<\/code><\/li>\n<li>Tailwind CSS CLI installerat i v\u00e5rt Laravel-projekt<\/li>\n<li>Bildfil &#8221;kinsta-logo.png.&#8221; Ladda ner och packa upp Kinsta\u2019s logotyp-paket fr\u00e5n <a href=\"https:\/\/kinsta.com\/se\/press\/\">https:\/\/kinsta.com\/press\/<\/a> och kopiera kinsta-logo2.png till public\/images directory som kinsta-logo.png.<\/li>\n<li>Tv\u00e5 blade-komponenter i <strong>kinsta-blog\/resources\/views<\/strong> f\u00f6r visning av bloggens startsida och en enskild artikel p\u00e5 bloggen som visas nedan:&#8221;\/resources\/views\/<strong>index.blade.php<\/strong>&#8221;:\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>&#8221;\/resources\/views\/<strong>show.blade.php<\/strong>&#8221;:<\/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 databas med namnet <code>kinsta_blog<\/code> ansluten till v\u00e5rt projekt: &#8221;<strong>.env<\/strong>&#8221;:\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, migreringar och Factories: &#8221;app\/Modeller\/<strong>Article.php<\/strong>&#8221;:\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>&#8221;database\/migrations\/<strong>create_articles_table.php<\/strong>&#8221;:<\/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>&#8221;database\/factories\/<strong>ArticleFactory.php<\/strong>&#8221;:<\/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 \u00e4r allt som vi beh\u00f6ver f\u00f6r att komma ig\u00e5ng! Nu ska vi komma till saken och introducera Inertia.js i v\u00e5rt projekt.<\/p>\n<h3>Steg 2: Installera Inertia<\/h3>\n<p>Installationsprocessen f\u00f6r Inertia \u00e4r uppdelad i tv\u00e5 huvudfaser: serversidan (Laravel) och klientsidan (VueJs).<\/p>\n<p>Den officiella installationsguiden i Inertia-dokumentationen \u00e4r lite f\u00f6r\u00e5ldrad eftersom <a href=\"https:\/\/vitejs.dev\/guide\/#scaffolding-your-first-vite-project\">Laravel 9 nu anv\u00e4nder Vite<\/a> som standard, men vi kommer att g\u00e5 igenom \u00e4ven den.<\/p>\n<h4>1. Server-sidan<\/h4>\n<p>Det f\u00f6rsta som vi beh\u00f6ver g\u00f6ra \u00e4r att installera Inertia server-side adapters med nedanst\u00e5ende terminalkommando via Composer.<\/p>\n<pre><code class=\"language-bash\">composer require inertiajs\/inertia-laravel<\/code><\/pre>\n<p>Nu st\u00e4ller vi in v\u00e5r rotmall, som kommer att vara en enda blade-fil. Den kommer att anv\u00e4ndas f\u00f6r att ladda dina CSS- och JS-filer, samt en Inertia-root som kommer att anv\u00e4ndas f\u00f6r att starta v\u00e5r JavaScript-applikation.<\/p>\n<p>Eftersom vi anv\u00e4nder den senaste versionen Laravel 9 v9.3.1 s\u00e5 m\u00e5ste vi \u00e4ven l\u00e5ta Vite utf\u00f6ra sin magi genom att inkludera den i v\u00e5ra taggar 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>L\u00e4gg m\u00e4rke till hur vi kan h\u00e4mta projekttiteln dynamiskt genom att l\u00e4gga till attributet <code>inertia<\/code> i <code>&lt;title&gt;<\/code> -taggarna.<\/p>\n<p>Vi har \u00e4ven lagt till <code>@vite<\/code> -direktivet i sidhuvudet f\u00f6r att Vite ska f\u00e5 veta s\u00f6kv\u00e4gen till v\u00e5r JavaScript-huvudfil d\u00e4r vi skapade v\u00e5r app och importerade v\u00e5rt CSS. Vite \u00e4r ett verktyg som hj\u00e4lper till med JavaScript- och CSS-utveckling genom att l\u00e5ta utvecklare se \u00e4ndringar p\u00e5 frontend utan att beh\u00f6va uppdatera sidan under lokal utveckling.<\/p>\n<p>V\u00e5rt n\u00e4sta steg blir att skapa <strong>HandleInertiaRequests<\/strong>-middleware och publicera den i v\u00e5rt projekt. Vi kan g\u00f6ra detta genom att avfyra nedanst\u00e5ende terminalkommando i rotkatalogen f\u00f6r v\u00e5rt projekt:<\/p>\n<pre><code class=\"language-bash\">php artisan inertia:middleware<\/code><\/pre>\n<p>N\u00e4r detta \u00e4r klart, g\u00e5 till &#8221;App\/Http\/<strong>Kernel.php<\/strong>&#8221; och registrera <code>HandleInertiaRequests<\/code> som den sista punkten i din webb- middleware:<\/p>\n<pre><code class=\"language-php\">'web' =&gt; [\n    \/\/ ...\n    App\\Http\\Middleware\\HandleInertiaRequests::class,\n],<\/code><\/pre>\n<h4>2. Klientsidan<\/h4>\n<p>D\u00e4refter s\u00e5 m\u00e5ste vi installera v\u00e5ra Vue.js 3-beroenden f\u00f6r frontend p\u00e5 samma s\u00e4tt som p\u00e5 serversidan:<\/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>Efter detta s\u00e5 m\u00e5ste du h\u00e4mta in Vue.js 3:<\/p>\n<pre><code class=\"language-bash\">npm install vue@next<\/code><\/pre>\n<p>Uppdatera sedan din prim\u00e4ra JavaScript-fil f\u00f6r att initiera Inertia.js med Vue.js 3, Vite och Laravel:<\/p>\n<p>&#8221;resources\/js\/<strong>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\";\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 ovanst\u00e5ende kodutdrag s\u00e5 anv\u00e4nder vi Laravel\u2019s plugin <code>resolvePageComponent<\/code>, och vi s\u00e4ger \u00e5t det att l\u00f6sa upp v\u00e5ra komponenter fr\u00e5n katalogen <strong>.\/Pages\/$name.vue<\/strong>. Detta beror p\u00e5 att vi kommer att spara v\u00e5ra Inertia-komponenter i den h\u00e4r katalogen senare i v\u00e5rt projekt, och detta plugin hj\u00e4lper oss att ladda dessa komponenter fr\u00e5n r\u00e4tt katalog automatiskt.<\/p>\n<p>Allt som \u00e5terst\u00e5r \u00e4r att installera <code>vitejs\/plugin-vue<\/code>:<\/p>\n<pre><code class=\"language-bash\">npm i @vitejs\/plugin-vue<\/code><\/pre>\n<p>Och uppdatera <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 sista steget \u00e4r att installera v\u00e5ra beroenden och kompilera v\u00e5ra filer:<\/p>\n<pre><code class=\"language-bash\">npm install\n\nnpm run dev<\/code><\/pre>\n<p>Och voil\u00e0! Du har en fungerande Laravel 9-applikation med Vue.js 3 och Vite. Nu beh\u00f6ver vi se vad som h\u00e4nder i praktiken!<\/p>\n<h2>Skapa tr\u00f6ghetssidor<\/h2>\n<p>Minns du de d\u00e4r tv\u00e5 blade-filerna (<strong>index<\/strong> och <strong>show<\/strong>) f\u00f6r att visa v\u00e5r hemsida och en enskild artikel?<\/p>\n<p>Den enda blade-filen som vi beh\u00f6ver n\u00e4r vi anv\u00e4nder Inertia \u00e4r <strong>app.blade.php<\/strong>, som vi anv\u00e4nde en g\u00e5ng redan n\u00e4r vi installerade Inertia. S\u00e5 vad h\u00e4nder med dessa filer nu?<\/p>\n<p>Vi kommer att omvandla dessa filer fr\u00e5n blade-komponenter till Inertia.js-komponenter.<\/p>\n<p>Varje sida i din applikation har sin egen kontrollerare och JavaScript-komponent med Inertia. P\u00e5 s\u00e5 s\u00e4tt s\u00e5 kan du bara f\u00e5 fram de data som kr\u00e4vs f\u00f6r den sidan, utan att anv\u00e4nda ett API. Inertia-sidor \u00e4r inget annat \u00e4n JavaScript-komponenter, i v\u00e5rt fall s\u00e5 \u00e4r det Vue.js-komponenter. Det \u00e4r inget anm\u00e4rkningsv\u00e4rt med dem. S\u00e5 vad vi kommer att g\u00f6ra \u00e4r att omsluta allt HTML-inneh\u00e5ll med\u00a0<code>&lt;template&gt;<\/code> -taggar och allt som har med JavaScript att g\u00f6ra kommer att omslutas med <code>&lt;script&gt;<\/code> -taggar.<\/p>\n<p>Skapa en mapp som heter &#8221;Pages&#8221; och flytta dina filer dit. S\u00e5 vi kommer att ha &#8221;<strong>index.blade.php<\/strong>&#8221; och &#8221;<strong>show.blade.php<\/strong>&#8221; i &#8221;<strong>.\/resources\/js\/Pages<\/strong>&#8221;. Vi \u00e4ndrar sedan filformatet till &#8221;.vue&#8221; i st\u00e4llet f\u00f6r &#8221;.blade.php&#8221; och g\u00f6r den f\u00f6rsta bokstaven i namnen till versaler och f\u00f6rvandlar inneh\u00e5llet till en vanlig Vue.js-komponent. Vi kommer att utesluta taggarna <code>&lt;html&gt;<\/code>, <code>&lt;head&gt;<\/code> och <code>&lt;body&gt;<\/code> eftersom de redan ing\u00e5r i huvudroten f\u00f6r blade-komponenten.<\/p>\n<p>&#8221;resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8221;:<\/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>&#8221;resources\/js\/Pages\/<strong>Show.vue<\/strong>&#8221;:<\/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>Det \u00e4r n\u00e5got som verkligen st\u00f6r mig! Vi forts\u00e4tter att kopiera och klistra in v\u00e5rt sidhuvud och v\u00e5r sidfot i varje komponent, vilket inte \u00e4r n\u00e5gon bra metod. L\u00e5t oss skapa en Inertia Basic Layout f\u00f6r att lagra v\u00e5ra best\u00e4ndiga komponenter.<\/p>\n<p>Skapa en mapp som heter &#8221;Layouts&#8221; i &#8221;<strong>\/resources\/js<\/strong>&#8221;. I den mappen s\u00e5 skapar du en fil som heter &#8221;KinstaLayout.vue&#8221;. Den h\u00e4r filen kommer att ha v\u00e5r rubrik och sidfot och <code>main<\/code> med en <code>&lt;slot \/&gt;<\/code> f\u00f6r att till\u00e5ta att alla komponenter som \u00e4r f\u00f6rpackade med den h\u00e4r layouten b\u00e4ddas in i den. Filen ska se ut s\u00e5 h\u00e4r :<\/p>\n<p>&#8221;resources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>&#8221;:<\/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 ska sedan importera den nya layouten till v\u00e5ra sidor och linda in allt HTML-inneh\u00e5ll i den. V\u00e5ra komponenter ska se ut s\u00e5 h\u00e4r:<\/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>Visa.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 och Inertia Rendering<\/h2>\n<p>L\u00e5t oss f\u00f6rst anv\u00e4nda filen &#8221;<strong>ArticleFactory<\/strong>&#8221; som vi har fr\u00e5n startpunkten f\u00f6r v\u00e5r handledning och s\u00e4tta in n\u00e5gra artiklar i v\u00e5r databas.<\/p>\n<p>&#8221;database\/seeders\/<strong>databaseSeeder.php<\/strong>&#8221;:<\/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>Tryck sedan p\u00e5 nedanst\u00e5ende terminalkommando f\u00f6r att migrera dina tabeller och s\u00e5 de falska uppgifterna fr\u00e5n fabrikerna:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh --seed<\/code><\/pre>\n<p>Detta kommer att skapa 10 falska artiklar i databasen, som vi kommer att beh\u00f6va skicka till v\u00e5r vy med hj\u00e4lp av Laravel-routing. Nu n\u00e4r vi anv\u00e4nder Inertia f\u00f6r att rendera vyer s\u00e5 kommer skrivs\u00e4ttet f\u00f6r v\u00e5ra rutter att f\u00f6r\u00e4ndras n\u00e5got. L\u00e5t oss skapa v\u00e5r f\u00f6rsta Laravel Inertia-rutt i &#8221;routes\/<strong>web.php<\/strong>&#8221; och returnera hemsidevyn fr\u00e5n &#8221;\/resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8221;.<\/p>\n<p>&#8221;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');<\/code><\/pre>\n<p>Observera att vi importerade <code>Inertia<\/code> och inte anv\u00e4nde <code>view()<\/code> Laravel-hj\u00e4lpen f\u00f6r att returnera vyn. Vi anv\u00e4nde ist\u00e4llet\u00a0<code>Inertia::render<\/code>. Inertia kommer \u00e4ven som standard att leta efter filnamnet som vi n\u00e4mnde i v\u00e5r rutt i mappen <strong>Pages<\/strong> i &#8221;resources\/js&#8221;.<\/p>\n<p>G\u00e5 till Index-filen och st\u00e4ll in de h\u00e4mtade uppgifterna som en prop och loopa \u00f6ver dem med <code>v-for<\/code> f\u00f6r att visa resultaten. Mellan skripttaggarna s\u00e5 definierar du de \u00f6verf\u00f6rda uppgifterna som ett rekvisit. Allt Inertia beh\u00f6ver veta \u00e4r vilken typ av data som du f\u00f6rv\u00e4ntar dig, vilket i v\u00e5rt fall \u00e4r ett &#8221;articles&#8221;-objekt som inkluderar en array av artiklar.<\/p>\n<p>&#8221;resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8221;:<\/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>Observera att det r\u00e4cker att bara definiera det som en prop utan att returnera det eftersom vi anv\u00e4nder formatet <code>setup<\/code> f\u00f6r Vue.js 3 kompositions-API. Om vi anv\u00e4nder options API s\u00e5 skulle vi beh\u00f6va returnera detta.<\/p>\n<p>L\u00e5t oss skapa slingan:<\/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> (l\u00e5t den vara ig\u00e5ng eftersom vi anv\u00e4nder Vite) och <code>php artisan serve<\/code> f\u00f6r att starta laravel-utvecklingsservern och komma \u00e5t v\u00e5r webbplats. Nu ser vi den f\u00f6rv\u00e4ntade sidan som visar alla tio artiklarna i databasen.<\/p>\n<p>Vi ska nu anv\u00e4nda\u00a0<a href=\"https:\/\/chrome.google.com\/webstore\/detail\/vuejs-devtools\/nhdogjmejiglipccpnnnanhbledajbpd?hl=en\">Google Chrome&#8217;s Vue DevTools<\/a>-till\u00e4gg, vilket g\u00f6r att vi kan fels\u00f6ka min applikation. L\u00e5t oss visa hur v\u00e5ra data skickas till 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=\"Inspektion av tr\u00f6ghetsegenskaper.\" width=\"1024\" height=\"543\"><figcaption id=\"caption-attachment-134667\" class=\"wp-caption-text\">Inspektion av tr\u00f6ghetsegenskaper.<\/figcaption><\/figure>\n<p>&#8221;articles&#8221; skickas till komponenten som ett prop-objekt som inneh\u00e5ller en array av artiklar; varje artikel i arrayen \u00e4r ocks\u00e5 ett objekt med egenskaper som motsvarar de data som den har f\u00e5tt fr\u00e5n databasen. Detta inneb\u00e4r att alla data som vi \u00f6verf\u00f6r fr\u00e5n Laravel till Inertia kommer att behandlas som en prop.<\/p>\n<h2>Anv\u00e4ndning av Tailwind CSS med Inertia.js<\/h2>\n<p>Eftersom Tailwind redan \u00e4r installerat i v\u00e5rt projekt vid startpunkten \u00e4r allt vi beh\u00f6ver g\u00f6ra att s\u00e4ga \u00e5t det att l\u00e4sa v\u00e5ra Inertia-komponenter. Detta kan g\u00f6ras genom att redigera &#8221;<strong>tailwind.config.js<\/strong>&#8221; enligt f\u00f6ljande:<\/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>Kontrollera sedan att vi har importerat v\u00e5r CSS-fil i &#8221;resources\/js\/<strong>app.js<\/strong>&#8221;:<\/p>\n<pre><code class=\"language-js\">import \"..\/css\/app.css\";<\/code><\/pre>\n<p>Nu \u00e4r vi redo att styla v\u00e5ra komponenter.<\/p>\n<p>&#8221;resources\/js\/Pages\/<strong>Index.vue<\/strong>&#8221;:<\/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>&#8221;resources\/js\/Layouts\/<strong>KinstaLayout.vue<\/strong>&#8221;:<\/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>Om du tittar i webbl\u00e4saren ser du att Vite redan har uppdaterat sidan 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=\"size-full wp-image-134669\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/kinsta-laravel-inertiajs-blog.gif\" alt=\"A scrolling image showing a functioning version of the \"Kinsta Blog\" example from earlier.\" width=\"911\" height=\"620\"><figcaption id=\"caption-attachment-134669\" class=\"wp-caption-text\">Rendering av tr\u00f6ghetsegenskaper.<\/figcaption><\/figure>\n<h2>Tr\u00f6ghetsl\u00e4nkar<\/h2>\n<p>Nu n\u00e4r vi har en fungerande hemsida som kan visa alla artiklar i databasen m\u00e5ste vi skapa en annan rutt f\u00f6r att visa enskilda artiklar. L\u00e5t oss skapa en ny rutt och st\u00e4lla in webbadressen till ett &#8221;id&#8221;-wildcard:<\/p>\n<p>&#8221;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 importerade modellen &#8221;Article&#8221; och lade till en ny rutt f\u00f6r att returnera Inertia-komponenten <strong>Show.vue<\/strong>. Vi utnyttjade \u00e4ven\u00a0<a href=\"https:\/\/laravel.com\/docs\/master\/routing#customizing-the-key\">Laravels route model binding<\/a>, vilket g\u00f6r att Laravel h\u00e4mtar den artikel som vi h\u00e4nvisar till automatiskt.<\/p>\n<p>Allt som vi beh\u00f6ver nu \u00e4r ett s\u00e4tt att bes\u00f6ka denna rutt genom att klicka p\u00e5 en l\u00e4nk fr\u00e5n hemsidan utan att beh\u00f6va ladda om hela sidan. Detta \u00e4r m\u00f6jligt med Inertia\u2019s magiska verktyg <code>&lt;Link&gt;<\/code>. Vi n\u00e4mnde i inledningen att Inertia anv\u00e4nder <code>&lt;Link&gt;<\/code> som en omslagsform f\u00f6r en vanlig ankartagg <code>&lt;a&gt;<\/code>, och att denna omslagsform \u00e4r t\u00e4nkt att g\u00f6ra sidbes\u00f6ken s\u00e5 smidiga som m\u00f6jligt. I Inertia s\u00e5 kan <code>&lt;Link&gt;<\/code> -taggen upptr\u00e4da som en ankartagg som utf\u00f6r <code>&lt;GET&gt;<\/code> -f\u00f6rfr\u00e5gningar, men den kan \u00e4ven fungera som <code>&lt;button&gt;<\/code> och <code>&lt;form&gt;<\/code> samtidigt. L\u00e5t oss se hur vi kan till\u00e4mpa detta i v\u00e5rt projekt.<\/p>\n<p>I v\u00e5r Index.vue s\u00e5 kommer vi att importera <code>&lt;Link&gt;<\/code> fr\u00e5n Inertia och ta bort ankartaggarna <code>&lt;a&gt;<\/code> och ers\u00e4tta dem med Inertia <code>&lt;Link&gt;<\/code> -taggar. Attributet <code>href<\/code> kommer att s\u00e4ttas till den webbadress f\u00f6r rutten som vi tidigare skapade f\u00f6r att visa artikeln:<\/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>Vi stylar <strong>Show.vue<\/strong> med Tailwind f\u00f6r att f\u00e5 den att se lite mer uppkl\u00e4dd ut och redo f\u00f6r v\u00e5rt bes\u00f6k. Och vi m\u00e5ste \u00e4ven l\u00e5ta den veta att den ska f\u00f6rv\u00e4nta sig ett &#8221;Article&#8221;-objekt och st\u00e4lla in detta 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\u00e4r vi nu klickar p\u00e5 artikelns titel eller p\u00e5 &#8221;L\u00e4s mer&#8221; s\u00e5 kommer vi att transporteras till <strong>Show.vue<\/strong> utan att uppdatera sidan.<\/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=\"Tr\u00f6ghetsl\u00e4nkar p\u00e5 plats.\" width=\"1024\" height=\"596\"><figcaption id=\"caption-attachment-134671\" class=\"wp-caption-text\">Tr\u00f6ghetsl\u00e4nkar p\u00e5 plats.<\/figcaption><\/figure>\n<p>I v\u00e5rt fall s\u00e5 anv\u00e4nder vi <code>&lt;Link&gt;<\/code> som en ankartagg som skickar en <code>GET<\/code> -f\u00f6rfr\u00e5gan till rutten och returnerar de nya uppgifterna. Vi kan dock \u00e4ven anv\u00e4nda <code>&lt;Link&gt;<\/code> f\u00f6r att\u00a0<code>POST<\/code>, <code>PUT<\/code>, <code>PATCH<\/code> och <code>DELETE<\/code> &#8221;routes\/<strong>web.php<\/strong>&#8221;:<\/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 och tricks som du b\u00f6r k\u00e4nna till<\/h2>\n<p>Vi har nu en fungerande SPA som \u00e4r byggd med Laravel, Inertia och Tailwind CSS. Men inertia kan hj\u00e4lpa oss att uppn\u00e5 s\u00e5 mycket mer. Det \u00e4r dags att skaffa sig n\u00e5gra Inertia-tekniker som kommer att vara till hj\u00e4lp f\u00f6r b\u00e5de utvecklare och applikationsbes\u00f6kare.<\/p>\n<h3>Generering av webbadresser<\/h3>\n<p>Du kanske har m\u00e4rkt att vi har lagt till namn till v\u00e5ra Laravel-rutter utan att anv\u00e4nda dem. Inertia l\u00e5ter oss anv\u00e4nda v\u00e5ra namngivna rutter i v\u00e5ra komponenter ist\u00e4llet f\u00f6r att skriva ner hela rutten manuellt.<\/p>\n<p>Vi kan uppn\u00e5 detta genom att <a href=\"https:\/\/github.com\/tighten\/ziggy#installation\">installera Ziggy-paketet<\/a> i v\u00e5rt projekt:<\/p>\n<pre><code class=\"language-bash\">composer require tightenco\/ziggy<\/code><\/pre>\n<p>G\u00e5 sedan till &#8221;resources\/js\/app.js&#8221; och uppdatera den s\u00e5 h\u00e4r:<\/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 till &#8221;\/resources\/views\/<strong>app.blade.php<\/strong>&#8221; och uppdatera sidhuvudet 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;och uppdatera dina NPM-paket genom att trycka p\u00e5 nedanst\u00e5ende tv\u00e5 terminalkommandon:<\/p>\n<pre><code class=\"language-bash\">npm install && npm run dev<\/code><\/pre>\n<p>Det h\u00e4r paketet g\u00f6r det m\u00f6jligt att anv\u00e4nda namngivna rutter i v\u00e5ra Inertia-komponenter, s\u00e5 l\u00e5t oss g\u00e5 till <strong>Index.vue<\/strong> och ta bort den gamla manuella rutten och ers\u00e4tta den med ruttnamnet samtidigt som vi skickar data normalt som om vi vore i v\u00e5r kontrollerare.<\/p>\n<p>Vi kommer att ers\u00e4tta det h\u00e4r:<\/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 detta:<\/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>Detta ger oss exakt samma beteende som vi hade, men det \u00e4r mer utvecklarv\u00e4nligt och mycket anv\u00e4ndbart n\u00e4r din rutt f\u00f6rv\u00e4ntar sig m\u00e5nga parametrar.<\/p>\n<h3>Framstegsindikatorer<\/h3>\n<p>Detta \u00e4r en av de trevligaste funktionerna i Inertia.js. Eftersom SPA ger en interaktiv anv\u00e4ndarupplevelse s\u00e5 skulle ett fantastiskt tillskott till applikationen vara att ha konstant feedback om huruvida en beg\u00e4ran h\u00e5ller p\u00e5 att laddas. Detta kan \u00e5stadkommas genom ett separat bibliotek som Inertia erbjuder.<\/p>\n<p>Biblioteket &#8221;@inertiajs\/progress&#8221; \u00e4r en omslagsform kring <a href=\"https:\/\/ricostacruz.com\/nprogress\/\">NProgress<\/a> som villkorligt visar laddningsindikatorerna enligt Inertia-h\u00e4ndelser. Du beh\u00f6ver egentligen inte veta hur detta fungerar bakom kulisserna, s\u00e5 l\u00e5t oss bara f\u00e5 det att fungera.<\/p>\n<p>Vi kan installera det h\u00e4r biblioteket med nedanst\u00e5ende terminalkommando:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/progress<\/code><\/pre>\n<p>N\u00e4r det \u00e4r installerat s\u00e5 m\u00e5ste vi importera det i &#8221;<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>Detta kommer att visa ett laddningsf\u00e4lt och en laddningsspinner i svart f\u00e4rg, men vi kan \u00e4ndra f\u00e4rgen samt en massa annat med hj\u00e4lp av\u00a0<a href=\"https:\/\/inertiajs.com\/progress-indicators\">dokumentationen f\u00f6r Inertia.js framstegsindikator<\/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=\"Inertia\u2019s framstegsindikator (h\u00f6gst upp till h\u00f6ger).\" width=\"1024\" height=\"83\"><figcaption id=\"caption-attachment-134672\" class=\"wp-caption-text\">Inertia\u2019s framstegsindikator (h\u00f6gst upp till h\u00f6ger).<\/figcaption><\/figure>\n<h3>Hantering av scrollning<\/h3>\n<p>I vissa fall s\u00e5 vill du kanske navigera till en ny sida samtidigt som du beh\u00e5ller samma scrollposition. Du kanske beh\u00f6ver detta om du till\u00e5ter anv\u00e4ndare att l\u00e4mna kommentarer. Detta kommer att skicka ett formul\u00e4r och ladda in den nya kommentaren fr\u00e5n databasen till din komponent. anv\u00e4ndaren b\u00f6r inte f\u00f6rlora scrollpositionen och Inertia tar hand om detta \u00e5t oss.<\/p>\n<p>I v\u00e5rt fall s\u00e5 till\u00e4mpar vi detta p\u00e5 v\u00e5r <code>&lt;Link&gt;<\/code> -tagg i <strong>Index.vue<\/strong>. F\u00f6r att bevara scrollnings-positionen n\u00e4r vi omdirigerar till en annan sida med Inertias <code>&lt;Link&gt;<\/code>\u00a0S\u00e5 beh\u00f6ver vi bara l\u00e4gga till attributet <code>preserve-scroll<\/code> till <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>Sedan SPA: s f\u00f6delse s\u00e5 har m\u00e4nniskor varit bekymrade \u00f6ver s\u00f6kmotoroptimering (SEO). Det \u00e4r allm\u00e4nt k\u00e4nt att om du anv\u00e4nder SPA-metoden s\u00e5 kommer s\u00f6kmotorerna att ha sv\u00e5rt att genoms\u00f6ka din webbapplikation eftersom allting renderas p\u00e5 klientsidan. Detta leder till att din webbplats inte visas h\u00f6gst upp i s\u00f6kresultaten. Men hur kommer det sig att popul\u00e4ra plattformar som Facebook och Github nu \u00e4r SPA: er och fortfarande presterar bra i SEO?<\/p>\n<p>Det h\u00e4r \u00e4r inte l\u00e4ngre ett om\u00f6jligt uppdrag. Inertia erbjuder n\u00e5gra l\u00f6sningar f\u00f6r att hj\u00e4lpa din SPA att bli SEO-v\u00e4nlig.<\/p>\n<h3>Inertia Vue SSR med Laravel och Vite<\/h3>\n<p>S\u00f6kmotorer letar alltid efter HTML p\u00e5 din webbplats f\u00f6r att kunna identifiera inneh\u00e5llet, men om du inte har HTML i dina webbadresser s\u00e5 blir det h\u00e4r jobbet sv\u00e5rare. N\u00e4r du utvecklar SPA: er s\u00e5 \u00e4r allt som du har p\u00e5 din sida JavaScript och JSON. Inertia introducerade en SSR-funktion (Server-Side Rendering) som du kan l\u00e4gga till i din applikation. Detta g\u00f6r det m\u00f6jligt f\u00f6r din applikation att f\u00f6rrendera ett f\u00f6rsta sidbes\u00f6k p\u00e5 servern och sedan skicka den renderade HTML:en till webbl\u00e4saren. D\u00e5 kan anv\u00e4ndarna se och interagera med dina sidor innan de laddas helt och h\u00e5llet, och det finns \u00e4ven andra f\u00f6rdelar. Det f\u00f6rkortar exempelvis den tid som det tar f\u00f6r s\u00f6kmotorerna att indexera din webbplats.<\/p>\n<p>F\u00f6r att sammanfatta hur det fungerar s\u00e5 identifierar Inertia om den k\u00f6rs p\u00e5 en Node.js-server och renderar komponentnamn, egenskaper, webbadress och version av tillg\u00e5ngar till HTML. Detta kommer att ge anv\u00e4ndaren och s\u00f6kmotorn praktiskt taget allt som din sida har att erbjuda.<\/p>\n<p>Eftersom vi har att g\u00f6ra med Laravel s\u00e5 \u00e4r detta dock f\u00f6ga meningsfullt eftersom Laravel \u00e4r ett PHP-ramverk och inte k\u00f6rs p\u00e5 en Node.js-server. Vi kommer d\u00e4rf\u00f6r att vidarebefordra v\u00e5r f\u00f6rfr\u00e5gan till en Node.js-tj\u00e4nst, som renderar sidan och returnerar HTML. Detta kommer att g\u00f6ra v\u00e5r Laravel Vue-applikation SEO-v\u00e4nlig som standard.<\/p>\n<p>F\u00f6rst s\u00e5 m\u00e5ste vi installera npm-paketet Vue.js SSR:<\/p>\n<pre><code class=\"language-bash\">npm install @vue\/server-renderer<\/code><\/pre>\n<p>Ett annat anv\u00e4ndbart Inertia &#8221;NPM&#8221;-paket tillhandah\u00e5ller en enkel &#8221;HTTP&#8221;-server. Vi rekommenderar starkt att du installerar det:<\/p>\n<pre><code class=\"language-bash\">npm install @inertiajs\/server<\/code><\/pre>\n<p>I &#8221;resources\/js\/&#8221; s\u00e5 l\u00e4gger vi sedan till en ny fil som heter <strong>ssr.js<\/strong>. Den h\u00e4r filen kommer att vara mycket lik den <strong>app.js<\/strong>-fil som vi skapade n\u00e4r vi installerade Inertia, men den kommer att exekveras i Node.js i st\u00e4llet f\u00f6r i webbl\u00e4saren:<\/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>Se till att inte inkludera allt i <strong>ssr.js<\/strong>-filen eftersom den inte kommer att vara synlig f\u00f6r bes\u00f6karna; den h\u00e4r filen \u00e4r endast till f\u00f6r att s\u00f6kmotorer och webbl\u00e4sare ska kunna visa data p\u00e5 din sida, s\u00e5 inkludera endast det som \u00e4r viktigt f\u00f6r dina data eller det som g\u00f6r dina data tillg\u00e4ngliga.<\/p>\n<p>&#8221;Som standard s\u00e5 kommer Inertias SSR-server att fungera p\u00e5 port 13714. Du kan dock \u00e4ndra detta genom att ange ett andra argument till metoden createServer.&#8221; Inertia DOCss.<\/p>\n<p>Inertia.js DOCs f\u00f6rklarar inte hur man integrerar Inertia SSR med Vite, men vi kommer att g\u00e5 igenom detta nu. G\u00e5 till <strong>vite.config.js<\/strong> och klistra in nedanst\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>D\u00e4refter s\u00e5 g\u00e5r du till <strong>package.json<\/strong> och \u00e4ndrar byggskriptet:<\/p>\n<pre><code class=\"language-json\">\"build\": \"vite build && vite build --ssr\"<\/code><\/pre>\n<p>Om vi nu k\u00f6r <code>npm run build<\/code>\u00a0s\u00e5 kommer Vite att bygga v\u00e5rt SSR-paket f\u00f6r produktion. F\u00f6r mer information om detta s\u00e5 kan du bes\u00f6ka <a href=\"https:\/\/inertiajs.com\/server-side-rendering\">Inertia SSR DOCs<\/a> och <a href=\"https:\/\/laravel-vite.dev\/guide\/features\/ssr.html#building\">Vite SSR DOCs<\/a>.<\/p>\n<h3>Titel och Meta<\/h3>\n<p>Eftersom JavaScript-applikationerna visas i dokumentets <code>&lt;body&gt;<\/code>\u00a0s\u00e5 kan de inte visa upp markeringar i dokumentets <code>&lt;head&gt;<\/code> eftersom det ligger utanf\u00f6r deras r\u00e4ckvidd. Inertia har dock komponenten\u00a0<code>&lt;Head&gt;<\/code> som kan anv\u00e4ndas f\u00f6r att st\u00e4lla in sidan <code>&lt;title&gt;<\/code>, <code>&lt;meta&gt;<\/code> -taggar och andra <code>&lt;head&gt;<\/code> -komponenter.<\/p>\n<p>F\u00f6r att l\u00e4gga till <code>&lt;head&gt;<\/code> -elementet i din sida s\u00e5 m\u00e5ste vi importera <code>&lt;Head&gt;<\/code> fr\u00e5n Inertia p\u00e5 samma s\u00e4tt 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 \u00e4ven l\u00e4gga till en global titel f\u00f6r alla sidor, detta kommer att l\u00e4gga till ditt applikationsnamn bredvid titeln p\u00e5 varje sida. Vi har redan gjort detta i filen <strong>app.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">createInertiaApp({\n    title: (title) =&gt; `${title} - ${appName}`,\n    \/\/\n});<\/code><\/pre>\n<p>Det betyder att om vi l\u00e4gger till <code>&lt;Head title=\"Home\"&gt;<\/code> p\u00e5 v\u00e5r applikations hemsida med en titel, s\u00e5 kommer detta att \u00e5terges s\u00e5 h\u00e4r: <code>&lt;title&gt;Home - My App&lt;\/title&gt;<\/code>.<\/p>\n<h3>\u00d6vervakning av din app<\/h3>\n<p>Hastigheten \u00e4r en av de viktigaste faktorerna f\u00f6r att optimera SEO-prestanda p\u00e5 din webbplats. Om du anv\u00e4nder WordPress f\u00f6r din webbplats s\u00e5 kommer <a href=\"https:\/\/kinsta.com\/se\/apm-verktyg\/\">Kinsta APM<\/a>\u00a0att hj\u00e4lpa dig att \u00f6vervaka och h\u00e5lla ett n\u00e4ra \u00f6ga p\u00e5 din applikation. Det hj\u00e4lper dig att identifiera WordPress prestandaproblem och \u00e4r tillg\u00e4ngligt kostnadsfritt p\u00e5 alla Kinsta-hostade webbplatser.<\/p>\n<h2>Sammanfattning<\/h2>\n<p>Inertia.js \u00e4r en av de mest betydelsefulla teknikerna som finns tillg\u00e4ngliga; blanda den med Laravel s\u00e5 f\u00e5r du en modern enkelsidesapplikation som \u00e4r byggd med PHP och JavaScript. Taylor Otwell, skaparen av Laravel, \u00e4r s\u00e5 intresserad av Inertia att Laravel har lanserat sina mest popul\u00e4ra startpaket, Laravel Breeze och Jetstream, med st\u00f6d f\u00f6r Inertia och SSR.<\/p>\n\n<p>Om du \u00e4r ett Laravel-fan eller en professionell utvecklare s\u00e5 kommer Inertia.js utan tvekan att f\u00e5nga din uppm\u00e4rksamhet. I den h\u00e4r handledningen s\u00e5 skapade vi en mycket enkel och okomplicerad blogg p\u00e5 endast n\u00e5gra minuter. Det finns fortfarande mycket att l\u00e4ra sig om inertia, och detta \u00e4r nog bara den f\u00f6rsta av m\u00e5nga artiklar och handledningar.<\/p>\n<p>Vad vill du att vi ska utforska mer n\u00e4r det g\u00e4ller Laravel? L\u00e5t oss veta detta i kommentarsf\u00e4ltet nedan.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MPA: er (Multi-page applications) blir allt mindre popul\u00e4ra f\u00f6r varje dag som g\u00e5r. Ber\u00f6mda plattformar som Facebook, Twitter, YouTube, Github och m\u00e5nga andra anv\u00e4nder redan SPA-teknik &#8230;<\/p>\n","protected":false},"author":266,"featured_media":47886,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[652,360,310,653,654],"topic":[],"class_list":["post-47885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-inertia-js","tag-javascript","tag-laravel","tag-php-frameworks","tag-spa"],"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>Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt<\/title>\n<meta name=\"description\" content=\"I denna artikel, utforskar vi hur du anv\u00e4nder Inertia.js med Laravel, Vue och Tailwind CSS f\u00f6r att skapa en modern webbapp.\" \/>\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\/se\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt\" \/>\n<meta property=\"og:description\" content=\"I denna artikel, utforskar vi hur du anv\u00e4nder Inertia.js med Laravel, Vue och Tailwind CSS f\u00f6r att skapa en modern webbapp.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstasweden\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-12T15:20:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-10T12:17:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/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 denna artikel, utforskar vi hur du anv\u00e4nder Inertia.js med Laravel, Vue och Tailwind CSS f\u00f6r att skapa en modern webbapp.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_se\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_se\" \/>\n<meta name=\"twitter:label1\" content=\"Skriven av\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mostafa Said\" \/>\n\t<meta name=\"twitter:label2\" content=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/\"},\"author\":{\"name\":\"Mostafa Said\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\"},\"headline\":\"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt\",\"datePublished\":\"2022-12-12T15:20:27+00:00\",\"dateModified\":\"2023-05-10T12:17:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/\"},\"wordCount\":4419,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png\",\"keywords\":[\"inertia.js\",\"JavaScript\",\"laravel\",\"php frameworks\",\"spa\"],\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/\",\"url\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/\",\"name\":\"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png\",\"datePublished\":\"2022-12-12T15:20:27+00:00\",\"dateModified\":\"2023-05-10T12:17:18+00:00\",\"description\":\"I denna artikel, utforskar vi hur du anv\u00e4nder Inertia.js med Laravel, Vue och Tailwind CSS f\u00f6r att skapa en modern webbapp.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/se\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/se\/#website\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/se\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/se\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstasweden\/\",\"https:\/\/x.com\/kinsta_se\",\"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\/se\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996\",\"name\":\"Mostafa Said\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/mostafasaid\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt","description":"I denna artikel, utforskar vi hur du anv\u00e4nder Inertia.js med Laravel, Vue och Tailwind CSS f\u00f6r att skapa en modern webbapp.","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\/se\/blog\/laravel-inertia\/","og_locale":"sv_SE","og_type":"article","og_title":"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt","og_description":"I denna artikel, utforskar vi hur du anv\u00e4nder Inertia.js med Laravel, Vue och Tailwind CSS f\u00f6r att skapa en modern webbapp.","og_url":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstasweden\/","article_published_time":"2022-12-12T15:20:27+00:00","article_modified_time":"2023-05-10T12:17:18+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png","type":"image\/png"}],"author":"Mostafa Said","twitter_card":"summary_large_image","twitter_description":"I denna artikel, utforskar vi hur du anv\u00e4nder Inertia.js med Laravel, Vue och Tailwind CSS f\u00f6r att skapa en modern webbapp.","twitter_image":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png","twitter_creator":"@kinsta_se","twitter_site":"@kinsta_se","twitter_misc":{"Skriven av":"Mostafa Said","Ber\u00e4knad l\u00e4stid":"23 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/"},"author":{"name":"Mostafa Said","@id":"https:\/\/kinsta.com\/se\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996"},"headline":"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt","datePublished":"2022-12-12T15:20:27+00:00","dateModified":"2023-05-10T12:17:18+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/"},"wordCount":4419,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png","keywords":["inertia.js","JavaScript","laravel","php frameworks","spa"],"inLanguage":"sv-SE","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/","url":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/","name":"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png","datePublished":"2022-12-12T15:20:27+00:00","dateModified":"2023-05-10T12:17:18+00:00","description":"I denna artikel, utforskar vi hur du anv\u00e4nder Inertia.js med Laravel, Vue och Tailwind CSS f\u00f6r att skapa en modern webbapp.","breadcrumb":{"@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/"]}]},{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#primaryimage","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/12\/laravel-inertia.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/se\/blog\/laravel-inertia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/se\/"},{"@type":"ListItem","position":2,"name":"Hur du anv\u00e4nder Inertia.js i dina Laravel-projekt"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/se\/#website","url":"https:\/\/kinsta.com\/se\/","name":"Kinsta\u00ae","description":"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar","publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/se\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/se\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/se\/","logo":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstasweden\/","https:\/\/x.com\/kinsta_se","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\/se\/#\/schema\/person\/e96baff25a5ee7e63a525f9557f79996","name":"Mostafa Said","image":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/mostafasaid\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/47885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/users\/266"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/comments?post=47885"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/47885\/revisions"}],"predecessor-version":[{"id":52793,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/47885\/revisions\/52793"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/translations\/dk"},{"href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/47885\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media\/47886"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media?parent=47885"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/tags?post=47885"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/topic?post=47885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}