Diferença entre os tipos de conteúdo application / x-javascript e text / javascript

245

Qual é a diferença entre esses cabeçalhos?

Content-Type: application/javascript
Content-Type: application/x-javascript
Content-Type: text/javascript

Qual é o melhor e por quê?

Por favor, não diga que eles são idênticos - se eles fossem idênticos, não haveria três deles. Conheço os dois trabalhos - mas gostaria de saber a diferença.

Obmerk Kronen
fonte
1
A diferença também é uma razão clássica pela qual seus scripts não estão sendo compactados. Verifique se você possui uma entrada no httpCompression para o tipo real que está sendo veiculado e observe que o IIS Express compacta apenas application / x-javascript e text / * por padrão.
RISM
NB: Uma lista completa de "tipos mime de javascript" pode ser encontrada aqui: html.spec.whatwg.org/multipage/… . ou seja, esta é a lista de valores que um navegador deve permitir para scripto typeatributo de uma tag quando a nosniffdiretiva é especificada. developer.mozilla.org/pt-BR/docs/Web/HTTP/Headers/…
JohnLBevan 4/17

Respostas:

320

text/javascripté obsoleto e application/x-javascriptfoi experimental (daí o x-prefixo) por um período de transição até que application/javascriptpudesse ser padronizado.

Você deveria usar application/javascript. Isso está documentado na RFC .

No que diz respeito aos navegadores, não há diferença (pelo menos nos cabeçalhos HTTP). Isso foi apenas uma alteração, para que os grupos de tipo text/*e application/*MIME tivessem um significado consistente sempre que possível. (Os text/*tipos MIME destinam-se a conteúdo legível por humanos, o JavaScript não foi projetado para transmitir significado diretamente aos seres humanos).

Observe que o uso application/javascriptno typeatributo de um elemento de script fará com que o script seja ignorado (por estar em um idioma desconhecido) em alguns navegadores mais antigos. Continue usando text/javascriptou omita o atributo completamente (o que é permitido no HTML 5).

Isso não é um problema nos cabeçalhos HTTP, pois os navegadores universalmente (tanto quanto sei) ignoram completamente o tipo de conteúdo HTTP dos scripts ou são modernos o suficiente para reconhecer application/javascript.

Quentin
fonte
muito obrigado pela resposta detalhada. mais um problema - você disse que eu posso omiti-lo completamente (apenas HTML5?) - mas minha pergunta (que depois foi editada por alguém) foi especificamente sobre JS no PHP - funcionará como combinação PHP / JS em todos os servidores / navegadores se eu vou omitir isso inteiramente?
Obmerk Kronen 12/03/2012
8
Você pode omitir o type atributo em um <script>elemento. Você não pode omitir o Content-Typecabeçalho HTTP ... nunca (se você não o especificar no PHP, o PHP será padronizado como text/htmlerrado).
Quentin
2
Seguindo a lógica legível por humanos, o CSS não deve ser classificado também em aplicação, em vez de texto?
Fabrício Matté
2
@frnhr sua edição desta resposta alterou o significado pretendido (que declarava text/javascriptobsoleto e application/x-javascriptexperimental). Pior, deixou o início da resposta incoerente, com um bloco dizendo text/javascriptapenas saindo irrelevantemente no topo da resposta sem motivo óbvio.
Mark Amery
1
No SVN, use definitivamente texto / javascript. O SVN trata qualquer coisa que não comece com texto / como binária. Para corrigir sua cópia de trabalho SVN inteira, você precisa criar um arquivo mime.cmd contendo o seguinte: @echo off for /r . %%X in (*.js) do ( svn propset svn:mime-type text/javascript "%%X" ) que, quando executado, alterará o tipo mime de todos os arquivos JS no seu repositório para texto / javascript. Em seguida, você deve confirmar os arquivos JS no SVN com o novo tipo mime.
Mark Eldridge
21

tipos mime começando com x-não são padronizados. No caso de javascript, está meio desatualizado. Adicional o segundo trecho de código

<?Header('Content-Type: text/javascript');?>

requer short_open_tagsestar ativado. você deve evitá-lo.

<?php Header('Content-Type: text/javascript');?>

No entanto, o tipo mime completamente correto para javascript é

application/javascript

http://www.iana.org/assignments/media-types/application/index.html

KingCrunch
fonte
1
Velha resposta, mas não sei se isso é bom começar com as tags abertas curtas até que isso não é uma boa prática (que recomendo vivamente que desativar PHP-SOT na verdade)
Ben Cassinat
8

De acordo com a RFC 4329, o tipo MIME correto para JavaScript deve ser application/javascript. Howerver, versões mais antigas do IE se engasgam com isso, pois esperam text/javascript.

Björn
fonte
7
Tanto quanto sei, o IE não dá a um macaco o que o tipo de conteúdo HTTP diz; somente o que o typeatributo HTML diz (e nos rascunhos do HTML 5 esse atributo pode ser omitido para JavaScript).
Quentin
@ Quentin ahh ... era isso que estava me dando problemas. Obrigado!
martin
3

Use type = "application / javascript"

No caso do HTML5, o atributo type é obsoleto, você pode removê-lo. Nota: como o padrão é "text / javascript", de acordo com o w3.org, sugiro adicionar o "application / javascript" em vez de removê-lo.

http://www.w3.org/TR/html5/scripting-1.html#attr-script-type
O atributo type fornece o idioma do script ou o formato dos dados. Se o atributo estiver presente, seu valor deverá ser um tipo MIME válido. O parâmetro charset não deve ser especificado. O padrão, usado se o atributo estiver ausente, é "text / javascript".

Use "application / javascript" porque "text / javascript" está obsoleto :

RFC 4329: http://www.rfc-editor.org/rfc/rfc4329.txt

  1. Tipos de mídia de script implantados e compatibilidade

    Vários tipos de mídia não registrados foram usados ​​de maneira ad-hoc para rotular e trocar programas escritos em ECMAScript e JavaScript. Esses incluem:

    + ------------------------------------------------- ---- + | texto / javascript | texto / ecmascript | | text / javascript1.0 | text / javascript1.1 | | text / javascript1.2 | text / javascript1.3 | | text / javascript1.4 | text / javascript1.5 | | texto / jscript | texto / código da vida | | texto / x-javascript | texto / x-ecmascript | | aplicação / x-javascript | application / x-ecmascript | | aplicação / javascript | application / ecmascript | + ------------------------------------------------- ---- +

Sabe-se que o uso do tipo de nível superior "texto" para esse tipo de conteúdo é problemático. Este documento define texto / javascript e texto /
ecmascript, mas os marca como "obsoletos". O uso de
tipos de mídia experimentais e não registrados, conforme listado na parte acima, é desencorajado.
Os tipos de mídia,

  * application/javascript
  * application/ecmascript

que também são definidas neste documento, destinam-se ao uso comum e devem ser usadas.

Este documento define requisitos de processamento equivalentes para os
tipos text / javascript, text / ecmascript e application / javascript.
O uso e o suporte para o tipo de mídia application / ecmascript são
consideravelmente menos difundidos do que para outros tipos de mídia definidos
neste documento. Usando isso a seu favor, este documento define
regras de processamento mais rigorosas para esse tipo, para promover um
processamento mais interoperável .

O x-javascript é experimental, não o use.

juFo
fonte