11484 sujets

JavaScript, DOM et API Web HTML5

bonjour
j'aimerai vos conseils pour optimiser la rapidite de mes pages notamment pour 3 scripts

widgets facebook
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v4.0"></script>

widgets twitter
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

et google
<script async src="https://www.googletagmanager.com/gtag/js?id=xx-xxxx"></script>

ils sont tous les 3 asynchrones et celui de facebook est note defer en plus

j'ai tout mis en bas de mes pages, est-ce une bonne pratique ou bien a-t-on interet à les remonter dans la page pour un chargement globale plus rapide?
merci
Modifié par nantais (16 Sep 2019 - 17:51)
Salut

Extraits de https://developer.mozilla.org/fr/docs/Web/HTML/Element/script

async

mdn a écrit :
Cet attribut booléen indique si le navigateur doit, dans la mesure du possible, exécuter les scripts de manière asynchrone. Cet attribut ne doit pas être utilisé si l'attribut src est absent (c'est-à-dire pour les scripts « inline » déclarés dans les éléments), dans ce cas il n'aurait aucun effet.
Par défaut, les navigateurs prennent l'hypothèse la plus pessimiste et chargent les scripts de façon synchrone (autrement dit, le comportement par défaut est async="false") lors de l'analyse du document HTML.

Les scripts insérés dynamiquement (via document.createElement()) sont exécutés de façon asynchrone par défaut. Pour activer le mode d'exécution synchrone, il faudra explicitement indiquer async="false".


defer

mdn a écrit :
Cet attribut booléen permet d'indiquer au navigateur que le script doit être exécuté après l'analyse du document et avant l'évènement DOMContentLoaded. Cet attribut ne doit pas être utilisé si l'attribut src est absent (c'est-à-dire pour les scripts contenus déclarés dans les éléments), dans ce cas il n'aurait aucun effet. Pour obtenir un effet similaire avec les scripts insérés de façon dynamique, on utilisera explicitement async=false. Les scripts qui possèdent un attribut defer seront exécutés dans l'ordre dans lequel ils apparaissent dans le document.

Les scripts qui utilisent l'attribut defer empêche le déclenchement de l'évènement DOMContentLoaded tant que le script n'a pas été chargé et que son évaluation n'est pas terminée.


Personnellement, tous les scripts externes sont dans le HEAD avec l'attribut defer seulement. Mon script est toujours dans un module qui a l'attribut defer par défaut. Exemple :

<script defer src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/locale/fr.js"></script>
<script defer src="https://danielhagnoul.developpez.com/lib/dvjh/dvjhUtilities-1.8.5.js"></script>

<script type="module" src="{{dvp_js}}"></script>


Nota bene : src="{{dvp_js}}" est une écriture comprise par le serveur Flask (Python)

Le squelette de mon module principal est :

window.document.addEventListener('DOMContentLoaded', ev => {
    // le DOM est construit, la page web n'est pas visible
    moment.locale('fr');
    console.log(`DOM ready : ${new kDvjhDate()}`);

    // début code du test

    // fin code du test

}, {
    capture: false,
    passive: true,
    once: false
});

window.addEventListener('load', ev => {
    // le DOM est construit et la page web est visible
    console.log(`Window load : ${new kDvjhDate()}`);

    // début code du test


    // fin code du test

    kIDUnique();
}, {
    capture: false,
    passive: true,
    once: false
});