Al servir archivos JavaScript, ¿es mejor utilizar la aplicación / javascript o la aplicación / x-javascript?

95

Toda la pregunta encaja en el título. Y para agregar algo de contexto: no estoy preguntando qué es lo mejor de acuerdo con lo que dicen las especificaciones, sino qué funciona mejor dada la combinación de navegadores implementados en la actualidad.

Algunos puntos de datos:

  • Google utiliza text/javascriptpara el JS utilizado en su página de inicio.
  • Google utiliza text/javascripten Google Docs.
  • Google utiliza application/x-javascriptpara servir archivos JavaScript con su servicio de bibliotecas Ajax .
  • Yahoo utiliza application/x-javascriptpara servir su JS.
  • Yahoo utiliza application/x-javascriptpara el JavaScript servido en su página de inicio.
avernet
fuente
4
Gracioso. Da una tercera alternativa en sus ejemplos ... Y según Tim, ambos grandes jugadores están equivocados (con respecto a los estándares), lo que probablemente solo signifique que los navegadores son tolerantes (no hay grandes noticias aquí) y puede que no importe.
PhiLho
1
posible engaño: Javascript MIME Type
Bergi

Respuestas:

115
  • text/javascript es obsoleto
  • application/x-javascript fue experimental mientras decidía mudarse a ...
  • application/javascript es el tipo MIME oficial actual para JS

Dicho esto, los navegadores a menudo ignoran lo content-typeenviado por el servidor y prestan mucha atención al typeatributo (y es posible que algunos aún no lo reconozcan application/javascript).

Mi recomendación:

  • Utilice la aplicación / javascript en el servidor
  • Utilice HTML 5 y omita el typeatributo de los elementos del script

NB: la especificación HTML contradice el estándar MIME, y hay un esfuerzo para volver a cambiarlo para text/javascriptque esto pueda cambiar en el futuro.

Quentin
fuente
3
Esta pregunta de hace unos meses dice exactamente lo contrario. Alguien está equivocado :) "Kelly tiene razón, los navegadores tienden a confiar en el tipo MIME enviado con los encabezados de respuesta sobre el atributo de tipo de la etiqueta de script" stackoverflow.com/questions/189850/…
Marco
6
¡Oh no! ¡Las organizaciones grandes, monolíticas y lentas deben tener razón! ¡La especificación debe ser incorrecta! Narghh. Seguiré confiando en la especificación y en mi propia experiencia en empresas grandes (lentas), incluso si alguna de ellas solía contratarme.
Quentin
1
Hmm, alguien olvidó decirle al W3C que el texto / javascript es obsoleto. Parece ser el predeterminado en HTML 5 . :: scratches head :: También parece (si mi lectura superficial de esta sección es correcta) que se supone que los agentes de usuario deben ir solo en el typeatributo, ignorando así el Content-typecomportamiento correcto.
big_m
1
@big_m: esto se debe a que muchos navegadores no reconocen, application/javascriptpor lo que especificarlo hará que ignoren el script. Se supone que los agentes de usuario no deben ignorar el tipo de contenido. El atributo de tipo les dice qué esperar. Si no lo admiten, no deberían molestarse en solicitarlo. Si el servidor luego dice que es algo diferente, debería continuar con eso en lugar de lo que dice el HTML (al menos de acuerdo con HTTP, es posible que esté mirando una especificación diferente, no proporcionó ningún enlace).
Quentin
1
@Quentin, me refería a la sección HTML 5 sobre el scriptelemento al que me vinculé . Mi lectura de esa sección es diferente de lo que usted describe; parece darle mucha importancia al typeatributo y no menciona la verificación Content-Type, excepto para determinar la codificación de caracteres. Estoy de acuerdo en que parece que sería prudente que el agente de usuario verificara que el tipo de contenido coincide con lo esperado, pero no he encontrado nada en la especificación HTML que requiera o incluso recomiende hacerlo.
big_m
12

En la mayoría de las situaciones, el tipo de mímica que envía el servidor no supone una diferencia práctica. Yo iría con application / javascript , que también es recomendado por un RFC.

Matthew Flaschen
fuente
7

Si elige utilizar application / javascript para js en sus páginas, IE7 e IE8 no ejecutarán su script. Culpe a Microsoft todo lo que quiera, pero si quiere que la mayoría de la gente ejecute sus páginas, use texto / javascript.

Dibujó B
fuente
3
Cuando dice que "aplicación / javascript" no funcionará, ¿quiere decir si eso se establece como el tipo de contenido en la respuesta HTTP o como el atributo "tipo" de una etiqueta de secuencia de comandos? La pregunta original estaba relacionada con el tipo de contenido en las respuestas HTTP. Según otras respuestas, parece que solo el valor del atributo "tipo" en las etiquetas de script hará una diferencia de cualquier manera en IE.
Jesse Hallett
7

Solía ​​serlo language="javacript". Luego cambió a type="text/javascript". Ahora lo es type="application/javacript". Ok, esto se está volviendo tonto. Algunos de los navegadores más antiguos no reconocen el nuevo application/javascript, pero aún reconocen el más antiguo text/javascript. Planeo continuar usando esto, o de lo contrario perderé horas de mi tiempo tratando de cambiar CADA instancia de text/javascripten application/javascript.
Ahora bien, algún día podría suceder lo contrario. Algún día, los navegadores más nuevos podrían rechazar la vieja técnica para cumplir estrictamente con los estándares.
Pero hasta que las personas que visitan mi sitio web comienzan a quejarse de que "desde que actualicé mi navegador, aproximadamente el 50% de su sitio web desapareció", no tengo ningún motivo para cambiar el código de mi sitio web.

Sandip Armal Patil
fuente
7

Aquí está la respuesta de 2020 a esta pregunta.

text/javascriptes el tipo MIME de JavaScript correcto según el estándar HTML , que establece:

Los servidores deben utilizar los text/javascriptrecursos de JavaScript. Los servidores no deben usar otros tipos de MIME de JavaScript para los recursos de JavaScript y no deben usar tipos de MIME que no sean de JavaScript.

Y tambien :

[…] El tipo MIME usado para referirse a JavaScript en esta especificación es text/javascript, ya que es el tipo más comúnmente usado, a pesar de ser un tipo oficialmente obsoleto según RFC 4329.

Se está trabajando para reflejar esta realidad en un RFC a nivel de IETF: https://datatracker.ietf.org/doc/draft-ietf-dispatch-javascript-mjs/

Cualquier afirmación de que " text/javascriptes la obsoleta" se basa en RFC 4329, que tanto el estándar HTML como el borrador IETF mencionado anteriormente (es decir, un próximo RFC) están corrigiendo explícitamente.

Mathias Bynens
fuente