|
1 | 1 |
|
2 |
| -# Polyfills |
| 2 | +# Polyfills y transpiladores |
3 | 3 |
|
4 |
| -El lenguaje JavaScript evoluciona constantemente. Nuevas propuestas al lenguaje aparecen regularmente, son analizadas y, si se consideran valiosas, se agregan a la lista en <https://tc39.github.io/ecma262/> y luego avanzan hasta [specification](http://www.ecma-international.org/publications/standards/Ecma-262.htm). |
| 4 | +El lenguaje JavaScript evoluciona constantemente. Nuevas propuestas al lenguaje aparecen regularmente, son analizadas y, si se consideran valiosas, se agregan a la lista en <https://tc39.github.io/ecma262/> y luego avanzan a la [especificación](http://www.ecma-international.org/publications/standards/Ecma-262.htm). |
5 | 5 |
|
6 |
| -Equipos detrás de intérpretes (engines) de JavaScript tienen sus propias ideas sobre qué implementar primero. Pueden decidir implementar propuestas que están en borrador y posponer cosas que ya están en la especificación, porque son menos interesantes o simplemente más difíciles de hacer. |
| 6 | +Los equipos de desarrollo detrás de los intérpretes (engines) de JavaScript tienen sus propias ideas sobre qué implementar primero. Pueden decidir implementar propuestas que están en borrador y posponer cosas que ya están en la especificación porque son menos interesantes o simplemente porque son más difíciles de hacer. |
7 | 7 |
|
8 | 8 | Por lo tanto, es bastante común para un intérprete implementar solo la parte del estándar.
|
9 | 9 |
|
10 |
| -Una buena página para ver el estado actual de soporte para características del lenguaje es <https://kangax.github.io/compat-table/es6/> (es grande, todavía tenemos mucho que aprender). |
| 10 | +Una buena página para ver el estado actual de soporte de características del lenguaje es <https://kangax.github.io/compat-table/es6/> (es grande, todavía tenemos mucho que aprender). |
11 | 11 |
|
12 |
| -## Babel |
| 12 | +Como programadores, queremos las características más recientes. Cuanto más, ¡mejor! |
13 | 13 |
|
14 |
| -Cuando usamos características modernas del lenguaje, puede que algunos intérpretes no soporten dicho código. Como hemos dicho, no todas las características están implementadas en todas partes. |
| 14 | +Por otro lado, ¿cómo hacer que nuestro código moderno funcione en intérpretes más viejos que aún no entienden las características más nuevas? |
15 | 15 |
|
16 |
| -Aquí Babel viene al rescate. |
| 16 | +Hay dos herramientas para ello: |
17 | 17 |
|
18 |
| -[Babel](https://babeljs.io) es un [transpilador](https://en.wikipedia.org/wiki/Source-to-source_compiler). Reescribe código JavaScript moderno en el estándar anterior. |
| 18 | +1. Transpiladores |
| 19 | +2. Polyfills. |
19 | 20 |
|
20 |
| -En realidad, hay dos partes en Babel: |
| 21 | +En este artículo nuestro propósito es llegar a la esencia de cómo trabajan y su lugar en el desarrollo web. |
21 | 22 |
|
22 |
| -1. Primero, el programa transpilador, que reescribe código. El desarrollador lo ejecuta en su propio ordenador. Reescribe el código al viejo estándar. Y entonces el código es entregado al navegador para los usuarios. Proyectos modernos para construcción de sistemas como [webpack](http://webpack.github.io/) o [brunch](http://brunch.io/), proporcionan medios para ejecutar el transpilador automáticamente en cada cambio al código, de modo que no implique ninguna perdida de tiempo de nuestra parte. |
| 23 | +## Transpiladores |
23 | 24 |
|
24 |
| -2. Segundo, el polyfill. |
| 25 | +Un [transpilador](https://es.wikipedia.org/wiki/Transpilador) es un software que puede analizar ("leer y entender") código moderno y rescribirlo usando sintaxis y construcciones más viejas, y que su resultado sea el mismo. |
25 | 26 |
|
26 |
| - Nuevas características del lenguaje pueden incluir no solo construcciones sintácticas sino también funciones incorporadas. |
27 |
| - El transpilador reescribe el código, transformando las construcciones sintácticas nuevas al viejo formato. Pero para funciones nuevas, necesitamos implementarlas. JavaScript es un lenguaje muy dinámico, los scripts pueden agregar o modificar cualquier función para que actúen acorde al estándar moderno. |
| 27 | +Por ejemplo, antes del año 2020 JavaScript no tenía el operador "nullish coalescing" `??`. Entonces, si un visitante lo usa en un navegador desactualizado, este fallaría en entender un código como `height = height ?? 100`. |
28 | 28 |
|
29 |
| - Existe el término "polyfill" para scripts que "llenan"(fill in) el vacío y agregan las implementaciones que faltan. |
| 29 | +Un transpilador analizaría nuestro código y rescribiría `height ?? 100` como `(height !== undefined && height !== null) ? height : 100`. |
30 | 30 |
|
31 |
| - Dos polyfills interesantes son: |
32 |
| - - [babel polyfill](https://babeljs.io/docs/usage/polyfill/) que soporta mucho, pero es muy grande. |
33 |
| - - [polyfill.io](http://polyfill.io) servicio que nos permite cargar/construir polyfills bajo demanda, dependiendo de las características que necesitemos. |
| 31 | +```js |
| 32 | +// antes de ejecutar el transpilador |
| 33 | +height = height ?? 100; |
34 | 34 |
|
35 |
| -Así que, si queremos usar características modernas del lenguaje, el transpiler y polyfill son necesarios. |
| 35 | +// después de ejecutar el transpilador |
| 36 | +height = (height !== undefined && height !== null) ? height : 100; |
| 37 | +``` |
36 | 38 |
|
37 |
| -## Ejemplos en el tutorial |
| 39 | +Ahora el código rescrito es apto para los intérpretes de JavaScript más viejos. |
38 | 40 |
|
| 41 | +Usualmente, un desarrollador ejecuta el transpilador en su propia computadora y luego despliega el código transpilado al servidor. |
39 | 42 |
|
40 |
| -````online |
41 |
| -La mayoría de ejemplos se pueden ejecutar en el sitio, así: |
| 43 | +Acerca de nombres, [Babel](https://babeljs.io) es uno de los más prominentes transpiladores circulando. |
42 | 44 |
|
43 |
| -```js run |
44 |
| -alert('Presione el botón "Play" en la esquina superior derecha para ejecutar'); |
45 |
| -``` |
| 45 | +Sistemas de desarrollo de proyectos modernos, tales como [webpack](http://webpack.github.io/), brindan los medios para ejecutar la transpilación automática en cada cambio de código, haciendo muy fácil la integración al proceso de desarrollo. |
| 46 | +
|
| 47 | +## Polyfills |
| 48 | +
|
| 49 | +Nuevas características en el lenguaje pueden incluir no solo construcciones sintácticas y operadores, sino también funciones integradas. |
| 50 | +
|
| 51 | +Por ejemplo, `Math.trunc(n)` es una función que corta la parte decimal de un número, ej. `Math.trunc(1.23)` devuelve `1`. |
46 | 52 |
|
47 |
| -Ejemplos que usan JS moderno solo funcionarán si tu navegador lo soporta. |
48 |
| -```` |
| 53 | +En algunos (muy desactualizados) intérpretes JavaScript no existe `Math.trunc`, así que tal código fallará. |
49 | 54 |
|
50 |
| -```offline |
51 |
| -Como estás leyendo la versión offline, en PDF los ejemplos no se pueden ejecutar. En EPUB algunos pueden ejecutarse. |
| 55 | +Aquí estamos hablando de nuevas funciones, no de cambios de sintaxis. No hay necesidad de transpilar nada. Solo necesitamos declarar la función faltante. |
| 56 | +
|
| 57 | +Un script que actualiza o agrega funciones nuevas es llamado "polyfill". Este llena los vacíos agregando las implementaciones que faltan. |
| 58 | +
|
| 59 | +En este caso particular, el polyfill para `Math.trunc` es un script que lo implementa: |
| 60 | +
|
| 61 | +```js |
| 62 | +if (!Math.trunc) { // no existe tal función |
| 63 | + // implementarla |
| 64 | + Math.trunc = function(number) { |
| 65 | + // Math.ceil y Math.floor existen incluso en los intérpretes antiguos |
| 66 | + // los cubriremos luego en el tutorial |
| 67 | + return number < 0 ? Math.ceil(number) : Math.floor(number); |
| 68 | + }; |
| 69 | +} |
52 | 70 | ```
|
53 | 71 |
|
54 |
| -Generalmente, Google Chrome está actualizado con las últimas características del lenguaje, funciona bien para ejecutar demos con tecnología puntera sin ningún transpilador, pero otros navegadores modernos también funcionan bien. |
| 72 | +JavaScript es un lenguaje muy dinámico, los scripts pueden agregar o modificar cualquier función, incluso las integradas. |
| 73 | +
|
| 74 | +Dos librerías interesantes de polyfills son: |
| 75 | +- [core js](https://github.com/zloirock/core-js) - da muchísimo soporte, pero permite que se incluyan solamente las características necesitadas. |
| 76 | +- [polyfill.io](http://polyfill.io) - servicio que brinda un script con polyfills dependiendo de las características del navegador del usuario. |
| 77 | +
|
| 78 | +
|
| 79 | +## Resumen |
| 80 | +
|
| 81 | +En este artículo queremos motivarte a estudiar las características más modernas y hasta experimentales del lenguaje, incluso si aún no tienen aún buen soporte en los intérpretes JavaScript. |
| 82 | +
|
| 83 | +Pero no olvides usar transpiladores (si usas sintaxis u operadores modernos) y polyfills (para añadir funciones que pueden estar ausentes). Ellos se asegurarán de que el código funcione. |
| 84 | +
|
| 85 | +Por ejemplo, cuando estés más familiarizado con JavaScript puedes configurar la construcción de código basado en [webpack](http://webpack.github.io/) con el plugin de [babel](https://github.com/babel/babel-loader). |
| 86 | +
|
| 87 | +Buenos recursos que muestran el estado actual de soporte para varias característica: |
| 88 | +- <https://kangax.github.io/compat-table/es6/> - para JavaScript puro. |
| 89 | +- <https://caniuse.com/> - para funciones relacionadas al navegador. |
| 90 | +
|
| 91 | +P.S. Google Chrome usualmente es el más actualizado con las características del lenguaje, pruébalo si algún demo del tutorial falla. Aunque la mayoría de los demos funciona con cualquier navegador moderno. |
| 92 | +
|
0 commit comments