Alternative for __dirname in Node.js when using ES6 modules

ecmascript-6, es6-modules, node.js

Solution

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

const __dirname = import.meta.dirname;

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));

For 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));

Problem

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?

Original source