Ich muss so etwas tun wie:
if (condition) {
import something from 'something';
}
// ...
if (something) {
something.doStuff();
}
Der obige Code wird nicht kompiliert. es wirft SyntaxError: ... 'import' and 'export' may only appear at the top level
.
Ich habe versucht, System.import
wie hier gezeigt zu verwenden , aber ich weiß nicht, woher es System
kommt. Ist es ein ES6-Vorschlag, der nicht angenommen wurde? Der Link zu "Programmatic API" aus diesem Artikel führt mich zu einer veralteten Dokumentenseite .
javascript
module
ecmascript-6
ericsoco
quelle
quelle
package.json
. mygulpfile
prüft dann, ob diese Abhängigkeit besteht, bevor einige Build-Schritte ausgeführt werden.webpack
undbabel
transpiliere es6 zu es5. Projekte wiewebpack-rewire
und ähnliche sollen hier nicht helfen - github.com/jhnns/rewire-webpack/issues/12 . Eine Möglichkeit, die Testdoppelwerte festzulegen ODER problematische Abhängigkeiten zu entfernen, könnte der bedingte Import sein.webpack
Stylesheets in Module konvertiert werden, die die relevanten Stile in die einfügen DOM beim Importieren), aber das Modul muss auch außerhalb des Browsers ausgeführt werden (z. B. zum Testen von Einheiten).Antworten:
Wir haben jetzt einen dynamischen Importvorschlag bei ECMA. Dies ist in Stufe 3. Dies ist auch als Babel-Preset verfügbar .
Im Folgenden finden Sie eine Möglichkeit zum bedingten Rendern gemäß Ihrem Fall.
Dies gibt im Grunde ein Versprechen zurück. Die Auflösung des Versprechens wird voraussichtlich das Modul haben. Der Vorschlag enthält auch andere Funktionen wie mehrere dynamische Importe, Standardimporte, Import von JS-Dateien usw. Weitere Informationen zu dynamischen Importen finden Sie hier .
quelle
if (condition) { import('something') .then(({ somethingExported }) => { console.log(somethingExported); }); }
npm run build
erhalte ich immer noch den Fehler:SyntaxError: ... 'import' and 'export' may only appear at the top level
Wenn Sie möchten, können Sie erfordern verwenden. Dies ist eine Möglichkeit, eine bedingte require-Anweisung zu erhalten.
quelle
require()
nicht Teil von Standard-JavaScript ist - es ist eine in Node.js integrierte Funktion, die nur in dieser Umgebung nützlich ist. Das OP gibt keinen Hinweis auf die Arbeit mit Node.js.Sie können nicht bedingt importieren, aber Sie können das Gegenteil tun: etwas bedingt exportieren. Dies hängt von Ihrem Anwendungsfall ab, sodass diese Problemumgehung möglicherweise nicht für Sie geeignet ist.
Du kannst tun:
api.js
apiConsumer.js
Ich benutze das, um Analytics-Bibliotheken wie Mixpanel usw. zu verspotten, weil ich derzeit nicht mehrere Builds oder unser Frontend haben kann. Nicht das eleganteste, funktioniert aber. Ich habe hier und da nur ein paar "Wenn", abhängig von der Umgebung, da im Fall von Mixpanel eine Initialisierung erforderlich ist.
quelle
Sieht so aus, als ob die Antwort lautet, dass Sie ab sofort nicht mehr können.
http://exploringjs.com/es6/ch_modules.html#sec_module-loader-api
Ich denke, die Absicht ist es, die statische Analyse so weit wie möglich zu ermöglichen, und bedingt importierte Module brechen dies. Erwähnenswert ist auch, dass ich Babel verwende und ich vermute, dass
System
dies von Babel nicht unterstützt wird, da die Modullader-API nicht zum ES6-Standard wurde.quelle
require()
ist eine Möglichkeit, ein Modul zur Laufzeit zu importieren, und es eignet sich gleichermaßen für statische Analysen, wieimport
wenn es mit String-Literalpfaden verwendet wird. Dies wird vom Bundler benötigt, um Abhängigkeiten für das Bundle auszuwählen.Für eine dynamische Modulauflösung mit vollständiger Unterstützung der statischen Analyse müssen Sie zuerst die Indexmodule in einem Indexer (index.js) und den Indexer in das Hostmodul importieren.
quelle
require()
nicht Teil von Standard-JavaScript ist - es ist eine in Node.js integrierte Funktion, die nur in dieser Umgebung nützlich ist. Das OP gibt keinen Hinweis auf die Arbeit mit Node.js.Wichtiger Unterschied, wenn Sie den dynamischen Import-Webpack-Modus verwenden
eager
:quelle
import
gibt ein Versprechen zurück.es in einer Auswertung zu verdecken, hat für mich funktioniert und es vor dem statischen Analysator versteckt ...
quelle
eval
@TormodHaugene hier eigentlich falsch ist ?eval
es nicht verwendet werden sollte . Im Allgemeinen: Wenn Sie die Notwendigkeit einer Verwendung feststelleneval
, machen Sie es wahrscheinlich falsch und sollten einen Schritt zurücktreten, um Ihre Alternativen in Betracht zu ziehen. Es gibt wahrscheinlich einige Szenarien, in denen die Verwendungeval
korrekt ist, aber Sie sind höchstwahrscheinlich nicht auf eine dieser Situationen gestoßen.require()
nicht Teil von Standard-JavaScript ist - es ist eine in Node.js integrierte Funktion, die nur in dieser Umgebung nützlich ist. Das OP gibt keinen Hinweis auf die Arbeit mit Node.js.Ich konnte dies mit einer sofort aufgerufenen Funktion erreichen und eine Anweisung benötigen.
quelle
require()
nicht Teil von Standard-JavaScript ist - es ist eine in Node.js integrierte Funktion, die nur in dieser Umgebung nützlich ist. Das OP gibt keinen Hinweis auf die Arbeit mit Node.js.Bedingte Importe könnten auch mit einem ternären und
require()
s erreicht werden:const logger = DEBUG ? require('dev-logger') : require('logger');
Dieses Beispiel wurde aus den global erforderlichen ES Lint-Dokumenten entnommen: https://eslint.org/docs/rules/global-require
quelle
require()
nicht Teil von Standard-JavaScript ist - es ist eine in Node.js integrierte Funktion, die nur in dieser Umgebung nützlich ist. Das OP gibt keinen Hinweis auf die Arbeit mit Node.js.Schauen Sie sich dieses Beispiel an, um zu verstehen, wie der dynamische Import funktioniert.
Beispiel für den Import dynamischer Module
Grundlegendes Verständnis zum Importieren und Exportieren von Modulen.
JavaScript-Module Github
Javascript-Module MDN
quelle
Nein, das kannst du nicht!
Wenn Sie jedoch auf dieses Problem gestoßen sind, sollten Sie überlegen, wie Sie Ihren Code organisieren.
Ich denke, einer der Gründe, warum sie diese Unterstützung ab ES6 eingestellt haben, ist die Tatsache, dass das Kompilieren sehr schwierig oder unmöglich wäre.
quelle