Usare lo shadow DOM come un iframe migliore
Mailcoach può inviare bellissime newsletter al tuo pubblico. Può anche mostrare qualsiasi newsletter inviata in un bellissimo archivio che puoi personalizzare a tuo piacimento.
In questo post del blog vorrei spiegare come ci assicuriamo che il CSS della nostra pagina web non rovini il layout della tua newsletter.
Benvenuti nello Shadow DOM
Diamo un'occhiata a una pagina di dettaglio di una newsletter inviata.
Questa pagina ha due parti. In alto troviamo il modulo di iscrizione, mentre il contenuto della newsletter è mostrato in basso.
La newsletter è un documento HTML completo, quindi non possiamo semplicemente prendere un documento HTML completo e usarlo nel template principale. Anche se prendessimo solo il contenuto della parte body della newsletter e lo iniettassimo nella pagina, ci sarebbe comunque un problema con lo styling.
Vogliamo assicurarci che lo styling della pagina web sia indipendente da come viene visualizzata la newsletter e viceversa. Sarebbe piuttosto brutto se mostrassimo la newsletter usando lo stesso colore di sfondo giallo del sito, visto che la newsletter non è stata inviata con uno sfondo giallo.
Questi problemi possono essere risolti usando lo shadow DOM. Usando lo Shadow DOM, puoi incapsulare una porzione di HTML. Ciò che viene renderizzato al suo interno non è influenzato dalle altre parti della tua pagina e viceversa.
Vediamo come usiamo lo shadow DOM in Mailcoach. Ecco una parte dell'HTML usato per renderizzare la pagina di dettaglio mostrata sopra.
<nav class="back">
<a href="{{ $emailList->websiteUrl() }}">
<i>←</i> Back to overview
</a>
</nav>
<div class="show">
<article class="card">
<header class="card-header">
<time datetime="{{ $campaign->sent_at }}">{{ $campaign->sent_at->format('F j, Y') }}</time>
<h2>{{ $campaign->subject }}</h2>
</header>
<div class="webview">
<x-mailcoach::web-view :html="$webview"/>
</div>
</article>
</div>
Nota che il componente Blade web-view riceve la variabile $webview, che contiene l'intero contenuto HTML di una newsletter inviata.
Quel componente Blade web-view è supportato da questa view che contiene la ✨ magia dello shadow DOM ✨.
<script>
class EmbeddedWebview extends HTMLElement {
connectedCallback() {
const shadow = this.attachShadow({ mode: 'closed' });
shadow.innerHTML = @json($html);
}
}
window.customElements.define('embedded-webview', EmbeddedWebview);
</script>
<embedded-webview />
Esaminiamo questo codice. Nella parte script, creiamo prima un HTMLElement personalizzato chiamato EmbeddedWebview. La funzione connectedCallback verrà chiamata quando il nostro elemento personalizzato viene renderizzato. Nella variabile shadow facciamo riferimento allo shadow DOM dell'elemento. E infine, impostiamo l'HTML dello shadow DOM all'HTML della newsletter (contenuto in $html).
Ricorda, il vantaggio principale di usare questo shadow DOM rispetto al DOM normale è che lo shadow DOM è completamente isolato dal DOM normale.
Infine, mettiamo il nostro elemento <embedded-webview /> nel DOM normale della pagina, che quando viene renderizzato eseguirà il codice nel tag script. Come vedi, non c'è poi così tanto codice coinvolto in tutto questo.
Perché non usare un iframe
Potresti chiederti perché non abbiamo usato un semplice iframe per questo. Lo shadow DOM offre vantaggi significativi rispetto a un iframe per questo caso d'uso.
Innanzitutto, il contenuto dello shadow DOM segue il flusso del documento HTML principale. L'HTML personalizzato crescerà insieme al contenuto, e non verranno introdotte barre di scorrimento o strani comportamenti di scrolling.
Il secondo vantaggio ha a che fare con la sicurezza. Impostando l'innerHTML dello shadow DOM, qualsiasi JavaScript presente nel valore dell'innerHTML non verrà eseguito. Questo è utile per impedire che qualcuno abusi di Mailcoach per mettere in scena attacchi XSS.
In conclusione
Usando lo shadow DOM, possiamo assicurarci che la newsletter inviata che mostriamo non sia influenzata dal layout del nostro sito web.
Altri articoli recenti
Laravel AI 1.1 e 1.2: Agent Skills, Cohere e structured output più solidi
Le release 1.1.0 e 1.2.0 di laravel/ai portano gli Agent Skills, l'approvazione obbligatoria per i tool built-in e nuovi provider come Cohere e Laya self-hosted. Sul fronte qualità arrivano i fix allo structured output per Bedrock e il supporto alle provider options. Aggiornati anche i modelli di default, con Claude 4.7+ che ignora i sampling params.
Laravel 13.35.0: scheduler più controllabile, code più flessibili e response Markdown
Laravel 13.35.0 porta Schedule::alwaysOnOneServer(), il supporto a schedule:interrupt per i comandi di lunga durata, --memory in percentuale per queue:work e il nuovo metodo markdown() sulla response factory. Tante piccole migliorie anche a test, view compilate in parallelo e dischi local.
BashBox: un interprete Bash in sandbox per agenti AI in PHP
BashBox è un interprete bash scritto in puro PHP che permette di eseguire gli script generati dagli agenti AI senza mai ricorrere a proc_open, exec o shell_exec. Ogni comando è una classe PHP che lavora su un filesystem virtuale, con limiti di esecuzione, quote disco e accesso di rete configurabili. Ideale per chi sviluppa agenti con il Laravel AI SDK o altre librerie simili.