¿Cuándo utilizar el tipo de aplicación MIME de JavaScript / javascript en lugar de texto / javascript?

157

Según la pregunta, el código jQuery no funciona en IE , text/javascriptse usa en documentos HTML para que Internet Explorer pueda entenderlo.

Pero me pregunto cuándo lo usarías application/javascripty, lo que es más importante, ¿por qué lo usarías en lugar de text/javascript?

Mark Baijens
fuente

Respuestas:

243

En teoría, de acuerdo con RFC 4329 , application/javascript.

La razón por la que se supone que applicationes no tiene nada que ver con si el tipo es legible o ejecutable. Es porque existen mecanismos personalizados de determinación de caracteres establecidos por el lenguaje / tipo en sí, en lugar de solo el charsetparámetro genérico . Un subtipo de textdebe ser capaz de ser transcodificado por un proxy a otro conjunto de caracteres, cambiando el parámetro del conjunto de caracteres. Esto no es cierto para JavaScript porque:

a. el RFC dice que los agentes de usuario deberían estar haciendo BOM-sniffing en el script para determinar el tipo (aunque no estoy seguro si algún navegador realmente hace esto);

si. los navegadores usan otra información (la codificación de la página incluida y en algunos navegadores el script charsetatributo) para determinar el conjunto de caracteres. Por lo tanto, cualquier proxy que intentara transcodificar el recurso rompería a sus usuarios. (Por supuesto, en realidad nadie usa transcodificadores de todos modos, pero esa era la intención).

Por lo tanto, los bytes exactos del archivo deben conservarse exactamente , lo que lo convierte en un applicationtipo binario y no técnicamente basado en caracteres text.

Por la misma razón, application/xmlse prefiere oficialmente sobre text/xml: XML tiene sus propios mecanismos de señalización de juego de caracteres en banda. Y todos ignoran también el applicationXML.

text/javascripty text/xmlpuede que no sea la Cosa correcta oficial, pero hay lo que todos usan hoy por razones de compatibilidad, y las razones por las que no son lo correcto prácticamente no tienen importancia.

bobince
fuente
44
La solución más "compatible" es no incluir ningún tipo de contenido en la respuesta. RFC establece que sin un tipo de contenido explícito, el receptor lo interpretaría "por contexto", que es siempre el comportamiento correcto para todos los navegadores desde los primeros navegadores
Pacerier
Tenga cuidado application/javascripty IE se ejecuta en modo de compatibilidad con IE=8. Parece que las secuencias de comandos en línea no se evalúan correctamente. text/javascriptfunciona bien allí.
Joscha
2
@Pacerier: sé que este comentario tiene 5 años, pero hoy en día a menudo es mejor incluir los tipos MIME, particularmente para los sitios web de tipo foro, por razones de seguridad. Hacer que el receptor interprete el tipo deja a uno abierto al ataque al cargar un archivo javascript malicioso como una imagen, y luego hacer que el navegador interprete y ejecute ese script. Es mejor que el servidor devuelva tipos mime para todas las respuestas y use el encabezado X-Content-Type-Options: nosniffpara evitar que el navegador interprete el tipo.
sammy_winter
@sammy_winter Veo advertencias como estas en todas partes y me encojo cada vez. Si permitiera a los usuarios cargar contenido, probablemente haría más validación que "oh sí, el nombre coincidió con la expresión regular para el archivo png, puedo confiar en eso", ¿no? Si el encabezado incorrecto se convierte en un "problema de seguridad", el problema puede ser más profundo, ¿no le parece? Esto es lo mismo que con ocultar Server: nginxo lo que sea que nginx envíe. Como si quien fuera capaz de encontrar un agujero necesita un encabezado explícito para saber qué servidor ejecuta ...
Sahsahae
17

El problema con el tipo MIME de Javascript es que no ha habido un estándar durante años. Ahora tenemos aplicación / javascript como un tipo MIME oficial.

Pero en realidad, el tipo MIME no importa en absoluto, ya que el navegador puede determinar el tipo en sí. Es por eso que las especificaciones HTML5 establecen que type="text/javascript"ya no es necesario.

Harmen
fuente
5

applicationporque .js-Los archivos no son algo que un usuario quiera leer, sino algo que debería ejecutarse.

thejh
fuente
Esa es la respuesta oficial, pero IE se ahoga.
Benn
20
@Benn: ¿Quizás porque los usuarios de IE tienen que leer todos los archivos JS porque no se ejecutan correctamente? Al menos, es honesto por Microsoft;)
thejh
Me encanta tu comentario, pero desafortunadamente las personas que no pueden leer JavaScript todavía usan IE, así que tenemos que lidiar con él :(.
Mark Baijens
1
No creo que quieras leerlo o no tiene algo que ver con por qué. Tiene que ver con cómo se transcodifican los datos, o más bien, si puede ser.
Zenexer
técnicamente, HTML y CSS también son "ejecutados" (analizados) por el navegador para producir el resultado del código como contenido visual y no está destinado a que el usuario lo "lea", por lo que esta respuesta no tiene mucho sentido. Supongo que existe una gran confusión sobre qué es "texto" y qué es "aplicación". Si pudiera votar en este asunto, diría que el IETF debería considerar los contenidos de "texto" como text, y binarycomo application-O el "propósito" de dicho tipo como en "imagen", o "documento", etc.
1

application / javascript es el tipo correcto de usar, pero dado que no es compatible con IE6-8, se quedará atascado con text / javascript. Si no le importa la validez (excluido HTML5), simplemente no especifique un tipo.

Radu
fuente
¿De dónde sacaste esto? Estoy bastante seguro de que es compatible. O, al menos, será ignorado.
Zenexer
@Zenexer leyó su respuesta a otra pregunta . Al parecer, la compatibilidad con IE significa que no application/javascript.
Camilo Martin
@CamiloMartin Lo uso bien con IE hasta 6 todo el tiempo. Solo tienen predeterminado JavaScript.
Zenexer
@Zenexer Hm, extraño. Me pregunto cuál fue el problema en las otras preguntas y respuestas.
Camilo Martin
@Zenexer Ha pasado un tiempo desde que tuve que lidiar con esto, pero aquí hay algunas otras cuentas de que esto causa problemas con IE6-8. No estoy completamente seguro de por qué esto solo parece importar algunas veces, pero en mi experiencia ha causado problemas.
Radu