web-dev-qa-db-fra.com

A quoi sert l’attribut HTML "nomodule" pour les éléments de script si la valeur par défaut est text/javascript?

Je ne comprends pas clairement pourquoi l'attribut nomodule existe dans les nouveaux navigateurs prenant en charge les modules ES6.

En HTML 5, l'attribut type est facultatif et par défaut, text/javascript :

L'attribut type donne la langue du script ou le format des données. Si l'attribut est présent, sa valeur doit être un type MIME valide. Le paramètre charset ne doit pas être spécifié. La valeur par défaut, utilisée si l'attribut est absent, est "text/javascript".

La valeur par défaut n'est pas <script type="module" src="module.js"></script>. Ce défaut a-t-il changé? Si non, pourquoi nomodule serait-il nécessaire? Puis-je simplement utiliser <script src="bundle.js"></script> sans nomodule?

15
dman

Le but de de l'attribut nomodule est de faire en sorte que les nouveaux navigateurs prenant en charge les scripts module ignorent un élément script particulier:

L'attribut nomodule est un attribut booléen qui empêche l'exécution d'un script dans les agents utilisateurs prenant en charge les scripts de module.

La spécification a un bon exemple :

Cet exemple montre comment inclure un script de module pour les agents utilisateur modernes et un script classique pour les agents utilisateur plus anciens:

<script type="module" src="app.js"></script>
<script nomodule src="classic-app-bundle.js"></script>

Dans les agents utilisateurs modernes qui prennent en charge les scripts de module, l'élément script avec l'attribut nomodule sera ignoré et l'élément script avec le type "module" sera récupéré et évalué (en tant que script de module). Inversement, les agents utilisateurs plus anciens ignoreront l'élément script avec le type "module", car il s'agit d'un type de script inconnu pour eux - mais ils n'auront aucun problème à extraire et à évaluer l'autre élément script (en tant que script classique), car ils n'implémentez pas l'attribut nomodule.

C’est comme ça que ça fonctionne.

En HTML 5, l'attribut type est facultatif et sa valeur par défaut est text/javascript… Cette valeur par défaut at-elle changé?

La valeur par défaut n’a pas changé. Elle est toujours text/javascript. Mais l'attribut type peut maintenant aussi avoir la valeur module, ce qui signifie que les navigateurs continuent à l'analyser et à l'exécuter en tant que text/javascript— mais aussi spécifiquement en tant que script module

Si non, pourquoi nomodule serait-il nécessaire?

C’est nécessaire afin d’empêcher les nouveaux navigateurs prenant en charge les scripts de module d’exécuter un script destiné uniquement aux anciens navigateurs qui ne prennent pas en charge les scripts de module, comme dans l’exemple ci-dessus.

Puis-je simplement utiliser <script src="bundle.js"></script> sans nomodule?

Oui, si bundle.js n’utilise pas de modules. S'il utilise des modules, vous voudriez y mettre type=module (auquel cas les anciens navigateurs l'ignoreront car ils ne reconnaissent pas la valeur module pour type).

31
sideshowbarker

attribut nomodule

L'attribut nomodule est un attribut booléen utilisé pour indiquer à un navigateur qui ne supporte pas les modules qu'une certaine balise de script n'a pas besoin d'être chargée

Le but de l'attribut nomodule est d'avoir un script backup pour les navigateurs plus anciens qui ne supportent pas le <script type="module"> et les ignoreront donc. L'ancien navigateur ne prenant en charge ni l'attribut <script type="module"> ni l'attribut nomodule, les scénarios suivants peuvent se produire:


Nouveaux navigateurs, supporte <script type="module"> & <script nomodule type="text/javascript">

  • Le navigateur peut charger et exécuter le script <script type="module">
  • Le navigateur reconnaît l'attribut nomodule et ne charge pas <script nomodule type="text/javascript">

Les anciens navigateurs, ne [ne supportent pas <script type="module"> & <script nomodule type="text/javascript">

  • Le navigateur ignorera le <script type="module"> car son implémentation ne peut pas le traiter. Aucun script ne sera téléchargé et exécuté.
  • Le navigateur ignorera l’attribut nomodule depuis et continuera à télécharger et à exécuter le script <script nomodule type="text/javascript">.
0