node.js - modules - node js use import instead of require
Alternativa para__dirname en nodo cuando se usa el distintivo--experimental-modules (5)
Uso la bandera --experimental-modules
cuando --experimental-modules
mi aplicación de nodo para usar los módulos ES6.
Sin embargo, cuando uso este indicador, la metavariable __dirname
no está disponible. ¿Hay alguna forma alternativa de obtener la misma cadena que está almacenada en __dirname
que es compatible con este modo?
En Node.js 10 hay una alternativa que no requiere la creación de varios archivos:
import path from ''path'';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
Ha habido propuestas sobre la exposición de estas variables a través de import.meta
, pero por ahora, necesita una solución pirata que encontré here :
// expose.js
module.exports = {__dirname};
// use.mjs
import expose from ''./expose.js'';
const {__dirname} = expose;
Solía:
import path from ''path'';
const __dirname = path.resolve(path.dirname(decodeURI(new URL(import.meta.url).pathname)));
decodeURI
era importante: espacios usados y otras cosas dentro de la ruta en mi sistema de prueba.
path.resolve()
maneja las URL relativas.
También me metí en este tema, mi solución:
./src/app.mjs:
app.set(''views'', path.join(path.resolve(''./src''), ''views''));
Aquí hay información sobre la organización de mi carpeta:
./index.mjs
import server from ''./src/bin/www.mjs'';
server.start();
./paquete.json
"scripts": {
"start": "node --experimental-modules ./index.mjs"
},
Está devolviendo las rutas correctas en mi PC con Windows como __dirname
.
import path from ''path'';
const __dirname = path.dirname(decodeURI(new URL(import.meta.url).pathname)).replace(/^//([A-Z]):///, ''$1:/'');
Este código también funciona en Windows.