Middle
Qual é a diferença no funcionamento dos modos (async, defer ou type) da tag <script>?
sobes.tech IA
Resposta da IA
<script> sem atributos
- O HTML é analisado até à tag
<script>. - A análise do HTML é suspensa ao detectar a tag
<script>. - O script é carregado.
- O script é executado.
- A análise do HTML retoma após a execução do script.
<script async>
- O HTML é analisado em simultâneo com o carregamento do script.
- A análise do HTML é suspensa ao terminar o carregamento do script.
- O script é executado.
- A análise do HTML retoma após a execução do script.
- A ordem de execução dos scripts com
asyncnão é garantida, depende da velocidade de carregamento.
<script defer>
- O HTML é analisado em simultâneo com o carregamento do script.
- O script é executado após a análise do HTML, mas antes do evento
DOMContentLoaded. - A ordem de execução dos scripts com
deferé garantida, corresponde à ordem em que aparecem no HTML. - Comportamento semelhante ao
<script>colocado antes do fecho da tag</body>.
<script type="module"> (para módulos ECMAScript)
- É tratado como
<script defer>por padrão (execução adiada após a análise, mantém a ordem). - Pode ser usado com o atributo
async. - Suporta importação/exportação de módulos. Cria um escopo separado.
| Atributo | Carregamento do script | Execução do script | Bloqueio da análise HTML | Ordem de execução |
|---|---|---|---|---|
| Nenhum | Bloqueante | Bloqueante | Sim | Mantém-se |
async |
Não bloqueante (paralelo) | Não bloqueante (ao terminar o carregamento) | Não | Não garantido |
defer |
Não bloqueante (paralelo) | Não bloqueante (após a análise HTML) | Não | Mantém-se |
type="module" |
Não bloqueante (paralelo) | Não bloqueante (após a análise HTML, por padrão) | Não | Mantém-se (por padrão) |
// Exemplo de script simples
console.log('Script normal');
// Exemplo de script assíncrono
console.log('Script assíncrono');
// Exemplo de script diferido
console.log('Script diferido');
// Exemplo de módulo
import { someFunction } from './module.js';
someFunction();
console.log('Script módulo');