Alternativa para __dirname en Node.js cuando se usan módulos ES6

Resuelto Amygdaloideum asked hace 7 años • 26 respuestas

Utilizo la bandera --experimental-modulescuando ejecuto mi aplicación Node para poder usar módulos ES6.

Sin embargo, cuando uso este indicador, la metavariable __dirnameno está disponible. ¿Existe una forma alternativa de obtener la misma cadena almacenada __dirnameque sea compatible con este modo?

Amygdaloideum avatar Oct 14 '17 20:10 Amygdaloideum
Aceptado

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;
GOTO 0 avatar Apr 26 '2018 21:04 GOTO 0

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 joincrear 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;
Rudolf Gröhling avatar Mar 16 '2021 08:03 Rudolf Gröhling