Créer une S.P.A. avec Laravel en 2 minutes - sans framework

Partager sur :

Créer une S.P.A. avec Laravel en 2 minutes

Le mécanisme wire:navigate de Livewire (v3) permet une navigation fluide façon SPA (Single Page Application) dans une application Laravel classique. Voici un tutoriel pour comprendre son fonctionnement interne et le reproduire sans utiliser tout le framework Livewire.

⚙️ Fonctionnement de wire:navigate

  1. HTML : Le lien est défini ainsi :
    <a href="/page" wire:navigate>Ma page</a>
  2. Interception JS : Livewire intercepte le clic via JavaScript et empêche le rechargement.
  3. Requête AJAX : Une requête GET est envoyée avec l’en-tête X-Livewire: true.
  4. Laravel répond sans layout : Livewire intercepte la requête et retourne uniquement le contenu de la page.
  5. Injection HTML côté client : Le JS remplace le contenu actuel de la page sans rechargement.

✅ Résultat

Une navigation fluide, sans rechargement complet, tout en gardant le rendu Laravel.

🔒 Isoler le mécanisme sans Livewire

Voici comment reproduire le fonctionnement de wire:navigate sans dépendre de Livewire :

1. JavaScript de navigation SPA


document.addEventListener('click', function (e) {
    const link = e.target.closest('a[spa-link]');
    if (link) {
        e.preventDefault();
        fetch(link.href, {
            headers: {
                'X-Requested-With': 'XMLHttpRequest',
                'X-Spa-Navigation': 'true'
            }
        })
        .then(res => res.text())
        .then(html => {
            document.getElementById('spa-content').innerHTML = html;
            history.pushState(null, '', link.href);
        });
    }
});

window.addEventListener('popstate', function () {
    fetch(location.href, {
        headers: {
            'X-Requested-With': 'XMLHttpRequest',
            'X-Spa-Navigation': 'true'
        }
    })
    .then(res => res.text())
    .then(html => {
        document.getElementById('spa-content').innerHTML = html;
    });
});
  

2. Contrôleur Laravel


public function showPage()
{
    $view = view('pages.ma-page');

    if (request()->header('X-Spa-Navigation') === 'true') {
        return $view; // sans layout
    }

    return view('layouts.app', ['content' => $view]);
}
  

3. Layout Blade

<!-- resources/views/layouts/app.blade.php -->
<html>
<head>
  <!-- ... -->
</head>
<body>
  <div id="spa-content">
    {!! $content ?? '' !!}
  </div>

  <script src="/js/spa-router.js"></script>
</body>
</html>
  

4. Liens SPA dans les vues

<a href="/contact" spa-link>Contact</a>

🔄 Comparaison rapide

Caractéristique Livewire Version custom SPA
Navigation fluide
Gestion scroll/états ⚠️ à gérer manuellement
Composants côté serveur
Légereté ⚠️ moyen-lourd ✅ ultra-léger
Indépendance de Livewire

💡 Astuces bonus

  • Tu peux améliorer ce système avec Turbo.js ou Alpine.js.
  • Pense à utiliser sessionStorage pour le cache client.

Tu veux un mini-routeur complet prêt à l’emploi ou un middleware SPA Laravel ? N’hésite pas à demander !