Sobre este problema HTML
O elemento <script> serve dois propósitos distintos em HTML: carregar scripts executáveis e incorporar blocos de dados não-executáveis. Quando o atributo src está presente, o elemento está sempre a ser usado para carregar um script externo, por isso o atributo type deve refletir um tipo de script válido. Definir type como algo como "text/html", "text/plain", ou um valor inventado como "wrong" diz ao browser que isto não é JavaScript, o que significa que o ficheiro externo referenciado por src será carregado mas nunca executado — quase certamente não é o que o autor pretendia.
A especificação HTML restringe os valores type permitidos para <script src="..."> a três categorias:
-
Uma string vazia (
type=""): Tratada da mesma forma que o padrão, que é JavaScript. -
Um tipo MIME JavaScript: Isto inclui
text/javascript,application/javascript, e outros tipos MIME JavaScript legados. Comotext/javascripté o padrão, especificá-lo é redundante. -
module: Indica que o script deve ser tratado como um módulo JavaScript, ativando a sintaxeimport/exporte execução diferida por padrão.
Qualquer valor fora destas categorias — como text/html, application/json, ou uma string inventada — é inválido quando src está presente.
Por que isto é importante
Funcionalidade quebrada: Um type não-JavaScript num <script> com src impede o browser de executar o ficheiro carregado. O script é efetivamente código morto que ainda custa um pedido de rede.
Conformidade com padrões: O padrão HTML living standard proíbe explicitamente esta combinação. Os validadores marcam-no porque quase sempre indica um erro — ou foi aplicado o type errado, ou o atributo src foi adicionado por acidente.
Manutenibilidade: Futuros programadores a ler o código podem ficar confusos sobre se o script deve executar ou servir como um bloco de dados inerte. Manter o markup válido torna a intenção clara.
Como corrigir
-
Remover completamente o atributo
type. Esta é a melhor abordagem para JavaScript clássico. O comportamento padrão étext/javascript, por isso não é necessáriotype. -
Usar
type="module"se o script usa sintaxe de módulo ES (import/export). -
Se pretendia um bloco de dados (por exemplo, incorporar JSON ou um template), remover o atributo
srce colocar o conteúdo inline dentro do elemento<script>. Blocos de dados com tipos não-JavaScript não podem usarsrc.
Exemplos
Inválido: tipos não-JavaScript com src
Todos estes desencadeiam o erro de validação porque o valor type não é um tipo MIME JavaScript, uma string vazia, ou "module":
<script type="text/html" src="template.html"></script>
<script type="application/json" src="data.json"></script>
<script type="text/plain" src="app.js"></script>
<script type="wrong" src="app.js"></script>
Válido: omitir o atributo type
A correção mais simples e recomendada para scripts clássicos — simplesmente remover type:
<script src="app.js"></script>
Válido: usar um tipo MIME JavaScript
Isto é válido mas redundante, uma vez que text/javascript já é o padrão. O validador pode sugerir omiti-lo:
<script type="text/javascript" src="app.js"></script>
Válido: usar type="module"
Use isto quando o script externo usa sintaxe de módulo ES:
<script type="module" src="app.js"></script>
Válido: usar um atributo type vazio
Uma string vazia é tratada como o padrão. É válido mas desnecessário, e o validador pode sugerir removê-lo:
<script type="" src="app.js"></script>
Válido: blocos de dados sem src
Se precisar de um type não-JavaScript para um bloco de dados inline, remover o atributo src e colocar o conteúdo diretamente dentro do elemento:
<script type="application/json" id="config">
{
"apiUrl": "https://example.com/api",
"debug": false
}
</script>
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.