Альтернатива для dirname в узле при использовании флага --experimental-modules

Я использую флаг --experimental-modules при запуске приложения моего узла для использования модулей ES6.

однако, когда я использую этот флаг metavariable __dirname не имеется. Есть альтернативный способ получить ту же строку, которая хранится в __dirname, которое совместимо с этим режимом?

4 ответов


были предложения о предоставлении этих переменных через import.meta, но сейчас вам нужно хакерское обходное решение, которое я нашел здесь:

// expose.js
module.exports = {__dirname};

// use.mjs
import expose from './expose.js';
const {__dirname} = expose;

В Узел.js 10 есть альтернатива, которая не требует создания нескольких файлов:

import path from 'path';

const __dirname = path.dirname(new URL(import.meta.url).pathname);

Я:

import path from 'path';

const __dirname = path.resolve(path.dirname(decodeURI(new URL(import.meta.url).pathname)));

decodeURI было важно: используемые пробелы и другие вещи в пути в моей тестовой системе.

path.resolve() обрабатывает относительные URL-адреса.


Я также попал в эту проблему, мое решение:

./ src / app.mjs:

app.set('views', path.join(path.resolve('./src'), 'views'));

вот информация о моей организации папке:

./индекс.mjs

import server from './src/bin/www.mjs';
server.start();

./пакет.в JSON

"scripts": {
    "start": "node --experimental-modules ./index.mjs"
},

он возвращает правильные пути на моем ПК с windows как __dirname.