Bootstrap is a web development framework that is available for free and open source. It’s intended to make responsive, mobile-first website development easier by providing a collection of syntax for template designs.
In other words, Bootstrap enables web developers to build websites more quickly by eliminating the need to worry about basic commands and functions. It is made up of HTML, CSS, and JS scripts for various web design functions and components.
Vite is a build tool designed to provide a faster and leaner development experience for modern web projects.
Step 1: Install the Laravel Project
Installing a new Laravel app, so go to the terminal, type the command, and create a new Laravel app.
composer create-project --prefer-dist laravel/laravel:^9.0 laravel9-bootstrap5-vite
or, if you have the Laravel Installer installed as a global composer dependency:
laravel new laravel9-bootstrap5-vite
Step 2: Download and install Laravel UI for Bootstrap 5.
Then, in your terminal, type the following command:
composer require laravel/ui
Step 3: Configure Auth Scaffolding in Bootstrap 5
php artisan ui bootstrap --auth
Step 4: Install NPM Dependencies
To install frontend dependencies, run the following command:
npm install
Step 5: Import vite.config.js Bootstrap 5 Path
To begin, modify vite.config.js to include the bootstrap 5 path and remove resources/css/app.css.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import path from 'path'
export default defineConfig({
plugins: [
laravel([
'resources/js/app.js',
]),
],
resolve: {
alias: {
'~bootstrap': path.resolve(__dirname, 'node_modules/bootstrap'),
}
},
});
Step 6: Update bootstrap.js
Import should be used instead of require.
import loadash from 'lodash'
window._ = loadash
import * as Popper from '@popperjs/core'
window.Popper = Popper
import 'bootstrap'
/**
* We'll load the axios HTTP library which allows us to easily issue requests
* to our Laravel back-end. This library automatically handles sending the
* CSRF token as a header based on the value of the "XSRF" token cookie.
*/
import axios from 'axios'
window.axios = axios
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
/**
* Echo exposes an expressive API for subscribing to channels and listening
* for events that are broadcast by Laravel. Echo and event broadcasting
* allows your team to easily build robust real-time web applications.
*/
// import Echo from 'laravel-echo';
// window.Pusher = require('pusher-js');
// window.Echo = new Echo({
// broadcaster: 'pusher',
// key: process.env.MIX_PUSHER_APP_KEY,
// cluster: process.env.MIX_PUSHER_APP_CLUSTER,
// forceTLS: true
// });
Step 7: Import Bootstrap 5 SCSS in JS Folder
Now, in resources/js/app.js or resources/js/bootstrap.js, import the bootstrap 5 SCSS path.
resources/js/app.js
resources/js/app.js
import './bootstrap';
import '../sass/app.scss'
Step 8: Replace mix() with @vite Blade directive
When using Vite, the @vite Blade directive must be used instead of the mix() helper. Remove the mix helper and replace it with the @vite directive.
<link rel="stylesheet" href="{{ mix('css/app.css') }}">
<script src="{{ mix('js/app.js') }}" defer></script>
use @vite directive
@vite(['resources/js/app.js'])
views/layouts/app.blade
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
@vite(['resources/js/app.js'])
</head>
<body>
<div id="app">
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div class="container">
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar -->
<ul class="navbar-nav me-auto">
</ul>
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto">
<!-- Authentication Links -->
@guest
@if (Route::has('login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
</li>
@endif
@if (Route::has('register'))
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
</li>
@endif
@else
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ Auth::user()->name }}
</a>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
{{ __('Logout') }}
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
@csrf
</form>
</div>
</li>
@endguest
</ul>
</div>
</div>
</nav>
<main class="py-4">
@yield('content')
</main>
</div>
</body>
</html>
Step 9: Execute Vite Command to Create Asset File
npm run build
Step 10: Launch the Local server.
php artisan serve
All the best nerd!