node.jsecmascript-6es6-modules

Alternative for __dirname in Node.js when using ES6 modules


I use the flag --experimental-modules when running my Node application in order to use ES6 modules.

However when I use this flag the metavariable __dirname is not available. Is there an alternative way to get the same string that is stored in __dirname that is compatible with this mode?


Solution

  • As of Node.js 10.12 there's an alternative that doesn't require creating multiple files and handles special characters in filenames across platforms:

    import { dirname } from 'path';
    import { fileURLToPath } from 'url';
    
    const __dirname = dirname(fileURLToPath(import.meta.url));
    

    Starting with Node.js 14.14, built-in modules can be written with the node: schema:

    import { dirname } from 'node:path';
    import { fileURLToPath } from 'node:url';
    
    const __dirname = dirname(fileURLToPath(import.meta.url));
    

    Starting with Node.js 20.11 / 21.2, you can use import.meta.dirname:

    const __dirname = import.meta.dirname;