• Cómo arreglar el error que dice que __dirname no está definido en archivo ES Module de Node.js

    12 de julio de 2021

    - 2 min read

  • A veces, mientras migras tu código de Node.js de Common.js a ESModules, puedes encontrar que la variable __dirname no está definida.

    Por ejemplo, partiendo del siguiente código de un archivo Common.js:

    const path = require("path");
    const root = path.join(__dirname, "..", "src");

    Una vez pases tu proyecto para que use ESModules

    import path from "path";
    const root = path.join(__dirname, "..", "src");

    Encontrarás que te devuelve el siguiente error:

    ReferenceError: __dirname is not defined in ES module scope

    Esto es porque la variable __dirname no está definida en proyectos con ES Modules.

    Sin embargo, hay una solución sencilla que puede hacer que la migración sea fácil y deje de darte problemas.

    Para ello tienes que utilizar la variable import.meta.url. Esta es una variable especial que contiene toda la meta información relativa al módulo, de forma que podremos acceder al contexto del módulo.

    Con esto y gracias a la clase URL podremos conseguir el mismo efecto de antes. Como primer parámetro le pasaremos la ruta y como segundo parámetro tendremos la URL base, que en este caso será la información del módulo actual.

    const { pathname: root } = new URL("../src", import.meta.url);

    Como ves, además de no necesitar más el path.join luego lo que hacemos es acceder a la propiedad pathname del objeto URL que hemos creado.

    ¡Espero que te sirva! De esta forma, podrás seguir migrando proyectos de Common.js a ESModules sin problemas.