Quand utiliser l'application de type JavaScript MIME / javascript au lieu de text / javascript?

157

Basé sur la question, le code jQuery ne fonctionne pas dans IE , text/javascriptest utilisé dans les documents HTML afin qu'Internet Explorer puisse le comprendre.

Mais je me demande, quand l'utiliseriez-vous application/javascriptet, plus important encore, pourquoi l'utiliseriez-vous à la place text/javascript?

Mark Baijens
la source

Réponses:

243

En théorie, selon RFC 4329 , application/javascript.

La raison pour laquelle il est censé être applicationn'a rien à voir avec le fait que le type soit lisible ou exécutable. C'est parce qu'il existe des mécanismes de détermination de jeu de caractères personnalisés définis par le langage / type lui-même, plutôt que simplement par le charsetparamètre générique . Un sous-type de textdoit pouvoir être transcodé par un proxy vers un autre jeu de caractères, en modifiant le paramètre charset. Ce n'est pas le cas de JavaScript car:

une. le RFC dit que les agents utilisateurs devraient faire un reniflage de nomenclature sur le script pour déterminer le type (je ne suis pas sûr que les navigateurs le fassent réellement);

b. les navigateurs utilisent d'autres informations - le codage de la page d'inclusion et dans certains navigateurs l' script charsetattribut - pour déterminer le jeu de caractères. Ainsi, tout proxy qui tenterait de transcoder la ressource briserait ses utilisateurs. (Bien sûr, en réalité, personne n'utilise jamais de proxy de transcodage de toute façon, mais c'était l'intention.)

Par conséquent, les octets exacts du fichier doivent être conservés exactement , ce qui en fait un applicationtype binaire et non techniquement basé sur des caractères text.

Pour la même raison, application/xmlest officiellement préféré à text/xml: XML a ses propres mécanismes de signalisation de jeu de caractères dans la bande. Et tout le monde ignore également le applicationXML.

text/javascriptet text/xmlpeut ne pas être la bonne chose officielle, mais il y a ce que tout le monde utilise aujourd'hui pour des raisons de compatibilité, et les raisons pour lesquelles ils ne sont pas la bonne chose sont pratiquement sans importance.

bobince
la source
4
La solution la plus «compatible» est de ne pas inclure du tout de type de contenu dans la réponse. RFC déclare que sans un type de contenu explicite, le récepteur l'interpréterait "par contexte", ce qui est toujours le comportement correct pour tous les navigateurs dès les tout premiers navigateurs
Pacerier
Soyez prudent avec application/javascriptet IE fonctionnant en mode de compatibilité avec IE=8. On dirait que les scripts en ligne ne sont pas correctement évalués. text/javascriptfonctionne bien là-bas.
Joscha
2
@Pacerier - Je sais que ce commentaire a 5 ans, mais aujourd'hui, il est souvent préférable d'inclure des types de mime, en particulier pour les sites Web de type forum, pour des raisons de sécurité. Le fait que le récepteur interprète le type laisse une personne vulnérable aux attaques en téléchargeant un fichier javascript malveillant en tant qu'image, puis en demandant au navigateur d'interpréter et d'exécuter ce script. Il est préférable que le serveur renvoie des types mime pour toutes les réponses et utilise l'en-tête X-Content-Type-Options: nosniffpour empêcher le navigateur d'interpréter le type.
sammy_winter
@sammy_winter Je vois des avertissements comme ceux-ci partout et je grince à chaque fois. Si j'autorisais les utilisateurs à télécharger du contenu, je ferais probablement plus de validation que "oh ouais, nom correspondant à l'expression régulière pour le fichier png, je peux faire confiance", n'est-ce pas? Si un en-tête incorrect devient un "problème de sécurité", le problème est peut-être quelque part plus profond, vous ne pensez pas? C'est la même chose qu'avec le masquage Server: nginxou tout ce que nginx envoie. Comme si quiconque est capable de trouver un trou avait besoin d'un en-tête explicite pour savoir quel serveur vous exécutez ...
Sahsahae
17

Le problème avec le type MIME de Javascript est qu'il n'y a pas de norme depuis des années. Maintenant, nous avons application / javascript comme type MIME officiel.

Mais en fait, le type MIME n'a pas du tout d'importance, car le navigateur peut déterminer le type lui-même. C'est pourquoi les spécifications HTML5 indiquent que le type="text/javascript"n'est plus nécessaire.

Harmen
la source
5

applicationparce que .js-Les fichiers ne sont pas quelque chose qu'un utilisateur veut lire mais quelque chose qui devrait être exécuté.

thejh
la source
C'est la réponse officielle mais IE s'étouffe dessus.
Benn
20
@Benn: Peut-être parce que les utilisateurs d'IE doivent lire tous les fichiers JS parce qu'ils ne s'exécutent pas correctement? Au moins, c'est honnête par Microsoft;)
thejh
J'adore votre commentaire, mais malheureusement, les gens qui ne peuvent pas lire javascript utilisent toujours IE, nous devons donc nous en occuper :(.
Mark Baijens
1
Je ne pense pas que vous vouliez ou non le lire ait quoi que ce soit à voir avec pourquoi. Cela a à voir avec la façon dont les données sont transcodées - ou plutôt, si elles peuvent l'être.
Zenexer
techniquement, HTML et CSS sont également "exécutés" (analysés) par le navigateur pour produire le résultat du code sous forme de contenu visuel et ne sont pas destinés à l'utilisateur pour le "lire", donc, cette réponse n'a pas beaucoup de sens. J'imagine qu'il y a une grande confusion quant à ce qu'est le «texte» et ce qu'est «l'application». Si je pouvais voter dans cette affaire, je dirais que l'IETF devrait considérer le contenu «texte» comme text, et binarycomme application«but» dudit type comme «image», ou «document», etc.
1

application / javascript est le type correct à utiliser, mais comme il n'est pas pris en charge par IE6-8, vous allez être bloqué avec du texte / javascript. Si vous ne vous souciez pas de la validité (HTML5 exclu), ne spécifiez simplement pas de type.

Radu
la source
Où as-tu eu ça? Je suis presque sûr qu'il est pris en charge. Ou, du moins, il sera ignoré.
Zenexer
@Zenexer a lu sa réponse à une autre question . Apparemment, la compatibilité IE signifie non application/javascript.
Camilo Martin
@CamiloMartin Je l'utilise bien avec IE jusqu'à 6 tout le temps. Ils utilisent simplement JavaScript par défaut.
Zenexer
@Zenexer Hm, étrange. Je me demande quel était le problème dans les autres questions et réponses.
Camilo Martin
@Zenexer Cela fait un moment que je n'ai pas eu à faire face à cela, mais voici quelques autres récits de ce qui cause des problèmes avec IE6-8. Je ne sais pas vraiment pourquoi cela ne semble avoir d'importance que quelques fois, mais d'après mon expérience, cela a causé des problèmes.
Radu