J'utilise l'indicateur --experimental-modules
lors de l'exécution de mon application de nœud afin d'utiliser des modules ES6.
Cependant, lorsque j'utilise cet indicateur, la métavariable __dirname
n'est pas disponible. Existe-t-il un autre moyen d’obtenir la même chaîne stockée dans __dirname
compatible avec ce mode?
Dans Node.js 10, il existe une alternative qui ne nécessite pas la création de plusieurs fichiers:
import path from 'path';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
Il y a eu des propositions pour exposer ces variables via import.meta
, mais pour l'instant, vous avez besoin d'une solution de contournement que j'ai trouvée ici :
// expose.js
module.exports = {__dirname};
// use.mjs
import expose from './expose.js';
const {__dirname} = expose;
J'ai utilisé:
import path from 'path';
const __dirname = path.resolve(path.dirname(decodeURI(new URL(import.meta.url).pathname)));
decodeURI
était important: espaces utilisés et autres éléments dans le chemin d'accès sur mon système de test.
path.resolve()
gère les URL relatives.
import path from 'path';
const __dirname = path.join(path.dirname(decodeURI(new URL(import.meta.url).pathname)));
Ce code fonctionne aussi sous Windows
J'ai aussi abordé ce problème, ma solution:
./src/app.mjs:
app.set('views', path.join(path.resolve('./src'), 'views'));
Voici des informations sur l'organisation de mon dossier:
./index.mjs
import server from './src/bin/www.mjs';
server.start();
./package.json
"scripts": {
"start": "node --experimental-modules ./index.mjs"
},
Il renvoie les chemins corrects sur mon ordinateur Windows en tant que __dirname
.