puedes evitar la configuración del JSON usando la extención .mjs, esta le indica a JavaScript que es un módulo
Introducción
Historia de JavaScript: ¿qué es ECMAScript?
¿Qué es el TC39?
Configuracion
Configurando nuestras herramientas
¿Qué se implementó en ES6?
ES6: let y const, y arrow functions
ES6: strings
ES6: parámetros por defecto
ES6: asignación de desestructuración
ES6: spread operator
Playground: Combina objetos JSON con el Spread Operator
ES6: object literals
ES6: promesas
ES6: clases
ES6: module
Playground: Obtén una lista de películas
ES6: generator
Playground: Generador de identificadores para michis
ES6: set-add
¿Qué se implementó en ES7?
ES7: exponentiation operator y array includes
¿Qué se implementó en ES8?
ES8: object entries y object values
ES8: string padding y trailing commas
ES8: funciones asíncronas
¿Qué se implementó en ES9?
ES9: expresiones regulares
ES9: Promise.finally
¿Qué se implementó en ES10?
ES10: flat-map y trimStart-trimEnd
ES10: try catch y fromEntries
¿Qué se implementó en ES11?
ES11: optional chaining
ES11: BigInt y Nullish
ES11: Promise.allSettled
ES11: globalThis y matchAll
ES11: dynamic Import
¿Qué se implementó en ES12?
ES12: numeric-separators y replaceAll
ES12: promise-any y métodos privados
¿Qué se implementó en ES13?
ES13: at
ES13: top level await en el consumo de una API
Recapitulación
Performance
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Oscar Barajas Tavares
Para que el código de JavaScript sea más ordenado, legible y mantenible; ES6 introduce una forma de manejar código en archivos de manera modular. Esto involucra exportar funciones o variables de un archivo, e importarlas en otros archivos donde se necesite.
Para explicar cómo funciona las exportaciones e importaciones de código, debes tener mínimo dos archivos, uno para exportar las funcionalidades y otro que las importe para ejecutarlas.
Además, si iniciaste un proyecto con NPM (Node Package Manager) con Node.js, necesitas especificar que el código es modular en el archivo package.json
de la siguiente manera:
// package.json
{ ...
"type": "module"
}
Las exportaciones de código consisten en crear funciones o variables para utilizarlas en otros archivos mediante la palabra reservada export
.
Existen dos formas de exportar, antes de declarar la funcionalidad, o entre llaves {}
.
Por ejemplo, en el archivo math_function.js
declaramos una función para sumar dos valores, el cual lo exportaremos.
//math_function.js
export const add = (x,y) => {
return x + y
}
//math_function.js
const add = (x,y) => {
return x + y
}
export { add, otherFunction, ... }
Las importaciones de código consiste en usar funciones o variables de otros archivos mediante la palabra reservada import
, que deberán estar siempre lo más arriba del archivo y utilizando el mismo nombre que el archivo original.
Existen dos formas de exportar, antes de declarar la funcionalidad, o entre llaves {}
.
Por ejemplo, importamos la función add
del archivo math_function.js
para utilizarla en un archivo main.js
.
// main.js
import { add, otherFunction } from './math_functions.js'
add(2,2) //4
Si importamos el módulo con un nombre diferente, existirá un error de sintaxis.
// Erróneo
import { suma } from './math_functions.js'
suma(2,2) //SyntaxError: The requested module '/src/archivo1.js' does not provide an export named 'suma'
Para importar todas las funcionalidades de un archivo se utiliza un asterisco (*
) y se puede cambiar el nombre para evitar la repetición de variables o funciones a través de la palabra reservada as
.
// main.js
import * as myMathModule from './math_functions.js';
myMathModule.add(2,2) //4
myMathModule.otherFunction()
...
Si solo UN valor será exportado, entonces se puede utilizar export default
. De esta manera no es necesario las llaves {}
al exportar e importar.
//math_function.js
export default function add (x,y){
return x + y;
}
Adicionalmente, no se puede usar export default
antes de declaraciones const
, let
o var
, pero puedes exportarlas al final.
// ❌ Erróneo
export default const add = (x,y) => {
return x + y;
}
// ✅ Correcto
const add = (x,y) => {
return x + y;
}
export default add
Si únicamente un valor será importado, entonces se puede utilizar cualquier nombre en la importación. De esta manera no es necesario las llaves {}
.
//Las siguientes importaciones son válidas
import add from './math_functions.js'
import suma from './math_functions.js'
import cualquierNombre from './math_functions.js'
Sin embargo, es recomendable utilizar siempre el nombre de la función, para evitar confusiones.
Teniendo las consideraciones de importaciones y exportaciones, nombradas y por defecto, entonces podemos combinarlas en un mismo archivo.
// module.js
export const myExport = "hola"
function myFunction() { ... }
export default myFunction
// main.js
import myFunction, { myExport } from "/module.js"
Contribución creada por Andrés Guano (Platzi Contributor).
Aportes 31
Preguntas 8
puedes evitar la configuración del JSON usando la extención .mjs, esta le indica a JavaScript que es un módulo
Recuerden que existen dos tipos de exports/imports
export default myFunction;
export {myFunction};
import myFunction from "./myFunction"
import {myFunction} from "./myFunction"
Default se usa cuando solo devuelves un elemento y no quieres restringir el nombre.
Export const restringe el nombre y ademas te permite devolver multiples funciones o constantes
Hola Chic@s
ES6: Module
const hello = () => {
console.log("Hello!")
}
export default hello;
import hello from "./module.js";
hello();
"type": "module"
En caso de que estés trabajando en un proyecto muy básico sin dependencias y no tienes un archivo JSON, puedes agregar el atributo type=“module” al script en tu html.
<script src="./index.js" type="module"></script>
LINK: https://pogolo.notion.site/12-ES6-module-4a65488ee2c842e8a8363b4a7121d978
¿En qué momento vimos: 07-clases.js? Y se brincó el 02 y repitió el número 04…
😕
Hola! Para los que tengan algún error intentando ejecutar los módulos les recomiendo actualizar la versión de NodeJs
que estén usando. Para ello les recomiendo revisar y visitar la página de
github donde está como actualizar Node. O a la fecha (11/04/2023) pueden copiar y pegar este código que a mi me funcionó (solo para Ubuntu):
curl -fsSL https://deb.nodesource.com/setup_19.x | sudo -E bash - &&\
sudo apt-get install -y nodejs
Nota
Importante Archivo de package.json añadir
"type": "module"
archivoA.js
const hello = () => {
console.log("Hello!")
}
export default hello;
------
archivoB.js
import hello from "./module.js";
hello();
Los módulos en Javascript son bloques de código reutilizables que pueden importar y exportar funcionalidades entre diferentes archivos.
Una analogía podría ser un libro que se divide en capítulos. Cada capítulo es un módulo que tiene su propio contenido y puede referirse a otros capítulos. Los módulos permiten organizar el código de forma más clara y modular.
Existen diferentes sistemas de módulos para Javascript, como CommonJS, AMD y UMD, pero el más moderno y nativo es el sistema de Módulos ES (ESM), que se introdujo en ECMAScript 2015. Este sistema usa las palabras clave export e import para declarar qué variables o funciones se pueden compartir entre los módulos.
Hasta este momento he visto como se puede optimizar el codigo que ya habia escrito con estas funcionalidades increibles. Gracias por los aportes!
ES6 (ECMAScript 2015) introdujo el concepto de módulos en JavaScript para mejorar la modularidad y organización del código. Los módulos permiten a los desarrolladores dividir su código en archivos separados, cada uno con su propio ámbito (scope) privado, y exportar e importar funcionalidad entre ellos. Esto es útil para mantener el código más limpio, modular y fácil de mantener.
Aquí hay una breve introducción a cómo funcionan los módulos en ES6:
export
.// math.js
export const sum = (a, b) => a + b;
export const multiply = (a, b) => a * b;
import
.// app.js
import { sum, multiply } from './math.js';
console.log(sum(2, 3)); // Output: 5
console.log(multiply(2, 3)); // Output: 6
// math.js
export default function add(a, b) {
return a + b;
}
// app.js
import customAdd from './math.js';
console.log(customAdd(2, 3)); // Output: 5
* as
.// math.js
export const sum = (a, b) => a + b;
export const multiply = (a, b) => a * b;
// app.js
import * as mathFunctions from './math.js';
console.log(mathFunctions.sum(2, 3)); // Output: 5
console.log(mathFunctions.multiply(2, 3)); // Output: 6
Es importante tener en cuenta que los módulos ES6 generalmente funcionan en navegadores modernos y en entornos de Node.js que tienen soporte para ES6. En algunos casos, es posible que necesites configurar herramientas de construcción (como webpack o Babel) para asegurarte de que los módulos se manejen adecuadamente en todos los navegadores y entornos.
Está información es valida hasta septiembre de 2021, puede variar con nuevas implementaciones.
Mi resumen:
pero ese packaje.json ya estaba en la carpeta , pero como es que hizo ese archivo json
mi node no corre vanilla js entonces tuve que ejecutar esto en la terminar para probar el console.log
node --experimental-modules src/es6/08-modules.js
:
La exportación por defecto siempre ha tenido un problema 🙃, que no es una regla seguir el nombre de la función:
// utils.js
const sayHello = () => console.log('Hello');
export default sayHello;
// main.js
import miFuncion from './utils';
Este código de arriba no arrojaría ningún error, debido que a la exportación por defecto no nos obliga a llamar a la función importada de la misma forma 🤔.
De la misma manera, se pueden combinar la exportaciones por defecto y nombradas en un mismo archivo 🤯.
// utils.js
const sayHello = () => console.log('Hello');
const sayBye = () => console.log('Bye!');
export { sayBye, sayHello as default };
// main.js
import sayHello, { sayBye } from './utils';
Un módulo es solo un archivo. Un script es un módulo. Tan sencillo como eso.
Los módulos pueden cargarse entre sí y usar directivas especiales export
e import
para intercambiar funcionalidad, llamar a funciones de un módulo de otro:
export
etiqueta las variables y funciones que deberían ser accesibles desde fuera del módulo actual.import
permite importar funcionalidades desde otros módulos.Por ejemplo, si tenemos un archivo sayHi.js
que exporta una función:
// 📁 sayHi.js
export function sayHi(user) {
alert(`Hello, ${user}!`);
}
…Luego, otro archivo puede importarlo y usarlo:
// 📁 main.js
import {sayHi} from './sayHi.js';
alert(sayHi); // function...sayHi('John');
// Hello, John!
La directiva import
carga el módulo por la ruta ./sayHi.js
relativo con el archivo actual, y asigna la función exportada sayHi
a la variable correspondiente.
Ejecutemos el ejemplo en el navegador.
Como los módulos admiten palabras clave y características especiales, debemos decirle al navegador que un script debe tratarse como un módulo, utilizando el atributo <script type =" module ">
.
Así:
<!-- 📁 index.html -->
<!doctype html>
<script type="module">
import {sayHi} from './say.js';
document.body.innerHTML = sayHi('John');
</script>
El navegador busca y evalúa automáticamente el módulo importado (y sus importaciones si es necesario), y luego ejecuta el script.
⚠️ Los módulos funcionan solo a través de HTTP(s), no localmente
Si intenta abrir una página web localmente a través del protocolo
file://
, encontrará que las directivasimport y export
no funcionan. Use un servidor web local, como static-server o use la capacidad de “servidor en vivo” de su editor, como VS Code Live Server Extension para probar los módulos.
No sé si a alguien más le pasa, pero en lo personal cuando vi un comentario que decía module.mjs fui directo a Chat GPT para que me dijera que es y vi que habían más conceptos nuevos que voy a tener que aprender y eso en me emociona mucho xD
es6
, crear el archivo llamado: module.js
const hello = () => {
console.log('Hello!');
}
export default hello;
package.json
y después de license
, agregar el tipo para que reconozca a module
:"license": "MIT",
"type": "module"
es6
, crear el archivo llamado: 08-module.js
//Compilar: seleccionar el código + click derecho + Run Code
//Ejercicio #1
import hello from "./module.js";
hello();
/* output:
Hello!
*/
Es importante destacar que para que los módulos funcionen en el navegador, necesitarás utilizar un sistema de construcción (como Webpack o Babel) para compilar y empaquetar tus archivos JavaScript.
Los módulos proporcionan una forma modular y organizada de estructurar y reutilizar el código en JavaScript, lo que facilita el mantenimiento y la colaboración en proyectos más grandes.
Waos con la modularizacion
13/35 ES6: module
Los módulos sirven para manejar el código en archivos de manera modular, lo que permite tener un codigo más ordenado, legible y mantenible. Para hacer uso de los módulos, se deben exportar funciones o variables en un archivo y luego importarlas en otros archivos donde se necesiten.
Para exportar una función o variable se utilza la palabra reservada “export”. Se pueden exportar antes de declarar la funcionalidad o entre llaves { }. Por ejemplo el archivo “math_function.js”, se declara una función para sumar dos valores y se exporta:
// math_function.js
export const add = (x,y) => {
return x + y
}
Para importar una función o variable de otro archivo se utiliza la palabra reservada “import”. Si se importa una función, se debe usar el mismo nombre que se declaró en el archivo original. Si se importa el módulo con un nombre diferente, habrá un error de sintaxis. Por ejemplo, para importar la función “add” del archivo “math_function.js” en archivo “main.js”
También se puede usar module.exports en vez de export sólo, por si no quieres cambiar la extensión al fichero a .mjs, o agregar el “type”… 😃
https://www.youtube.com/watch?v=0t-Le4kdaMg este video tiene información que no se ve en el vídeo y es un muy buen complemento.
Cuando trataba de ejecutar el import y el export me arrojaba un problema que no se resolvía solo con agregar el
<code> "type": "module"
pero lo resolví descargando nvm y haciendo un upgrade a node.
Dejo los links que me ayudaron
https://www.freecodecamp.org/news/node-version-manager-nvm-install-guide/
https://www.freecodecamp.org/news/how-to-update-node-and-npm-to-the-latest-version/
Estoy haciendo este curso mediante las nuevas rutas, y revisando la anterior escuela web me parece que los cursos prácticos de seguro ayudan a que estos conceptos sean mas comprensibles, pero en las nuevas rutas se obvia eso.
Acá les dejo una documentación que me gusto mucho sobre este tema: Export e Import
Se puede también importar el modulo, sin necesidad de modificar el package:
const myfunction = require('./NombreArchivo.js');
// Normalmente se utiliza esto en el Back
// import funciona en el front sin necesidad de modificar el // archivo package
Flag para importar modulos en package.json
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?