J'ai besoin de faire quelque chose comme:
if (condition) {
import something from 'something';
}
// ...
if (something) {
something.doStuff();
}
Le code ci-dessus ne compile pas; il jette SyntaxError: ... 'import' and 'export' may only appear at the top level
.
J'ai essayé d'utiliser System.import
comme indiqué ici , mais je ne sais pas d'où System
vient. Est-ce une proposition ES6 qui n'a finalement pas été acceptée? Le lien vers "API programmatique" de cet article me renvoie vers une page de documentation obsolète .
javascript
module
ecmascript-6
ericsoco
la source
la source
package.json
; mygulpfile
vérifie ensuite si cette dépendance existe avant d'effectuer certaines étapes de construction.webpack
etbabel
transpile es6 en es5. Les projets commewebpack-rewire
et similaires ne sont d'aucune utilité ici - github.com/jhnns/rewire-webpack/issues/12 . Une façon de définir les doubles de test OU de supprimer les dépendances problématiques pourrait être l'importation conditionnelle.webpack
est utilisé pour convertir les feuilles de style en modules qui insèrent les styles pertinents dans le DOM lorsqu'ils sont importés) mais le module doit également s'exécuter en dehors du navigateur (par exemple pour les tests unitaires).Réponses:
Nous avons maintenant une proposition d'importation dynamique avec l'ECMA. Ceci est à l'étape 3. Ceci est également disponible en tant que babel-preset .
Voici un moyen de faire un rendu conditionnel selon votre cas.
Cela renvoie essentiellement une promesse. La résolution de la promesse devrait avoir le module. La proposition a également d'autres fonctionnalités comme les importations dynamiques multiples, les importations par défaut, l'importation de fichiers js, etc. Vous pouvez trouver plus d'informations sur les importations dynamiques ici .
la source
if (condition) { import('something') .then(({ somethingExported }) => { console.log(somethingExported); }); }
npm run build
j'obtiens toujours l'erreur:SyntaxError: ... 'import' and 'export' may only appear at the top level
Si vous le souhaitez, vous pouvez utiliser require. C'est une manière d'avoir une instruction conditionnelle require.
la source
require()
ne fait pas partie de JavaScript standard - c'est une fonction intégrée dans Node.js, donc seulement utile dans cet environnement. L'OP ne donne aucune indication de travailler avec Node.js.Vous ne pouvez pas importer de manière conditionnelle, mais vous pouvez faire le contraire: exporter quelque chose de manière conditionnelle. Cela dépend de votre cas d'utilisation, donc ce travail n'est peut-être pas pour vous.
Tu peux faire:
api.js
apiConsumer.js
J'utilise cela pour simuler des bibliothèques d'analyse comme mixpanel, etc. parce que je ne peux pas avoir plusieurs builds ou notre frontend actuellement. Pas le plus élégant, mais fonctionne. J'ai juste quelques «si» ici et là en fonction de l'environnement car dans le cas du mixpanel, il a besoin d'être initialisé.
la source
On dirait que la réponse est que, pour le moment, vous ne pouvez pas.
http://exploringjs.com/es6/ch_modules.html#sec_module-loader-api
Je pense que l'intention est de permettre l'analyse statique autant que possible, et les modules importés conditionnellement brisent cela. Il convient également de mentionner - j'utilise Babel , et je suppose que cela
System
n'est pas pris en charge par Babel car l'API du chargeur de module n'est pas devenue une norme ES6.la source
require()
est un moyen d'importer un module au moment de l'exécution et il se qualifie également pour l'analyse statique, commeimport
s'il était utilisé avec des chemins littéraux de chaîne. Ceci est requis par le bundler pour choisir les dépendances pour le bundle.Pour une résolution de module dynamique avec prise en charge complète de l'analyse statique, commencez par indexer les modules dans un indexeur (index.js) et importez l'indexeur dans le module hôte.
la source
require()
ne fait pas partie de JavaScript standard - c'est une fonction intégrée dans Node.js, donc seulement utile dans cet environnement. L'OP ne donne aucune indication de travailler avec Node.js.Différence importante si vous utilisez le mode d'importation dynamique Webpack
eager
:la source
import
renvoie une promesse.l'obscurcir dans une évaluation a fonctionné pour moi, le cachant de l'analyseur statique ...
la source
eval
ici, @TormodHaugene?eval
il ne devrait pas être utilisé . En général: si vous trouvez le besoin d'utilisereval
, vous le faites probablement mal et devriez prendre du recul pour envisager vos alternatives. Il existe probablement des scénarios où l'utilisationeval
est correcte, mais vous n'avez probablement pas rencontré l'une de ces situations.require()
ne fait pas partie de JavaScript standard - c'est une fonction intégrée dans Node.js, donc seulement utile dans cet environnement. L'OP ne donne aucune indication de travailler avec Node.js.J'ai pu y parvenir en utilisant une fonction immédiatement appelée et une instruction require.
la source
require()
ne fait pas partie de JavaScript standard - c'est une fonction intégrée dans Node.js, donc seulement utile dans cet environnement. L'OP ne donne aucune indication de travailler avec Node.js.Les importations conditionnelles pourraient également être réalisées avec un ternaire et
require()
s:const logger = DEBUG ? require('dev-logger') : require('logger');
Cet exemple est tiré de la documentation ES Lint global-require: https://eslint.org/docs/rules/global-require
la source
require()
ne fait pas partie de JavaScript standard - c'est une fonction intégrée dans Node.js, donc seulement utile dans cet environnement. L'OP ne donne aucune indication de travailler avec Node.js.Regardez cet exemple pour comprendre clairement le fonctionnement de l'importation dynamique.
Exemple d'importations de modules dynamiques
Avoir une compréhension de base de l'importation et de l'exportation de modules.
Modules JavaScript Github
Modules Javascript MDN
la source
Non, tu ne peux pas!
Cependant, après avoir rencontré ce problème, vous devriez repenser la façon dont vous organisez votre code.
Je suppose qu'une des raisons pour lesquelles ils ont abandonné ce support sur ES6 est le fait que le compiler serait très difficile, voire impossible.
la source