informatica:programacion:cursos:programacion_avanzada_javascript:modulos_javascript
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:cursos:programacion_avanzada_javascript:modulos_javascript [2024/10/29 15:41] – [¿Qué podemos exportar?] tempwin | informatica:programacion:cursos:programacion_avanzada_javascript:modulos_javascript [2024/10/30 16:07] (actual) – [Recursos] tempwin | ||
|---|---|---|---|
| Línea 611: | Línea 611: | ||
| Lamentablemente cuando salió ES2015, el cargador de módulos no estaba definido, ni tampoco la API que debía usarse para configurarlo. Esto significaba que **no había en el mercado ningún motor de ECMAScript que soportase los módulos de ES2015 de forma nativa**. Ningún navegador, ni Node.js en ninguna de sus versiones. Afortunadamente **eso ha cambiado y en la actualidad tenemos una especificación completa** del sistema de módulos, y todas las versiones modernas de navegadores // | Lamentablemente cuando salió ES2015, el cargador de módulos no estaba definido, ni tampoco la API que debía usarse para configurarlo. Esto significaba que **no había en el mercado ningún motor de ECMAScript que soportase los módulos de ES2015 de forma nativa**. Ningún navegador, ni Node.js en ninguna de sus versiones. Afortunadamente **eso ha cambiado y en la actualidad tenemos una especificación completa** del sistema de módulos, y todas las versiones modernas de navegadores // | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | soporte | + | |
| - | </ | + | |
| La imagen anterior es para el soporte de módulos dinámicos, que son aquellos que se cargan usando el propio lenguaje ECMAScript, a través de la palabra clave '' | La imagen anterior es para el soporte de módulos dinámicos, que son aquellos que se cargan usando el propio lenguaje ECMAScript, a través de la palabra clave '' | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | soporte de módulos ES6 con etiqueta | + | |
| - | </ | + | |
| ==== Definiendo un módulo ECMAScript 2015 ==== | ==== Definiendo un módulo ECMAScript 2015 ==== | ||
| Línea 1136: | Línea 1131: | ||
| Acostúmbrate a usar el sistema de módulos de ECMAScript. Recuerda que **hoy ya se soporta de serie en todos los navegadores modernos (e incluso en Node.js)** y en el caso de que debas soportar otros motores puedes usar un transpilador. Así que ¡no hay excusa para no utilizar módulos en tus aplicaciones! aumenta la legibilidad y mantenibilidad de nuestro código al permitir una mayor organización. El sistema de módulos de ES6 es lo suficientemente flexible y potente como para ser usado tanto en pequeños desarrollos como en grandes proyectos. No dudes en experimentar con él y en acostumbrarte a sus posibilidades... ¡pronto descubrirás que no puedes vivir sin él! | Acostúmbrate a usar el sistema de módulos de ECMAScript. Recuerda que **hoy ya se soporta de serie en todos los navegadores modernos (e incluso en Node.js)** y en el caso de que debas soportar otros motores puedes usar un transpilador. Así que ¡no hay excusa para no utilizar módulos en tus aplicaciones! aumenta la legibilidad y mantenibilidad de nuestro código al permitir una mayor organización. El sistema de módulos de ES6 es lo suficientemente flexible y potente como para ser usado tanto en pequeños desarrollos como en grandes proyectos. No dudes en experimentar con él y en acostumbrarte a sus posibilidades... ¡pronto descubrirás que no puedes vivir sin él! | ||
| ==== Utilizar módulos desde HTML ==== | ==== Utilizar módulos desde HTML ==== | ||
| + | |||
| + | Hasta ahora has visto como cargar módulos **dinámicamente**, | ||
| + | |||
| + | Si no existiese este soporte, el sistema de módulos se quedaría " | ||
| + | |||
| + | === Cargar un módulo usando < | ||
| + | |||
| + | Para cargar un fichero como si se tratase de un módulo, basta con usar '' | ||
| + | |||
| + | No hay sintaxis definida para " | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | Importante: Los módulos cargados vía el tag ''< | ||
| + | </ | ||
| + | |||
| + | Por lo tanto dado el siguiente código: | ||
| + | |||
| + | <code html> | ||
| + | <script type=" | ||
| + | <script src=" | ||
| + | <script defer src=" | ||
| + | </ | ||
| + | |||
| + | El orden de ejecución de los scripts es '' | ||
| + | |||
| + | === El atributo " | ||
| + | |||
| + | De igual modo que ahora disponemos de '' | ||
| + | |||
| + | * La versión con módulos, que cargaríamos via '' | ||
| + | * La versión sin módulos, que cargaríamos con ''< | ||
| ==== DEMO: Cargar módulos desde HTML ==== | ==== DEMO: Cargar módulos desde HTML ==== | ||
| + | |||
| + | Página '' | ||
| + | |||
| + | <code html> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <!-- Como queremos añadir un script JS como módulo, | ||
| + | usaremos el atributo " | ||
| + | --> | ||
| + | <script type=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Como vemos, añadimos un módulo inicial, '' | ||
| + | |||
| + | <code javascript> | ||
| + | import {next} from ' | ||
| + | const txt = document.getElementById(' | ||
| + | const btn = document.getElementById(' | ||
| + | btn.addEventListener(' | ||
| + | const value = parseInt(txt.value, | ||
| + | txt.value = next(value); | ||
| + | }, false); | ||
| + | </ | ||
| + | |||
| + | Como vemos, en ese módulo no se exporta nada. Esto pasa con los módulos que se cargan a través de la etiqueta ''< | ||
| + | |||
| + | El módulo '' | ||
| + | |||
| + | <code javascript> | ||
| + | import sum from ' | ||
| + | const next = i => sum(i,1); | ||
| + | export {sum, next}; | ||
| + | </ | ||
| + | |||
| + | El módulo '' | ||
| + | |||
| + | <code javascript> | ||
| + | export default (a,b) => a+b; | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | Como hemos visto, ya no es necesario Babel o ningún otro transpilador en las últimas versiones de los navegadores porque soportan los módulos de forma nativa. | ||
| + | </ | ||
| ==== DEMO: Soporte de módulos ES6 en NodeJS ==== | ==== DEMO: Soporte de módulos ES6 en NodeJS ==== | ||
| + | <WRAP center round important 60%> | ||
| + | Este código tiene varios años, es muy probable que ya no funcione igual o que las notas que acompañen esta sección estén desfasadas | ||
| + | </ | ||
| + | Fichero '' | ||
| + | |||
| + | <code javascript> | ||
| + | import {next} from ' | ||
| + | const value = 42; | ||
| + | console.log(next(value)); | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | Node.js obliga que los ficheros de módulos tengan la extensión '' | ||
| + | </ | ||
| + | |||
| + | Fichero '' | ||
| + | |||
| + | <code javascript> | ||
| + | import sum from ' | ||
| + | const next = i => sum(i,1); | ||
| + | export {sum, next}; | ||
| + | </ | ||
| + | |||
| + | Fichero '' | ||
| + | |||
| + | <code javascript> | ||
| + | export default (a,b) => a+b; | ||
| + | </ | ||
| + | |||
| + | Ejecutamos con Node.js indicando la característica experimental: | ||
| + | |||
| + | <code bash> | ||
| + | node --experimental-modules index.mjs | ||
| + | </ | ||
| + | ===== Recursos ===== | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
informatica/programacion/cursos/programacion_avanzada_javascript/modulos_javascript.1730212871.txt.gz · Última modificación: por tempwin
