How to Setup Laravel with Svelte, Inertia.js, and Vite | Tutorial (2023)

Introduction

Setting up Laravel with Inertia.js should be straightforward, but it's not the same if you want to install it with Svelte.

While implementing it myself, I faced some issues which I'm sure you're gonna face as well. And that's the reason I decided to write this blog.

So, let's get started.


Setting up Laravel.

Let's start by installing a fresh version of Laravel. I'm gonna name my project inertia-svelte

composer create-project laravel/laravel inertia-svelte

Server-side setup

Install dependencies

Once Laravel is installed, the first step when setting up Inertia is configuring our server-side framework. So, let's start by installing the inertia-laravel package.

composer require inertiajs/inertia-laravel

Setting up the Root template

Next, we need to set up a root template that will be loaded on the first-page visit to our application. This will be generally used to load our site assets (CSS and JavaScript), and will also contain a root div in which, inertia will boot our JavaScript application.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
    @vite('resources/js/app.js')
    @inertiaHead
  </head>
  <body>
    @inertia
  </body>
</html>

This template should include our assets, as well as the @inertia and @inertiaHead directives.

By default, Inertia's Laravel adapter will assume that our root template is named app.blade.php. If you want to use a different root view, you can change it using the Inertia::setRootView() method.

Middleware

Next, we need to set up the Inertia middleware. We can accomplish this by publishing the HandleInertiaRequests, which can be done using the following Artisan command.

php artisan inertia:middleware

The middleware this command publishes looks like this, we can use this middleware to pass in authenticated users and other details to the front end.

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Inertia\Middleware;

class HandleInertiaRequests extends Middleware
{
    /**
     * The root template that's loaded on the first-page visit.
     *
     * @see https://inertiajs.com/server-side-setup#root-template
     * @var string
     */
    protected $rootView = 'app';

    /**
     * Determines the current asset version.
     *
     * @see https://inertiajs.com/asset-versioning
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    public function version(Request $request): ?string
    {
        return parent::version($request);
    }

    /**
     * Defines the props that are shared by default.
     *
     * @see https://inertiajs.com/shared-data
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function share(Request $request): array
    {
        return array_merge(parent::share($request), [
            //
        ]);
    }
}

Once the middleware has been published, let's register the HandleInertiaRequests middleware in our App\Http\Kernel as the last item in our web middleware group.

'web' => [
    // ...
    \App\Http\Middleware\HandleInertiaRequests::class,
],

Client-side setup

Once we have our server-side framework configured, it's time to set up our client-side framework.

And since we will be using Svelte as a frontend, we'll be installing dependencies related to Svelte.

Let's start by installing the inertiajs/svelte package.

npm install @inertiajs/svelte

Initialize the Inertia app

Next, we need to update our main JavaScript file to boot our Inertia app. To accomplish this, we'll make changes to our app.js file located inside resources/js/ folder.

import './bootstrap';
import { createInertiaApp } from '@inertiajs/svelte'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.svelte', { eager: true })
    return pages[`./Pages/${name}.svelte`]
  },
  setup({ el, App, props }) {
    new App({ target: el, props })
  },
})

Additional Setup

The official documentation only covers these basics for setting up Inertia with Svelte.

So, this section includes the additional steps needed to fully configure this stack.

Let's start by modifying the package.json and adding a new key-value pair as shown below.

    "private": true,
    "type": "module",

You can add that after the "private": true key-value pair.

After this step, we need to install a package called sveltejs/vite-plugin-svelte.

npm install @sveltejs/vite-plugin-svelte

We also need to make a few changes to vite.config.js file.

The final output looks like this:

import { defineConfig } from "vite";
import laravel from "laravel-vite-plugin";
import { svelte } from "@sveltejs/vite-plugin-svelte";

export default defineConfig({
    plugins: [
        laravel({
            input: ["resources/css/app.css", "resources/js/app.js"],
            refresh: true,
        }),
        svelte({}),
    ],
});

And now we're almost done, the only thing remaining is to spin up our PHP and node servers, to do that, we'll run php artisan serve and npm run dev and this should now render our svelte files using Inertia.

The repository for this demo is linked here


Video Resource

If you prefer a video instead of a blog, you can check out this video which I launched a while ago.

While you are here, make sure to check out other videos and subscribe to the channel.

I do have plans and will be launching more videos on this LIST Stack.