Альтернатива для 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
.