Entendiendo import.meta.main en Deno

#¿Qué es import.meta?

import.meta.main es un fragmento de código que aparece en nuestro archivo main.js en cualquier proyecto nuevo de Deno.

import.meta no es una función exclusiva de Deno, sino que proviene de la plataforma web. En la documentación de MDN de Mozilla podemos encontrar información detallada. import.meta es una sintaxis especial que nos permite obtener información sobre el módulo o archivo actual que contiene nuestro código JavaScript. Un módulo es simplemente un archivo que contiene JavaScript.

En el IDE, al escribir import.meta seguido de un punto, podemos ver las propiedades y métodos disponibles. Por ejemplo, dirname proporciona el directorio del archivo actual, y filename muestra el nombre del archivo.

#Utilización de la propiedad main

Esta información, aunque sencilla, puede ser útil. La propiedad main es un valor booleano que indica si el archivo actual es el módulo principal en Deno.

Para entenderlo mejor, agreguemos un console.log dentro de una función helloWorld que muestre el valor de import.meta.main:

main.ts
function helloWorld() {
console.log("Main?", import.meta.main);
 
return "Hey World!";
}
 
if (import.meta.main) {
console.log(helloWorld());
}

Al ejecutar el archivo con deno run en la terminal, veremos que el valor de main es true, ya que estamos ejecutando directamente este archivo.

deno run main.ts

Para usar la función helloWorld en otro archivo, podemos agregar export delante de la función:

main.ts
-function helloWorld() {
+export function helloWorld() {
console.log("Main?", import.meta.main);
 
return "Hey World!";
}
 
if (import.meta.main) {
console.log(helloWorld());
}

Para evitar que el código adicional se ejecute al importarlo, creemos un archivo other.ts e importemos la función HelloWorld:

other.ts
import { helloWorld } from "./main.ts"
helloWorld()

Al ejecutar other.ts con Deno, el valor de import.meta.main será false.

El código en main.ts como console.log(helloWorld()) no se ejecutará al ejecutar explícitamente un archivo diferente.

#Conclusión

Este patrón nos permite ejecutar código en un archivo mientras exportamos funcionalidades para otros módulos, mejorando la organización y estructura del código.

Si has trabajado con Node.js, notarás que import.meta sustituye funciones globales como __dirname, ofreciendo una API más limpia y alineada con los estándares web.