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.
Cómo utilizar los módulos de ECMAScript
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"}
Qué son las exportaciones de código
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.jsexportconstadd=(x,y)=>{return x + y
}
//math_function.jsconstadd=(x,y)=>{return x + y
}export{ add, otherFunction,...}
Qué son las importaciones de código
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.
Si importamos el módulo con un nombre diferente, existirá un error de sintaxis.
// Erróneoimport{ 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.
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.jsexportdefaultfunctionadd(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óneoexportdefaultconstadd=(x,y)=>{return x + y;}// ✅ Correctoconstadd=(x,y)=>{return x + y;}exportdefault add
Importaciones por defecto
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álidasimportaddfrom'./math_functions.js'importsumafrom'./math_functions.js'importcualquierNombrefrom'./math_functions.js'
Sin embargo, es recomendable utilizar siempre el nombre de la función, para evitar confusiones.
Combinar ambos tipos de exportaciones e importaciones
Teniendo las consideraciones de importaciones y exportaciones, nombradas y por defecto, entonces podemos combinarlas en un mismo archivo.
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
Gracias por el aporte!
Hola Irving, ¿podrías explicar los import también?
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>
Gran aporte no me había salido bien asta que vi tu comentario pero si tengo mi archivo package.json por que me seguía marcando error no se suponía que con ese archivo se debía de solucionar el problema
Excelente documentación, incluso menciona cosas que en el video no van, me encanto
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):
Tienes los conceptos al revés.
ES Modules (import/export) funcionan en cualquier navegador y en entornos node.js con cierta configuración extra (type module)
Los módulos de node.js (require/export) funcionan solo en node.js
Si ejecutas el archivo con "Live Server" no es necesario que instales node.
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!
Antes de import se utilizaba:
const hello = require("./module.js");
y en el module.js
module.exports = hello;
gracias !!!
**Pues, aquí no quizo correr...
**
/home/dicktracy/personalProjects/curso-ecmascript/src/es6/tempCodeRunnerFile.js:1
import hello from "./module.mjs";
^^^^^
SyntaxError: Unexpected identifier
at Module._compile (internal/modules/cjs/loader.js:723:23)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
Hola, Daniel.
¿Puedes compartirme un poco más de información?
Muéstrame el código que creaste y lo que colocaste en él .json. Para intentar ayudarte.
ES6: module
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:
Exportar desde un módulo:
Puedes exportar variables, funciones y clases desde un módulo utilizando la palabra clave export.
// math.jsexportconstsum=(a, b)=> a + b;exportconstmultiply=(a, b)=> a * b;
Importar en otro módulo:
Puedes importar las funcionalidades exportadas en otro módulo utilizando la palabra clave import.
Alias y exportación predeterminada:
También puedes usar alias para renombrar las importaciones y exportar una única función o valor por defecto desde un módulo.
// math.jsexportdefaultfunctionadd(a, b){return a + b;}// app.jsimportcustomAddfrom'./math.js';console.log(customAdd(2,3));// Output: 5
Exportar e importar todo:
Si deseas exportar e importar todas las funcionalidades de un módulo, puedes usar * as.
// math.jsexportconstsum=(a, b)=> a + b;exportconstmultiply=(a, b)=> a * b;// app.jsimport*as mathFunctionsfrom'./math.js';console.log(mathFunctions.sum(2,3));// Output: 5console.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.
Espero les sea de utilidad. 👨💻
Mi resumen:
pero ese packaje.json ya estaba en la carpeta , pero como es que hizo ese archivo json
Ese archivo se creo cuando iniciamos el proyecto, cuando pusimos las keywords, el autor, la descripción y todos los demas datos que pusimos en la terminal.
a buenisimo entonces no me di cuenta de eso gracias
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:
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 🤯.
Tengo una pregunta. ¿Cuál es la diferencia entre "import" y "require" y en qué casos se usa uno y en cuáles el otro?
En Node.js, tanto import como require se utilizan para incluir módulos en un programa, pero tienen diferencias significativas en cuanto a sintaxis, funcionalidad y compatibilidad. Aquí se explican las diferencias y se dan recomendaciones sobre cuándo usar cada uno.
### require
- **Sintaxis**: require es una función.
```javascript
const module = require('module-name');
```
- **CommonJS**: require es parte del sistema de módulos CommonJS, que ha sido el estándar de facto en Node.js desde su creación.
- **Dinamismo**: require puede ser llamado en cualquier parte del código, no necesita estar al principio del archivo.
```javascript
if (condition) {
const module = require('module-name');
}
```
- **Sincronía**: require es síncrono, lo que significa que el módulo es cargado y evaluado inmediatamente.
- **Compatibilidad**: Es compatible con todas las versiones de Node.js y es ampliamente utilizado en la comunidad de Node.js.
### import
- **Sintaxis**: import es una declaración.
```javascript
import module from 'module-name';
```
- **ECMAScript Modules (ESM)**: import es parte del sistema de módulos de ECMAScript, que es el estándar oficial para módulos en JavaScript.
- **Estático**: import debe estar al principio del archivo y no puede ser llamado condicionalmente.
```javascript
// Esto no es válido
if (condition) {
import module from 'module-name';
}
```
- **Asincronía**: La importación de módulos usando import puede ser asíncrona, permitiendo ciertas optimizaciones.
- **Compatibilidad**: Los módulos ECMAScript son soportados de forma nativa a partir de Node.js 12, pero requieren el uso de la extensión .mjs o la habilitación de "type": "module" en package.json.
### Cuándo usar cada uno
#### Usar require:
- Cuando trabajas en proyectos existentes que ya utilizan CommonJS.
- Si necesitas cargar módulos condicionalmente o en tiempo de ejecución.
- Cuando trabajas en entornos que no soportan ECMAScript Modules.
#### Usar import:
- En nuevos proyectos donde deseas seguir el estándar ECMAScript.
- Si trabajas en proyectos que necesitan interoperabilidad con otros entornos que utilizan ECMAScript Modules, como navegadores modernos.
- Cuando necesitas las características avanzadas de ESM, como la carga asíncrona de módulos.
### Ejemplos
#### require:
// CommonJSconst fs =require('fs');const express =require('express');const app =express();app.get('/',(req, res)=>{  res.send('Hello, world!');});app.listen(3000,()=>{ console.log('Server is running on port 3000');});
#### import:
// ECMAScript Modulesimportfsfrom'fs';importexpressfrom'express';const app =express();app.get('/',(req, res)=>{  res.send('Hello, world!');});app.listen(3000,()=>{ console.log('Server is running on port 3000');});
### Configuración para usar ECMAScript Modules en Node.js
Para usar import en Node.js, debes configurar tu proyecto adecuadamente:
1. **Usando .mjs extensión**:
Renombra tus archivos JavaScript con la extensión .mjs.
2. **Configurando package.json**:
Añade "type": "module" en tu package.json.
```json
{
"name": "your-project",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"start": "node index.js"
}
}
```
### Conclusión
require y import sirven para el mismo propósito de incluir módulos, pero pertenecen a diferentes sistemas de módulos y tienen distintas características y usos. La elección entre ellos depende del contexto del proyecto, la compatibilidad y las necesidades específicas de funcionalidad y optimización.
Hola companeros, teng este inconveniente al tratar de importar mi modulo
agradeceria su asesoria gracias
Hola, tu módulo a exportar debería estar en module.js y no en 08-module.js, cambia los nombres o intercambia el contenido para que funcione sin problemas.
:smile
En el archivo de module.js debes llamar al 08-module.js. Estás importando a module.js dentro del archivo con el mismo nombre.