web-dev-qa-db-fra.com

Alternative pour __dirname dans le noeud lors de l'utilisation de l'indicateur --experimental-modules

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?

21
Amygdaloideum

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);
20
GOTO 0

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;
18
robertklep

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.

2
BananaAcid
import path from 'path';
const __dirname = path.join(path.dirname(decodeURI(new URL(import.meta.url).pathname)));

Ce code fonctionne aussi sous Windows

0
user2962433

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.

0
Lanti