La vera risposta è: perché non puoi fidarti del differimento.
Nel concetto, differire e asincrono differiscono come segue:
async consente di scaricare lo script in background senza bloccarlo. Quindi, nel momento in cui termina il download, il rendering viene bloccato e lo script viene eseguito. Il rendering riprende quando lo script è stato eseguito.
differire fa la stessa cosa, ad eccezione delle affermazioni per garantire che gli script vengano eseguiti nell'ordine in cui sono stati specificati nella pagina e che verranno eseguiti al termine dell'analisi del documento. Pertanto, alcuni script potrebbero terminare il download, quindi sedersi e attendere gli script scaricati in seguito, ma visualizzati prima di essi.
Sfortunatamente, a causa di ciò che è veramente un combattimento tra gatti standard, la definizione del differimento varia da specifica a specifica, e anche nelle specifiche più recenti non offre una garanzia utile. Come le risposte qui e questo problema dimostrano, i browser implementano il differimento in modo diverso:
- In alcune situazioni alcuni browser hanno un bug che causa l'
defer
esaurimento degli script.
- Alcuni browser ritardano l'
DOMContentLoaded
evento fino al termine del defer
caricamento degli script, altri no.
- Alcuni browser obbediscono
defer
ad <script>
elementi con codice incorporato e senza src
attributo, e altri lo ignorano.
Fortunatamente la specifica specifica almeno che l'asincrono ha la precedenza sul differimento. Quindi puoi trattare tutti gli script come asincroni e ottenere un'ampia gamma di supporto del browser in questo modo:
<script defer async src="..."></script>
Il 98% dei browser in uso in tutto il mondo e il 99% negli Stati Uniti eviteranno di bloccare con questo approccio.
(Se devi attendere fino al termine dell'analisi del documento, ascolta l'evento DOMContentLoaded
dell'evento o usa la comoda .ready()
funzione di jQuery . Ti consigliamo di farlo comunque per tornare indietro con grazia sui browser che non si implementano defer
affatto.)