Quando usar o tipo MIME JavaScript application / javascript em vez de text / javascript?

157

Com base na pergunta de código jQuery não funciona no IE , text/javascripté utilizado em documentos HTML para que o Internet Explorer pode compreendê-lo.

Mas eu estou pensando, quando você usaria application/javascript, e mais importante, por que você usaria em vez de text/javascript?

Mark Baijens
fonte

Respostas:

243

Em teoria, de acordo com a RFC 4329 , application/javascript.

O motivo pelo qual deveria ser applicationnão tem nada a ver com o tipo ser legível ou executável. Isso ocorre porque existem mecanismos personalizados de determinação de charset estabelecidos pelo próprio idioma / tipo, e não apenas pelo charsetparâmetro genérico . Um subtipo de textdeve ser capaz de ser transcodificado por um proxy para outro charset, alterando o parâmetro charset. Isso não se aplica ao JavaScript porque:

uma. o RFC diz que os agentes do usuário devem estar analisando o BOM no script para determinar o tipo (não tenho certeza se algum navegador realmente faz isso);

b. os navegadores usam outras informações - a codificação da página de inclusão e, em alguns navegadores, o script charsetatributo - para determinar o conjunto de caracteres. Portanto, qualquer proxy que tentasse transcodificar o recurso quebraria seus usuários. (É claro que, na realidade, ninguém nunca usa proxies de transcodificação, mas essa era a intenção.)

Portanto, os bytes exatos do arquivo devem ser preservados exatamente , o que o torna um applicationtipo binário e não tecnicamente baseado em caracteres text.

Pelo mesmo motivo, application/xmlé oficialmente preferido text/xml: o XML possui seus próprios mecanismos de sinalização de conjunto de caracteres em banda. E todo mundo ignora o applicationXML também.

text/javascripte text/xmlpode não ser a coisa certa oficial, mas há o que todos usam hoje por motivos de compatibilidade, e os motivos pelos quais eles não são a coisa certa estão praticamente falando completamente sem importância.

bobince
fonte
4
A solução mais "compatível" é não incluir nenhum tipo de conteúdo na resposta. RFC afirma que, sem um tipo de conteúdo explícito, o receptor seria interpretá-lo "pelo contexto" que é sempre o comportamento correto para todos os navegadores desde os primeiros navegadores
Pacerier
Cuidado com o application/javascriptIE executando no modo de compatibilidade com IE=8. Parece que os scripts embutidos não foram avaliados corretamente. text/javascriptfunciona bem lá.
Joscha
2
@Pacerier - Eu sei que esse comentário tem 5 anos, mas hoje é geralmente melhor incluir tipos MIME, principalmente para sites do tipo fórum, por razões de segurança. Fazer o receptor interpretar o tipo deixa alguém em aberto, carregando um arquivo javascript mal-intencionado como uma imagem e fazendo com que o navegador interprete e execute esse script. É melhor que o servidor retorne tipos MIME para todas as respostas e use o cabeçalho X-Content-Type-Options: nosniffpara impedir que o navegador interprete o tipo.
sammy_winter 7/09/18
@sammy_winter Vejo avisos como esses em todos os lugares e se encolhem sempre. Se eu permitisse que os usuários enviassem conteúdo, provavelmente faria mais validação do que "oh sim, regex correspondente ao nome do arquivo png, posso confiar nisso", não é? Se o cabeçalho incorreto se tornar um "problema de segurança", o problema talvez seja algum lugar mais profundo, você não acha? É o mesmo que ocultar Server: nginxou o que o nginx envia. Como se quem é capaz de encontrar um buraco precisa de cabeçalho explícita para saber o que de servidor que executar ...
Sahsahae
17

O problema com o tipo MIME do Javascript é que não há um padrão há anos. Agora temos application / javascript como um tipo oficial de MIME.

Mas, na verdade, o tipo MIME não importa, pois o navegador pode determinar o tipo em si. É por isso que as especificações do HTML5 afirmam que type="text/javascript"não são mais necessárias.

Harmen
fonte
5

applicationporque .js-Files não é algo que um usuário deseja ler, mas algo que deve ser executado.

thejh
fonte
Essa é a resposta oficial, mas o IE engasga com isso.
Benn
20
@Benn: Talvez porque os usuários do IE precisem ler todos os arquivos JS porque não executam corretamente? Pelo menos, é honesto pela Microsoft;)
thejh
Ame o seu comentário, mas infelizmente as pessoas que não sabem ler javascript ainda usam IE por isso temos de lidar com isso :(.
Mark Baijens
1
Eu não acho que você queira ou não ler tem algo a ver com o porquê. Tem a ver com a forma como os dados são transcodificados - ou melhor, se podem ser.
Zenexer 2/08/13
tecnicamente, HTML e CSS também são "executados" (analisados) pelo navegador para produzir o resultado do código como conteúdo visual e não se destinam ao usuário "lê-lo", portanto, essa resposta não faz muito sentido. Eu acho que há uma grande confusão sobre o que é "texto" e o que é "aplicação". Se eu pudesse votar nesta questão, eu diria que a IETF deve considerar conteúdos "texto" como text, e binarycomo quer application-OR o "propósito" do referido tipo, como em "imagem" ou "documento", etc.
1

application / javascript é o tipo correto de usar, mas como não é suportado pelo IE6-8, você ficará preso ao texto / javascript. Se você não se importa com a validade (HTML5 excluído), apenas não especifique um tipo.

Radu
fonte
Onde você conseguiu isso? Tenho certeza de que é suportado. Ou, pelo menos, será ignorado.
Zenexer
@Zenexer leu sua resposta para outra pergunta . Aparentemente, a compatibilidade do IE significa que não application/javascript.
Camilo Martin
@CamiloMartin Eu uso bem com o IE até 6 o tempo todo. Eles simplesmente assumem o JavaScript.
Zenexer
@Zenexer Hm, estranho. Gostaria de saber qual foi o problema nas outras perguntas e respostas.
Camilo Martin
@Zenexer Já faz um tempo desde que tive que lidar com isso, mas aqui estão algumas outras contas que causam problemas no IE6-8. Não sei ao certo por que isso parece importar algumas vezes, mas, na minha experiência, causou problemas.
Radu