est-il possible d'importer quelque chose dans le module fournissant un nom de variable tout en utilisant l'importation ES6?
Ie je veux importer un module à un runtime en fonction des valeurs fournies dans une configuration:
import something from './utils/' + variableName;
javascript
node.js
ecmascript-6
Vytautas Butkus
la source
la source
Réponses:
Pas avec la
import
déclaration.import
etexport
sont définis de manière à pouvoir être analysés statiquement, ils ne peuvent donc pas dépendre des informations d'exécution.Vous recherchez l' API du chargeur (polyfill) , mais je ne suis pas certain du statut de la spécification:
la source
En plus de la réponse de Felix , je noterai explicitement que cela n'est actuellement pas autorisé par la grammaire ECMAScript 6 :
Un ModuleSpecifier ne peut être qu'un StringLiteral , pas un autre type d'expression comme AdditiveExpression .
la source
const
string literal
art. Ils sont statiquement analysables, n'est-ce pas? Cela rendrait possible la réutilisation de l'emplacement d'une dépendance. (par exemple, importez un modèle et ayez le modèle et l'emplacement du modèle disponibles).Bien que ce ne soit pas réellement une importation dynamique (par exemple, dans mon cas, tous les fichiers que j'importe ci-dessous seront importés et regroupés par webpack, non sélectionné au moment de l'exécution), un modèle que j'ai utilisé qui peut aider dans certaines circonstances est :
Ou bien:
Je ne pense pas que je puisse revenir à une valeur par défaut aussi facilement avec
require()
, ce qui génère une erreur si j'essaie d'importer un chemin de modèle construit qui n'existe pas.De bons exemples et comparaisons entre require et import peuvent être trouvés ici: http://www.2ality.com/2014/09/es6-modules-final.html
Excellente documentation sur la réexportation depuis @iainastacio: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
Je suis intéressé d'entendre des commentaires sur cette approche :)
la source
Object.values(templates)
.Il existe une nouvelle spécification appelée importation dynamique pour les modules ES. En gros, vous venez d'appeler
import('./path/file.js')
et vous êtes prêt à partir. La fonction renvoie une promesse, qui résout avec le module si l'importation a réussi.Cas d'utilisation
Les cas d'utilisation incluent l' importation de composants basés sur les routes pour React, Vue, etc. et la possibilité de charger paresseusement des modules , une fois qu'ils sont requis pendant l'exécution.
Informations complémentaires
Voici une explication sur les développeurs Google .
Compatibilité du navigateur (avril 2020)
Selon MDN, il est pris en charge par tous les principaux navigateurs actuels (sauf IE) et caniuse.com affiche un soutien de 87% sur la part de marché mondiale. Encore une fois pas de support dans IE ou Edge non chromé.
la source
Je comprends la question spécifiquement posée pour ES6
import
dans Node.js, mais ce qui suit pourrait aider les autres à rechercher une solution plus générique:Notez que si vous importez un module ES6 et que vous devez accéder à l'
default
exportation, vous devrez utiliser l'un des éléments suivants:Vous pouvez également utiliser la déstructuration avec cette approche qui peut ajouter plus de familiarité avec la syntaxe de vos autres importations:
Malheureusement, si vous souhaitez accéder
default
ainsi que la déstructuration, vous devrez effectuer cette opération en plusieurs étapes:la source
vous pouvez utiliser la notation non ES6 pour ce faire. C'est ce qui a fonctionné pour moi:
la source
J'aime moins cette syntaxe, mais ça marche:
au lieu d'écrire
utilisez cette syntaxe:
la source
require()
est une méthode Node.JS pour charger des fichiers, qui est la première version.import
déclaration est la version la plus récente, qui fait maintenant partie de la syntaxe de la langue officielle. Cependant, dans de nombreux cas, le navigateur utilisera le précédent (derrière la science). L'instruction require encaissera également vos fichiers, donc si un fichier est chargé une deuxième fois, il sera chargé à partir de la mémoire (meilleures performances). La méthode d'importation a ses propres avantages - si vous utilisez WebPack. alors webpack peut supprimer les références mortes (ces scripts ne seront pas téléchargés sur le client).L'importation dynamique () (disponible dans Chrome 63+) fera votre travail. Voici comment:
la source
Je le ferais comme ça
la source
./utils/test.js
appel depuis un fichier
la source