Capitol gratuit

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

Î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ță.

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 locale

Fluxul de încărcare App Shell

Prima vizită: browserul descarcă HTML-ul, CSS-ul și JS-ul shell-ului. Service Worker-ul este instalat și memorează în cache toate resursele shell.
Vizite ulterioare: Service Worker-ul interceptează cererile și servește shell-ul din cache instantaneu (sub 100ms).
Conținut dinamic: După încărcarea shell-ului, aplicația solicită datele de la API prin rețea sau din cache-ul local.
Actualizare: Service Worker-ul verifică în fundal dacă există o versiune nouă a shell-ului și o pregătește pentru următoarea vizită.

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 €