amp-mustache
Description
consente il rendering dei modelli Mustache.js.
Required Scripts
<script async custom-template="amp-mustache" src="https://cdn.ampproject.org/v0/amp-mustache-0.2.js"></script>
Esempi
Consente il rendering di Mustache.js.
| Script obbligatorio | <script async custom-template="amp-mustache" src="https://cdn.ampproject.org/v0/amp-mustache-0.2.js"></script> |
| Esempi | Vedi l'esempio di amp-mustache annotato di AMP By Example. |
Note sulla versione
| Versione | Descrizione |
|---|---|
| 0.2 | Supporto per gli elementi <svg> e riduzione delle dimensioni dei gruppi (12,2 KB rispetto a 20,5 KB, compressione con gzip).Esegue la migrazione a una più moderna libreria di strumenti di pulizia HTML (da Caja a DOMPurify). Per questo motivo, a causa delle differenze nelle allowlist di attributi e tag, potrebbero verificarsi lievi modifiche che provocano interruzioni. Ti consigliamo di verificare le pagine prima di passare alla produzione, per assicurarti che le modifiche al markup generato non influiscano sulla funzionalità. |
| 0.1 | Implementazione iniziale. |
Sintassi
Mustache è una sintassi template che non utilizza la logica. Per ulteriori informazioni, consulta i documenti di Mustache.js. Di seguito sono riportati alcuni dei principali tag Mustache:
{{variable}}: tag variabile. Restituisce il valore di escape HTML di una variabile.{{#section}}{{/section}}: tag di sezione. Può verificare l'esistenza di una variabile e scorrerla se si tratta di un array.{{^section}}{{/section}}: tag invertito. Può verificare la non esistenza di una variabile.{{{unescaped}}}: HTML non escape. È limitato nel markup che potrebbe restituire (vedi "Restrizioni" di seguito).
Utilizzo
Il modello amp-mustache deve essere definito e utilizzato secondo le specifiche del modello AMP.
In primo luogo, amp-mustache deve essere dichiarato/caricato come segue:
<script src="https://cdn.ampproject.org/v0/amp-mustache-0.2.js" async="" custom-template="amp-mustache"></script>
I modelli Mustache possono essere quindi definiti in un tag 'script' o 'template' come questo:
<!-- Using template tag. --> <template type="amp-mustache"> Hello {{world}}! </template>
oppure
<script type="text/plain" template="amp-mustache"> Hello {{world}}! </script>
Dove possibile, utilizza il tag template, poiché la convalida AMP fornisce utili suggerimenti dev-x. Utilizza il modello script per casi limite e problemi relativi ai modelli nel contesto delle tabelle. Consulta la sezione "Tabelle" di seguito.
Il modo in cui vengono scoperti i modelli, quando ne viene effettuato il rendering, come vengono forniti i dati: tutto viene deciso dall'elemento AMP target, che utilizza questo modello per renderizzarne i contenuti (ad esempio in un amp-list, amp-form e così via).
Restrizioni
Convalida
Come tutti i modelli AMP, i template amp-mustache devono essere frammenti DOM ben strutturati. Ciò significa che non puoi utilizzare amp-mustache, ad esempio, per:
- Calcolare il nome del tag. Ad esempio,
<{{tagName}}>non è consentito. - Calcolare il nome dell'attributo. Ad esempio,
<div {{attrName}}=something>non è consentito.
L'output di "triple-mustache" è purificato e consente solo i seguenti tag: a, b, br, caption, colgroup, code, del, div, em, i, ins, li, mark, ol, p, q, s, small, span, strong, sub, sup, table, tbody, time, td, th, thead, tfoot, tr, u, ul.
Purificazione
L'output di Mustache viene purificato per motivi di sicurezza e per mantenere la validità AMP. Ciò potrebbe comportare la rimozione non segnalata di alcuni elementi e attributi.
Problematiche
Modelli nidificati
Per la convalida AMP, gli elementi <template> non devono essere secondari di altri elementi <template>. Ciò potrebbe verificarsi quando si nidificano due componenti che utilizzano modelli, ad esempio amp-list e amp-form.
Per risolvere il problema, gli elementi <template> possono anche essere indicati tramite id mediante l'attributo template sul componente. Ad esempio:
<amp-list id="myList" src="https://foo.com/list.json"> <template type="amp-mustache"> <div>{{title}}</div> </template> </amp-list>
Può anche essere rappresentato come:
<!-- Externalize templates to avoid nesting. --> <template type="amp-mustache" id="myTemplate"> <div>{{title}}</div> </template> <amp-list id="myList" src="https://foo.com/list.json" template="myTemplate"> </amp-list>
Tabelle
Poiché le stringhe del modello AMP devono essere specificate negli elementi <template>, può verificarsi un comportamento imprevisto dovuto all'analisi del browser. Ad esempio, gli elementi <table> possono causare l'associazione con un elemento padre del testo. Nel seguente esempio:
<template type="amp-mustache"> <table> <tr> {{#foo}}<td></td>{{/foo}} </tr> </table> </template>
Il browser creerà un'associazione con un elemento padre dei nodi di testo {{#foo}} e {{/foo}}:
{{#foo}}
{{/foo}}
<table>
<tr>
<td></td>
</tr>
</table>
Le soluzioni alternative includono il ritorno a capo automatico delle sezioni Mustache nei commenti HTML (ad esempio <!-- {{#bar}} -->), l'uso di elementi non appartenenti a tabelle come <div> o l'uso di un tag <script type="text/plain"> per definire i modelli.
<script type="text/plain" template="amp-mustache"> <table> <tr> {{#foo}}<td></td>{{/foo}} </tr> </table> </script>
Escape delle virgolette
Quando utilizzi amp-mustache per calcolare i valori degli attributi, l'escape delle virgolette può essere un problema. Ad esempio:
<template type="amp-mustache"> <!-- A double-quote (") in foo will cause malformed HTML. --> <amp-img alt="{{foo}}" src="example.jpg" width=100 height=100></amp-img> <!-- A single-quote (') or double-quote (") in bar will cause an AMP runtime parse error. --> <button on="tap:AMP.setState({foo: '{{bar}}'})">Click me</button> </template>
L'uso di codici di caratteri HTML nelle variabili {{foo}} o {{bar}} non funzionerà perché Mustache imposta come escape HTML i caratteri & (ad esempio " -> &quot;). Una soluzione alternativa consiste nell'utilizzo di caratteri facsimile, ad esempio ' (′) e " (″).
Esiste invece una proposta aperta per eseguire questa sostituzione in amp-mustache. Se vuoi sostenerla, scrivi un commento a riguardo.
Entità HTML
Le entità HTML non vengono mantenute negli elementi <template>.
Questo può essere un problema se vuoi eseguire il rendering lato server di un <template> contenente testo generato dall'utente, poiché il testo generato dall'utente contenente {{, }}, {{{, }}} verrà trattato come una sezione di Mustache. Ad esempio, sostituire {{ con le entità HTML {{ non funzionerà, perché queste non vengono mantenute quando il browser analizza il <template>.
Le soluzioni alternative includono la sostituzione di stringhe come {{ con caratteri diversi o l'eliminazione definitiva dai contenuti generati dall'utente.
Convalida
Consulta le regole amp-mustache nella specifica dello strumento di convalida AMP.
Hai letto questo documento decine di volte ma non risponde a tutte le tue domande? Forse ci sono altre persone col tuo stesso problema: entra in contatto con loro su Stack Overflow.
Vai a Stack Overflow Hai trovato un bug o una funzione mancante?Il progetto AMP invita tutti a partecipare e dare il proprio contributo! Ci auguriamo che tu possa partecipare regolarmente alla nostra community open source, ma saremo anche lieti di ricevere eventuali contributi una-tantum sulle questioni che ti interessano.
Vai a GitHub