Înainte de a aprofunda PWA, este esențial să înțelegeți arhitectura aplicațiilor web moderne. Un PWA nu este doar un site web cu un Service Worker adăugat - este o aplicație construită pe principii arhitecturale solide care permit performanță, scalabilitate și reziliență.
Arhitectura aplicațiilor web moderne
Înainte de a aprofunda PWA, este esențial să înțelegeți arhitectura aplicațiilor web moderne. Un PWA nu este doar un site web cu un Service Worker adăugat...
Introducere
Modelul Application Shell
Arhitectura Application Shell (App Shell) este fundamentul oricărui PWA performant. Acest model separă infrastructura aplicației (shell-ul) de conținutul dinamic, permițând încărcarea instantanee a interfeței și popularea ulterioară a datelor.
Ce include App Shell?
Shell-ul aplicației cuprinde HTML-ul minim, CSS-ul și JavaScript-ul necesar pentru funcționarea interfeței. Acesta se memorează în cache la prima vizită și se încarcă instantaneu la vizitele ulterioare, indiferent de conexiunea la rețea.
Structura tipică a unui App Shell:
app/
├── index.html // Shell-ul HTML principal
├── css/
│ └── app-shell.css // Stiluri critice pentru shell
├── js/
│ ├── app.js // Logica principală a shell-ului
│ └── router.js // Navigare client-side
├── manifest.json // Web App Manifest
├── sw.js // Service Worker
└── assets/
├── icons/ // Icoane PWA
└── fonts/ // Fonturi localeFluxul de încărcare App Shell
Modele de arhitectură pentru PWA
| Model | Descriere | Utilizare recomandată |
|---|---|---|
| App Shell + conținut dinamic | Shell static în cache, date încărcate via API | Aplicații cu conținut frecvent actualizat |
| Full page caching | Întreaga pagină este memorată în cache | Site-uri cu conținut static sau rar actualizat |
| Streaming | Conținutul este transmis progresiv folosind Streams API | Aplicații cu multe date - liste, feed-uri |
| SPA (Single Page Application) | O singură pagină HTML cu navigare client-side | Aplicații complexe cu multe interacțiuni |
| MPA (Multi Page Application) | Pagini HTML multiple, fiecare cu propriul route | Site-uri de conținut, bloguri, e-commerce |
Exemplu practic: App Shell cu încărcare dinamică
// app-shell.js - Logica de încărcare a conținutului
class AppShell {
constructor() {
this.contentArea = document.getElementById('content');
this.loadingState = document.getElementById('loading');
}
async loadContent(url) {
this.showLoading();
try {
// Încearcă mai întâi din cache
const cached = await this.getFromCache(url);
if (cached) {
this.renderContent(cached);
}
// Apoi actualizează de pe rețea
const fresh = await fetch(url);
const data = await fresh.json();
this.renderContent(data);
this.saveToCache(url, data);
} catch (error) {
// Offline - afișează conținut din cache
const cached = await this.getFromCache(url);
if (cached) {
this.renderContent(cached);
this.showOfflineBanner();
} else {
this.showErrorPage();
}
}
}
async getFromCache(url) {
const cache = await caches.open('api-data');
const response = await cache.match(url);
return response ? response.json() : null;
}
async saveToCache(url, data) {
const cache = await caches.open('api-data');
const response = new Response(JSON.stringify(data));
await cache.put(url, response);
}
renderContent(data) {
this.hideLoading();
this.contentArea.innerHTML = this.template(data);
}
showLoading() {
this.loadingState.style.display = 'block';
}
hideLoading() {
this.loadingState.style.display = 'none';
}
}Continuați cu restul cursului
Acesta este capitolul 2 din cele 20 ale cursului, cu 6 lecții din 102. Cumpărați cursul și parcurgeți tot conținutul în cont, cu progres salvat, test final și certificat.
Cumpărați cursul la 110 €