- Notifications
You must be signed in to change notification settings - Fork230
Scripts: async, defer#324
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
Uh oh!
There was an error while loading.Please reload this page.
Merged
Changes fromall commits
Commits
Show all changes
26 commits Select commitHold shift + click to select a range
110c128
Translate - Scripts: async, defer
dbritto-dev387d40f
Update article.md
dbritto-dev3392801
Update article.md
dbritto-dev04fe54f
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-devf13cceb
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev344e441
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-devbb5d273
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev5c441b2
Update article.md
dbritto-devad6a1fd
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev89185ba
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev6475b1c
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-devf576eb0
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev656d411
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev91d7706
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev83e8176
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev844042d
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-deve4aecf7
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev91b3af0
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-devfe973fc
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-deve925239
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-deva0b8670
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-deva2449ac
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev212eb55
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-dev60d5e05
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-devdea6a11
Update article.md
dbritto-devb326102
Update 2-ui/5-loading/02-script-async-defer/article.md
dbritto-devFile filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
134 changes: 67 additions & 67 deletions2-ui/5-loading/02-script-async-defer/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
@@ -1,150 +1,150 @@ | ||||||||
# Scripts: async, defer | ||||||||
En los sitios web modernos losscriptssuelen ser más "pesados" que elHTML, el tamaño de la descarga es grande y el tiempo de procesamiento es mayor. | ||||||||
Cuando el navegador carga elHTMLy se encuentra con una etiqueta`<script>...</script>`, no puede continuar construyendo el DOM ya que ahora debe ejecutar el script. Lo mismo sucede con los scriptsexternos`<script src="..."></script>`, el navegador tiene que esperar hasta que elscriptsea descargado para poder ejecutarlo y solo después procesa el resto de la página. | ||||||||
Esto nos lleva a dos importantes problemas: | ||||||||
1.Los scripts no pueden ver los elementos delDOMque se encuentran debajo de él por lo que no pueden agregar controladores de eventos, etc. | ||||||||
2.Si hay unscriptmuy pesado en la parte superior de la página, este "bloquea la página".Los usuarios no pueden ver el contenido de la página hasta que sea descargado y ejecutado. | ||||||||
```html run height=100 | ||||||||
<p>...contenido previo al script...</p> | ||||||||
<script src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script> | ||||||||
<!--Esto no esvisiblehasta que elscriptsea cargado --> | ||||||||
<p>...contenido posterior al script...</p> | ||||||||
``` | ||||||||
Hay algunas soluciones para eso. Por ejemplo podemos poner elscripten la parte inferior de la página por lo que podrá ver los elementos sobre él y no bloqueará la visualización del contenido de la página. | ||||||||
```html | ||||||||
<body> | ||||||||
...todo el contenido está arriba del script... | ||||||||
<script src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script> | ||||||||
</body> | ||||||||
``` | ||||||||
Pero esta solución está lejos de ser perfecta. Por ejemplo el navegador solo se dará cuenta delscript (y podrá empezar a descargarlo) después de descargar todo el documento HTML. Para documentos HTMLextensos eso puede ser un retraso notable. | ||||||||
Este tipo de cosas son imperceptibles para las personas que usan conexiones muy rápidas, pero muchas personas en el mundo todavía tienen velocidades deinternetlentas y utilizan una conexión de internetmóvil que esta lejos de ser perfecta. | ||||||||
Afortunadamente hay dos atributos de`<script>`que resuelven ese problema para nosotros: `defer`y `async`. | ||||||||
## defer | ||||||||
El atributo`defer`indica al navegador que debe seguir trabajando en la página y cargar elscript "en segundo plano" para luego ejecutarlo cuando haya cargado. | ||||||||
Aquí está el mismo ejemplo de arriba pero con `defer`: | ||||||||
```html run height=100 | ||||||||
<p>...contenido previo script...</p> | ||||||||
<script defer src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script> | ||||||||
<!--Inmediatamete visible --> | ||||||||
<p>...contenido posterior al script...</p> | ||||||||
``` | ||||||||
-Los scripts con`defer`nunca bloquean la página. | ||||||||
-Los scripts con`defer`siempre se ejecutan cuando elDOMesta listo pero antes del evento`DOMContentLoaded`. | ||||||||
Los siguientes ejemplos demuestran eso: | ||||||||
```html run height=100 | ||||||||
<p>...contenido previo a los scripts...</p> | ||||||||
<script> | ||||||||
document.addEventListener('DOMContentLoaded', () => alert("¡DOMlisto después del defer!")); // (2) | ||||||||
</script> | ||||||||
<script defer src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script> | ||||||||
<p>...contenido posterior a los scripts...</p> | ||||||||
``` | ||||||||
1.El contenido de la página se muestra inmediatamente. | ||||||||
2.El`DOMContentLoaded`espera por elscript diferido y solo lo se dispara cuando elscript `(2)`es descargado y ejecutado. | ||||||||
Los scriptsdiferidos mantienen su orden tal y cual losscripts regulares. | ||||||||
Entonces si tenemos unscriptgrande primero y luego otro pequeño, el último espera. | ||||||||
```html | ||||||||
<script defer src="https://javascript.info/article/script-async-defer/long.js"></script> | ||||||||
<script defer src="https://javascript.info/article/script-async-defer/small.js"></script> | ||||||||
``` | ||||||||
```smart header="Elscriptpequeño se descarga primero y se ejecuta segundo" | ||||||||
Los navegadores analizan la página en busca descriptsy los descarga en paralelo para mejorar el rendimiento. Entonces en el ejemplo superior ambos scriptsse descargan en paralelo, el`small.js`probablemente lo haga primero. | ||||||||
Pero la especificación requiere que losscriptssean ejecutados en el orden en el que están en el documento, entonces espera por`long.js`para ejecutarlo. | ||||||||
``` | ||||||||
```smart header="El atributo`defer`es solo parascripts externos" | ||||||||
El atributo`defer`es ignorado si el`<script>`no tiene el atributo `src`. | ||||||||
``` | ||||||||
## async | ||||||||
El atributo`async`significa que elscriptes completamente independiente: | ||||||||
-La página no espera a los scripts asincrónicos por lo que el contenido de la página se procesa y se muestra. | ||||||||
-El evento`DOMContentLoaded`y los scriptsasincrónicos no se esperan entre sí: | ||||||||
-El evento`DOMContentLoaded`puede suceder antes que unscriptasincrónico (si unscriptasincrónico termina de cargar una vez la página está completa) | ||||||||
-o después de un scriptasincrónico (si talscriptasincrónico es pequeño o está encache) | ||||||||
-Otros scriptsno esperan a los scripts asincrónicos y losscriptsasincrónicos no esperan por ellos. | ||||||||
Entonces si tenemos muchos scripts asincrónicos estos pueden ser ejecutados en cualquier orden, cualquiera que cargue primero se ejecutará primero. | ||||||||
```html run height=100 | ||||||||
<p>...contenido previo a los scripts...</p> | ||||||||
<script> | ||||||||
document.addEventListener('DOMContentLoaded', () => alert("¡DOMlisto!")); | ||||||||
</script> | ||||||||
<script async src="https://javascript.info/article/script-async-defer/long.js"></script> | ||||||||
<script async src="https://javascript.info/article/script-async-defer/small.js"></script> | ||||||||
<p>...contenido posterior a los scripts...</p> | ||||||||
``` | ||||||||
1.El contenido de la página se muestra inmediatamente: `async`no lo bloquea. | ||||||||
2.El evento`DOMContentLoaded`puede suceder antes o después de `async`, nohay garantías aquí. | ||||||||
3.Los scriptsasincrónicos no esperan por el otro. Unscriptpequeño`small.js`va segundo pero probablemente cargue antes que`long.js` entonces se ejecutará primero. A eso lo llamamos"load-first order". | ||||||||
Los scriptsasincrónicos son excelentes cuando incluimos scripts de terceros (contadores, anuncios, etc) en la página debido a que ellos no dependen de nuestrosscripts y nuestros scriptsno deberían esperar por ellos. | ||||||||
```html | ||||||||
<!-- Google Analytics is usually added like this --> | ||||||||
<script async src="https://google-analytics.com/analytics.js"></script> | ||||||||
``` | ||||||||
##Scripts dinámicos | ||||||||
También podemos agregar unscriptdinámicamente usando #"d46fde5bdf9f1bfe30be3edd2854f75df400bcb49deba7405dab126d900e2eb9"> | ||||||||
```js run | ||||||||
let script = document.createElement('script'); | ||||||||
script.src = "/article/script-async-defer/long.js"; | ||||||||
document.body.append(script); // (*) | ||||||||
``` | ||||||||
El scriptcomienza a cargar tan pronto como es agregado al documento `(*)`. | ||||||||
**Los scriptsdinámicos se comportan como `async` por defecto** | ||||||||
Esto es: | ||||||||
-Ellos no esperan a nadie y nadie espera por ellos. | ||||||||
-El scriptque carga primero se ejecuta primero (`load-first order`) | ||||||||
```js run | ||||||||
@@ -158,7 +158,7 @@ script.async = false; | ||||||||
document.body.append(script); | ||||||||
``` | ||||||||
Por ejemplo, aquí agregamos dosscripts sin el`script.async=false`por lo que deberían ejecutarse en `load-first order` (el `small.js`probablemente primero).Pero con esa bandera el orden es `document order`. | ||||||||
dbritto-dev marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||||||||
```js run | ||||||||
@@ -169,29 +169,29 @@ function loadScript(src) { | ||||||||
document.body.append(script); | ||||||||
} | ||||||||
// long.jsse ejecuta primero a causa del async=false | ||||||||
loadScript("/article/script-async-defer/long.js"); | ||||||||
loadScript("/article/script-async-defer/small.js"); | ||||||||
``` | ||||||||
##Resumen | ||||||||
Ambos, `async`y `defer`, tienen algo en común: la descarga de talesscriptsno bloquean el renderizado de la página. Por lo cual el usuario puede leer el contenido de la página y familiarizarse con la página inmediatamente. | ||||||||
Pero hay algunas diferencias esenciales entre ellos: | ||||||||
| |Orden | `DOMContentLoaded` | | ||||||||
|---------|---------|---------| | ||||||||
| `async` | *Load-first order*.El orden del documento no importa. ¿cual script carga primero? | Tal vez cargue y ejecute mientras el documento no ha sido completamente descargado, eso puede pasar si el script es pequeño o está en cache y el documento es suficientemente extenso. | | ||||||||
| `defer` | *Document order* (como va en el documento). |Ejecuta después de que el documento es cargado y analizado (espera si es necesario) | | ||||||||
```warn header="La página sinscriptsdebe ser utilizable" | ||||||||
Por favor ten en cuenta que si estas usando`defer` la página esvisibleantes de que elscriptsea cargado. | ||||||||
Por lo que el usuario tal vez pueda leer la página, pero algunos componentes gráficos probablemente no estén listos. | ||||||||
Debería haber algunas señales de "cargando" en lugares apropiados y los botones deshabilitados deberían ser mostrados como tal para que el usuario pueda ver claramente qué está listo y qué no. | ||||||||
``` | ||||||||
En la práctica, `defer`es usado para scriptsque necesitan todo el DOMy/o el orden de ejecución es importante. Y`async`es usado parascripts independientes como contadores y anuncios donde el orden de ejecución no importa. |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.