Alternativa para __dirname en Node.js cuando se usan módulos ES6
Utilizo la bandera --experimental-modules
cuando ejecuto mi aplicación Node para poder usar módulos ES6.
Sin embargo, cuando uso este indicador, la metavariable __dirname
no está disponible. ¿Existe una forma alternativa de obtener la misma cadena almacenada __dirname
que sea compatible con este modo?
A partir de Node.js 10.12, existe una alternativa que no requiere la creación de varios archivos y maneja caracteres especiales en nombres de archivos en todas las plataformas:
import { dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
A partir de Node.js 14.14 , los módulos integrados se pueden escribir con el node:
esquema:
import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
const __dirname = dirname(fileURLToPath(import.meta.url));
A partir de Node.js 20.11/21.2 , puedes usar import.meta.dirname
:
const __dirname = import.meta.dirname;
La forma más estandarizada en 2021
Nota: no funciona en Windows.
import { URL } from 'node:url'; // in Browser, the URL in native accessible on window
const __filename = new URL('', import.meta.url).pathname;
// Will contain trailing slash
const __dirname = new URL('.', import.meta.url).pathname;
Y olvídate de join
crear rutas desde el archivo actual, solo usa elURL
const pathToAdjacentFooFile = new URL('./foo.txt', import.meta.url).pathname;
const pathToUpperBarFile = new URL('../bar.json', import.meta.url).pathname;