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'
deferesaurimento degli script.
- Alcuni browser ritardano l'
DOMContentLoadedevento fino al termine del defercaricamento degli script, altri no.
- Alcuni browser obbediscono
deferad <script>elementi con codice incorporato e senza srcattributo, 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 DOMContentLoadeddell'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 deferaffatto.)