DEV Community

Cover image for Creare una PWA con Laravel e Bootstrap | Building a PWA with Laravel and Bootstrap
Roberto Celano
Roberto Celano

Posted on

Creare una PWA con Laravel e Bootstrap | Building a PWA with Laravel and Bootstrap

Introduzione | Introduction

Italiano: Questo articolo è disponibile sia in italiano che in inglese. Scrolla verso il basso per la versione in inglese.

English: This article is available in both Italian and English. Scroll down for the English version.


🇮🇹 Come ho trasformato un sito Laravel in una PWA moderna

Negli ultimi anni le Progressive Web App (PWA) sono diventate uno standard per offrire un’esperienza simile a quella delle app native, direttamente dal browser. Nel mio caso, volevo che il mio portfolio personale – sviluppato in Laravel + Bootstrap – potesse essere installato su dispositivi mobile e desktop, mantenendo la leggerezza di un sito classico.

1. Creare il Manifest

Il primo passo è aggiungere il file manifest.json nella directory public/.
Contiene le informazioni che definiscono il comportamento della tua app una volta installata.

{
  "name": "Roberto Celano | Web Developer",
  "short_name": "RC Dev",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#0d1117",
  "theme_color": "#00bcd4",
  "icons": [
    {
      "src": "/assets/icons/icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/assets/icons/icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Ricorda di linkarlo nel tuo layout principale (resources/views/layouts/app.blade.php):

<link rel="manifest" href="{{ asset('manifest.json') }}">
Enter fullscreen mode Exit fullscreen mode

2. Registrare il Service Worker

Nel file public/service-worker.js:

self.addEventListener("install", () => {
  console.log("Service Worker installato");
});

self.addEventListener("fetch", (event) => {
  event.respondWith(fetch(event.request));
});
Enter fullscreen mode Exit fullscreen mode

E nella tua view Blade, aggiungi:

<script>
if ("serviceWorker" in navigator) {
  navigator.serviceWorker.register("/service-worker.js")
    .then(() => console.log("Service Worker registrato"))
    .catch(err => console.error("Errore:", err));
}
</script>
Enter fullscreen mode Exit fullscreen mode

3. Aggiungere il prompt d’installazione

Con questo snippet puoi mostrare il messaggio “Installa App”:

let deferredPrompt;
window.addEventListener("beforeinstallprompt", (e) => {
  e.preventDefault();
  deferredPrompt = e;
  document.getElementById("installButton").style.display = "block";
});
Enter fullscreen mode Exit fullscreen mode

Quando l’utente clicca il bottone:

installButton.addEventListener("click", async () => {
  deferredPrompt.prompt();
  const { outcome } = await deferredPrompt.userChoice;
  console.log("Scelta utente:", outcome);
});
Enter fullscreen mode Exit fullscreen mode

4. Test con Lighthouse

Apri ChromeDevToolsLighthouseProgressive Web App.
Ti mostrerà se la tua PWA è installabile e conforme agli standard.

5. Risultato finale

Ora il mio sito robertocelano.dev può essere installato come app su smartphone, tablet e desktop.
L’esperienza è fluida, il caricamento è rapido e l’interfaccia mantiene il design Bootstrap originale.


🇬🇧 How I turned a Laravel site into a modern PWA

In recent years, Progressive Web Apps (PWA) have become the standard for bringing native-like experiences to the browser. In my case, I wanted my personal portfolio — built with Laravel + Bootstrap — to be installable on mobile and desktop, while keeping the simplicity of a classic website.

1. Create the Manifest

Add a manifest.json file in your public/ directory:

{
  "name": "Roberto Celano | Web Developer",
  "short_name": "RC Dev",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#0d1117",
  "theme_color": "#00bcd4",
  "icons": [
    {
      "src": "/assets/icons/icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/assets/icons/icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Then link it in your main Blade layout (resources/views/layouts/app.blade.php):

<link rel="manifest" href="{{ asset('manifest.json') }}">
Enter fullscreen mode Exit fullscreen mode

2. Register the Service Worker

In public/service-worker.js:

self.addEventListener("install", () => {
  console.log("Service Worker installed");
});

self.addEventListener("fetch", (event) => {
  event.respondWith(fetch(event.request));
});
Enter fullscreen mode Exit fullscreen mode

And in your Blade view:

<script>
if ("serviceWorker" in navigator) {
  navigator.serviceWorker.register("/service-worker.js")
    .then(() => console.log("Service Worker registered"))
    .catch(err => console.error("Error:", err));
}
</script>
Enter fullscreen mode Exit fullscreen mode

3. Add the installation prompt

With this snippet you can show the “Install App” message:

let deferredPrompt;
window.addEventListener("beforeinstallprompt", (e) => {
  e.preventDefault();
  deferredPrompt = e;
  document.getElementById("installButton").style.display = "block";
});
Enter fullscreen mode Exit fullscreen mode

When the user clicks the button:

installButton.addEventListener("click", async () => {
  deferredPrompt.prompt();
  const { outcome } = await deferredPrompt.userChoice;
  console.log("User choice:", outcome);
});
Enter fullscreen mode Exit fullscreen mode

4. Test with Lighthouse

Open ChromeDevToolsLighthouseProgressive Web App.
It will show whether your PWA meets installability standards.

5. Final result

Now robertocelano.dev can be installed like an app on smartphones, tablets, and desktops — fast, responsive, and consistent with its Bootstrap design.


Traduzione

Questo articolo è stato tradotto con l'ausilio di strumenti di traduzione professionali.
This article was translated with the help of professional translation tools.

Top comments (0)