web-dev-qa-db-fra.com

Importation de modules à l'aide de la syntaxe ES6 et du chemin dynamique

Cela marche:

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

Mais cela ne veut pas:

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

Je suis en train:

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

Il est possible (et/ou comment) d'utiliser des chemins "dynamiques"? (ne codez pas en dur le chemin ou ne vous fiez pas aux chemins relatifs).

47
Félix Sanz

Non, ce n'est pas possible. Les modules ES6 doivent pouvoir résoudre leurs dépendances de manière statique, sans exécuter de code de module, afin que les instructions import fonctionnent de manière fiable. Le spécificateur de module doit être un littéral de chaîne.

Cependant, le chargeur de modules de votre choix doit prendre en charge le chargement dynamique de modules avec des noms de variables. Cependant, vous ne pourriez pas obtenir un identifiant lié app dans l'étendue de votre module (il ne peut pas le réexporter), il ne serait généralement disponible que dans un rappel.

52
Bergi

Les importations ES6 sont déclaratives et destinées à une analyse statique. Ils ne peuvent pas être dynamiques.

En règle générale, si certaines importations conditionnelles étaient importées, il incomberait à la logique de résolution de chemin sous-jacent de décider du module à charger en fonction d'un chemin statique.

Que vous utilisiez le chargeur de module async plutôt que les importations déclaratives.

12
loganfsmyth