unexpected node modules instead how exports es6 node.js ecmascript-6 es6-modules

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.