Подтвердить что ты не робот

Импорт модулей с использованием синтаксиса ES6 и динамического пути

Это работает:

import app from './../app.js';

Но это не так:

import app from path.join(process.cwd(), 'app');

Я получаю:

SyntaxError: /path/file.js: Unexpected token (5:16)
> 5 | import app from path.join(process.cwd(), 'app');
    |                 ^

Можно (и/или как) использовать "динамические" пути? (не hardcoding путь или полагаться на относительные пути).

4b9b3361

Ответ 1

Нет, это невозможно. Модули ES6 должны иметь возможность статически разрешать свои зависимости, не выполняя код модуля, чтобы операторы import работали надежно. Спецификатор модуля должен быть строковым литералом.

Однако загрузчик модулей по вашему выбору должен поддерживать динамическую загрузку модулей с именами переменных. Однако вы не сможете получить привязанный идентификатор app в области вашего модуля (и не можете его повторно экспортировать), он обычно будет доступен только в обратном вызове или около того.

Ответ 2

Импорт ES6 является декларативным и предназначен для статического анализа. Они не могут быть динамическими.

В общем случае ожидалось, что если бы у вас был некоторый условный импорт, ответственность за то, какой модуль загружается на основе какого-либо статического пути, будет зависеть от базовой логики разрешения пути.

Это или вы использовали бы загрузчик асинхронного модуля, а не декларативный импорт.