Entendiendo los Módulos en JavaScript y Deno
-
Oliver Servín
Un concepto fundamental para cualquier desarrollador de JavaScript es entender los módulos. Un módulo es simplemente un archivo que contiene código JavaScript. A lo largo de la historia de JavaScript, han existido varias formas de manejar los módulos, pero hoy el estándar son los módulos ECMAScript (ES modules). Cuando trabajamos con Deno, estos son los únicos que necesitamos conocer, y son fáciles de aprender ya que solo requieren dos palabras clave: import
y export
.
#Exportaciones por defecto (Default Exports)
Imaginemos que tenemos dos archivos, a.ts
y b.ts
, cada uno con una función sencilla. Para utilizar una función de un archivo en otro, necesitamos exportarla con la palabra clave export
. Una forma es usar export default
, que se emplea cuando queremos exportar un solo elemento de un archivo.
export default function foo() { console.log(foo)}
Esta práctica es común en componentes React, donde el usuario final puede cambiar el nombre de la exportación al importarla.
En el archivo main.ts
, al comenzar a escribir el nombre de la función, Deno generará automáticamente la declaración de importación necesaria porque conoce la ubicación del código.
import foo from "./a.ts"; foo();
#Exportaciones nombradas (Named Exports)
Las exportaciones nombradas son otra forma más común. Simplemente usamos la palabra clave export
antes de cualquier función, variable, clase o fragmento de código que queramos exportar. Esto permite importar solo los elementos necesarios.
Por ejemplo, con dos funciones en b.ts
, puedes importar una o ambas según necesites.
export function bar() { console.log('bar')} export function baz() { console.log('baz')}
Las importaciones y exportaciones con export
son flexibles. Si hay conflictos de nombres o preferimos otro nombre, podemos usar la palabra clave as
para renombrar. Las importaciones con export default
no tienen este problema, ya que podemos asignarles cualquier nombre al importarlas.
import customFoo from "./a.ts";import { bar as customBar } from "./b.ts";
#Módulos de terceros en Deno
Deno maneja fluidamente diferentes tipos de módulos: los de su librería estándar, módulos de registros como npm
, e incluso URLs.
JSR es el registro preferido para librerías de terceros en Deno, diseñado específicamente para TypeScript. Deno también ofrece una completa librería estándar (con prefijo @std
). En el sitio web de JSR, cada paquete tiene un puntaje que indica su compatibilidad con IntelliSense y TypeScript.
Por ejemplo, la librería @std/text
puede realizar conversiones de cadenas a camelCase o snake_case. Toda la librería @std
suele tener un puntaje JSR del 100%.
Para incorporar paquetes, usamos la CLI de Deno:
deno add jsr:@std/text
Al escribir una importación con la palabra clave jsr
, obtendremos soporte IntelliSense para descubrir e importar funciones.
Es recomendable agregar paquetes explícitamente con deno add
para registrarlos en deno.json
y gestionar sus versiones.
{ "tasks": { "dev": "deno run --watch main.ts" }, "imports": { "@std/assert": "jsr:@std/assert@1",+ "@std/text": "jsr:@std/text@^1.0.8" } }
#Alternativas de importación
Deno 2 permite importar módulos desde npm
, el principal gestor de paquetes de Node.js. Aunque npm ofrece más paquetes que JSR, algunos pueden ser menos confiables. Preferiremos JSR cuando sea posible, pero podemos usar npm para paquetes específicos no disponibles en JSR, como Lodash.
La última opción es importar mediante URLs HTTPS, permitiendo cargar código desde fuentes como deno.land, jsDelivr o esm.sh. Este método debe evitarse salvo que sea necesario, porque puede presentar riesgos de seguridad.