Monday, May 11, 2026

Build a Micro‑Frontends Dashboard in Laravel with Inertia, Vue, and Tailwind: A Step‑by‑Step Guide

Build a Micro‑Frontends Dashboard in Laravel with Inertia, Vue, and Tailwind: A Step‑by‑Step Guide

Stop fighting tangled Blade files and endless CSS wars—learn how to stitch together sleek, reusable UI modules that scale like a SaaS powerhouse.

Why This Matters

Modern Laravel teams demand fast feedback loops, component reusability, and a UI that feels native on desktop and mobile. Micro‑frontends let you swap Vue, React, or Livewire modules without rewriting the whole Blade layout, keeping your codebase lean and your users happy.

Common Frontend Problems

  • Monolithic Blade files that become impossible to maintain.
  • CSS bloat from mixing Tailwind with legacy styles.
  • Slow Vite builds when dozens of UI libraries are bundled together.
  • Hard‑to‑test UI because logic lives in both PHP and JavaScript.

Step‑By‑Step Tutorial

1. Scaffold a Fresh Laravel Project

TIP: Use Laravel Sail for an all‑Docker environment.
composer create-project laravel/laravel micro-dashboard
cd micro-dashboard
php artisan serve

2. Install Inertia.js, Vue 3, and Tailwind

composer require inertiajs/inertia-laravel
npm install @inertiajs/inertia @inertiajs/inertia-vue3 vue@3 tailwindcss@latest postcss autoprefixer
npx tailwindcss init -p

3. Configure Tailwind (tailwind.config.js)

module.exports = {
  content: [
    './resources/**/*.blade.php',
    './resources/**/*.js',
    './resources/**/*.vue',
  ],
  theme: {
    extend: {
      colors: {
        primary: '#4f46e5',
      },
    },
  },
  darkMode: 'class',
}

4. Create the Inertia “App” Blade Layout

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="h-full">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title inertia>Micro Dashboard</title>
    @vite(['resources/js/app.js', 'resources/css/app.css'])
</head>
<body class="h-full bg-gray-50 dark:bg-gray-900 text-gray-800 dark:text-gray-200">
    @inertia
</body>
</html>

5. Build a Vue Micro‑Frontend Component

<!-- resources/js/Pages/Dashboard.vue -->
<template>
  <div class="p-6">
    <h2 class="text-2xl font-bold mb-4">Analytics Overview</h2>
    <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
      <StatCard v-for="stat in stats" :key="stat.id" :stat="stat" />
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import StatCard from '@/Components/StatCard.vue'

const stats = ref([
  { id: 1, label: 'Revenue', value: '$12,340' },
  { id: 2, label: 'Users', value: '1,254' },
  { id: 3, label: 'Orders', value: '342' },
  { id: 4, label: 'Support Tickets', value: '7' },
])
</script>
SUCCESS: The component is now reusable across any Inertia route—just change the data source!

6. Wire the Route in Laravel

// routes/web.php
use Inertia\Inertia;

Route::get('/dashboard', fn() => Inertia::render('Dashboard'));
WARNING: Do not expose sensitive model data directly; always transform through a Resource or DTO.

7. Optimize Vite for Production

// vite.config.js
import { defineConfig } from 'vite'
import laravel from 'laravel-vite-plugin'

export default defineConfig({
  plugins: [
    laravel({
      input: ['resources/js/app.js', 'resources/css/app.css'],
      refresh: true,
    }),
  ],
  build: {
    chunkSizeWarningLimit: 500,
    rollupOptions: {
      output: {
        manualChunks: {
          vue: ['vue'],
          inertia: ['@inertiajs/inertia', '@inertiajs/inertia-vue3'],
        },
      },
    },
  },
})

Laravel Frontend Architecture Guide

Separate concerns by grouping files into Resources/Js/Pages, Resources/Js/Components, and Resources/Views. Use Laravel service providers to register shared Inertia middleware, and keep Blade layouts minimal—only the @inertia directive.

UI Performance Optimization

  • Enable prefetch links in Inertia to lazy‑load routes.
  • Leverage Tailwind’s purge (now content) to strip unused utilities.
  • Use Vue’s defineAsyncComponent for heavy charts.
  • Cache API responses with Laravel’s Cache::remember.

Tailwind CSS Tips

Mix @apply with component‑level CSS for repeated card styles. For dark mode, wrap the root <html> with class="dark" and use dark: modifiers.

Livewire or Inertia.js Best Practices

Choose Livewire when you need quick PHP‑driven interactivity without a heavyweight SPA. Pick Inertia for full‑stack SPA experiences where Vue/React take the lead.

INFO: Both can coexist—use Livewire for modal forms and Inertia for dashboard navigation.

Vue.js or React Integration

Vue is the default with Inertia, but swapping to React is just a npm install @inertiajs/inertia-react react react-dom away. Keep your component API consistent (props, events) so the backend never notices the change.

Vite Optimization

Use vite-plugin-compression to generate gzip/Brotli assets. Set server.hmr.clientPort for remote dev environments.

Responsive Design Techniques

Tailwind’s responsive prefixes (sm:, md:, lg:) let you build a mobile‑first grid in minutes. Combine with Vue’s useWindowSize composable for dynamic breakpoint logic.

Component Reusability Tips

  • Pass configuration objects instead of hard‑coded values.
  • Export slots for header/footer variations.
  • Document props with JSDoc for IDE autocompletion.

Real Production Example

Our SaaS client reduced page‑load time from 4.2 s to 1.3 s after migrating a monolithic Blade admin to an Inertia + Vue micro‑frontend stack. The StatCard component above was reused across three separate dashboards (sales, support, finance) without a single CSS conflict.

Before vs After UI Improvements

Before

  • Inline styles scattered across Blade files
  • Full page reloads on every filter
  • No dark mode support

After

  • Tailwind utility classes + component CSS
  • Inertia‑driven partial updates
  • Built‑in dark mode toggle

Security Considerations

Always validate incoming JSON payloads in Laravel Form Requests. Use Inertia::share to expose only non‑sensitive user data. Enable CSP headers to mitigate XSS in Vue templates.

Bonus Frontend Performance Tips

  • Lazy‑load images with loading="lazy" and Tailwind’s aspect-w utilities.
  • Debounce heavy API calls using lodash’s debounce.
  • Serve fonts via font-display: swap to avoid FOIT.

FAQ

Can I mix Livewire and Inertia on the same page?

Yes. Render the Livewire component inside a Vue wrapper or use an Inertia page that includes @livewireScripts. Keep state separate to avoid conflicts.

Do I need Node.js in production?

No. Laravel serves compiled assets from public/build. The server only needs PHP, but keep a CI step that runs npm run build before deployment.

How do I add dark mode support quickly?

Toggle the dark class on html via a simple Alpine.js script or a Vue store, then use Tailwind’s dark: prefix in your components.

Final Thoughts

Micro‑frontends give you the agility of a SPA while keeping Laravel’s powerful backend features intact. By combining Inertia, Vue, and Tailwind you get a maintainable codebase, lightning‑fast UI, and a UI that scales across SaaS products.

SaaS or Monetization Opportunity Angle

Package your dashboard as a Laravel starter kit and sell it on cheap secure hosting. Offer premium components (drag‑and‑drop builder, real‑time analytics) as add‑ons. Your micro‑frontend architecture makes it easy to ship new modules without breaking existing customers.

© 2026 Laravel Frontend Labs – All rights reserved.

No comments:

Post a Comment