DEV Community

Cover image for Getting started with Laravel 8, Vue 3 and Tailwind

Posted on


Getting started with Laravel 8, Vue 3 and Tailwind

Laravel is one of the most popular web frameworks you can use for your next project. Having used Laravel extensively myself I can honestly say, the developer experience is extremely good.

Vue has a long-standing history with Laravel and quite a bit of its popularity comes from the Laravel community heavily using Vue for their frontend work.

As such I thought it would be interesting to see how we can setup the latest installment of Vue in Laravel. Just for fun, we will also setup Tailwind, for those of you curious to see how that works.


  • Setup a Laravel project using Composer
  • Install and configure Vue 3
  • Install and configure TailwindCSS
  • Setup a Sqlite database for development

Setup a Laravel Project using Composer

There are a few options when it comes to installing Laravel. We will be using Composer to setup the Laravel framework.

For this you will need to install the following:

And for development you will be needing PHP 8.

If you are asking yourself how much JavaScript you need to know to use Vue, I have an article that details exactly this.

After installing all of this, we can simply run the following command to scaffold a complete Laravel project:

composer create-project Laravel/laravel <app-name>

In our case I will be using the following command:

composer create-project Laravel/laravel Laravel-vue

This will then install everything we need.

Great! Now onto installing Vue 3.

Install and configure Vue 3

If you have been using Laravel from 6.x onward, you may well have come across the Laravel/ui package, with which we could install Bootstrap as well as React or Vue.

For Vue 3 there is not a package as of time of writing, but there is a rather easy way of doing this.

Let us first install the dependencies needed for Vue 3:

npm install --save vue@next && npm install --save-dev vue-loader@next

After that we need to tell webpack to compile our vue files as well. WE can do this be opening the webpack.mix.js file and add the following line:

const mix = require("laravel-mix");

mix.js("resources/js/app.js", "public/js")
    .vue() //new
    .postCss("resources/css/app.css", "public/css", [
Enter fullscreen mode Exit fullscreen mode

I usually run npm install followed by npm run dev.

Here you will likely get an error the first time compiling that, because npm has installed a missing package for us:

Screenshot of error message

Simply re-run npm run dev and everything compiles without any errors.

We can start our project by running php artisan serve that start the built-in PHP development server on port 8000. If you now go to localhost:8000 you will see the following:

Screenshot of start screen

Laravel is done, now to get Vue setup.

Create our Vue project

We haven't actually done anything with our Vue setup. Let us change that by creating a root component that will house our entire Vue app.

Create a new App.vue file in the resources/js folder with the following markup:

        <h1>Vue 3 App</h1>
Enter fullscreen mode Exit fullscreen mode

A very simple Vue app with a heading.

Now we need to adapt our app.js in resources/js to make use of our vue file:


import { createApp } from "vue";

import App from "./App.vue";


Enter fullscreen mode Exit fullscreen mode

Here we are first importing the createApp() method that is new to Vue developers. With this we can create a new Vue instance.

We then import our Vue file and create a new Vue instance and mount it on an element with the id "app".

Now let us create an element that has that id. To do this, we can remove the standard markup found in our welcome.blade.php file and replace it with this:

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">


        <!-- Fonts -->
        <link href=";600;700&display=swap" rel="stylesheet">
        <div id="app"></div>
    <script src="{{ asset('js/app.js') }}"></script>
Enter fullscreen mode Exit fullscreen mode

As you can see, we have a div with the id app that will be replaced by our Vue app.

Below we have a script tag that references not the app.js we have in resources/js, but within our public/js folder. This file is the end result of our webpack build process.

Before we do that, we need to once again run a build process because we have not actually processed the Vue files we created.

To avoid having to run npm run dev every time we make a change, we can run npm run watch that allows us to trigger a build process as soon as we save the changes.

You should now be able to see our heading:

Screenshot of heading

You may need to restart the development server, if you are getting errors.

Install and configure TailwindCSS

TailwindCSS has become very popular, not only with Laravel developers, but also with Vue developers.

Tailwind allows you to create apps and website without ever having to leave your html.

First we need to install the necessary dependencies:

npm install -D tailwindcss@latest postcss@latest autoprefixer@latest

We can now create a tailwind config file that we can use to extend the default TailwindCSS settings:

npx tailwindcss init

This will create a new tailwind.config.js in our project.

We then need to configure webpack to process the tailwind installation:

const mix = require("laravel-mix");

mix.js("resources/js/app.js", "public/js")
    .postCss("resources/css/app.css", "public/css", [require("tailwindcss")]);
Enter fullscreen mode Exit fullscreen mode

To be able to use the tailwind utility classes in your project, we can simply add it to our resources/css/app.css file:

@tailwind base;
@tailwind components;
@tailwind utilities;
Enter fullscreen mode Exit fullscreen mode

These tailwind directives are picked up by our webpack build processes and the tailwind utility classes are placed within the final css file produced.

We can finally add the stylesheet to our welcome.blade.php to use the styles in our project:

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">


        <!-- Fonts -->
        <link href=";600;700&display=swap" rel="stylesheet">
        <link rel="stylesheet" href="{{ asset('css/app.css') }}">
        <div id="app"></div>
    <script src="{{ asset('js/app.js') }}"></script>
Enter fullscreen mode Exit fullscreen mode

You may again have to restart the development server and/or restart the build process.

We can now add a few utility classes to our component to test that everything works:

    <div class="flex justify-center mt-24">
        <h1 class="text-2xl font-bold text-gray-700">Vue 3 App</h1>
Enter fullscreen mode Exit fullscreen mode

The result being:

Styled heading

Awesome! We can now style our project using TailwindCSS.

We can now go about setting up a Sqlite database for our development.

Setting up Sqlite

In our database folder we can create a new file called database.sqlite. This will be our database for development purposes. It is a very lightweight option and every handy, particularly for learning purposes.

We now need to configure Laravel to use our new database file. To do this we need to update our .env file:

Enter fullscreen mode Exit fullscreen mode

The default setup can be replaced with the one above. To test this setup we can run a migration using the following command:

php artisan migrate

I usually restart the development server before running the migrate command. If all goes well, you can see the following output:

Screenshot of terminal output

That is it!

You now have a Laravel project ready for further development.


I hope this article provides you with the necessary information to build your own app that uses Laravel 8 and Vue 3 with TailwindCSS.

Let me know in the comments what frameworks you are using in your projects.

I'd love to know!

Latest comments (3)

philipphoenigs profile image

Hi, i think there is one step missing. You have to add

content: [

to your tailwind.config.js

prayforthegod profile image

Image description

melaniecarr23 profile image

Thank you! I've used many frameworks from Yii, Yii2, Ionic / Angular, and most recently loving Laravel. I'm pretty new to Vue, and am beginning to try to learn Tailwind as it seems to make much more sense to me than the other way of styling with css. This worked well.

11 Tips That Make You a Better Typescript Programmer


1 Think in {Set}

Type is an everyday concept to programmers, but it’s surprisingly difficult to define it succinctly. I find it helpful to use Set as a conceptual model instead.

#2 Understand declared type and narrowed type

One extremely powerful typescript feature is automatic type narrowing based on control flow. This means a variable has two types associated with it at any specific point of code location: a declaration type and a narrowed type.

#3 Use discriminated union instead of optional fields


Read the whole post now!