Die Skripte, die babel-standalone übersetzen, werden standardmäßig im globalen Gültigkeitsbereich ausgeführt, sodass alle von ihnen definierten Symbole automatisch für jedes andere Modul verfügbar sind. Aus dieser Perspektive benötigen Sie keine Import/Export-Anweisungen in Ihren Modulen.
Sie könnten jedoch versuchen, Quelldateien beizubehalten, die sowohl von babel-standalone (z. B. für schnelle Testumgebungen, Feature-Demos usw.) als auch über Bundler wie Webpack verwendet werden können. In diesem Fall müssen Sie die Import- und Exportanweisungen zur Kompatibilität beibehalten.
Eine Möglichkeit, es zum Laufen zu bringen, besteht darin, dem globalen Bereich zusätzliche Symbole hinzuzufügen, die bewirken, dass der von babel erzeugte Import- und Exportcode keine Auswirkungen hat (anstatt einen Fehler wie üblich zu verursachen). Zum Beispiel Export-Anweisungen werden in kompilierten Code, der wie folgt aussieht:
Object.defineProperty (exports, "__esModule", {
value: true
});
exports.default = MyDefaultExportedClass;
Dies schlägt fehl, wenn es kein existierendes Objekt namens „Exporte“ ist.So geben sie ein: Ich kann es nur geben, eine Kopie des window
Objekt so etwas interessant, die noch zugänglich definiert wird ist:
<script>
// this must run before any babel-compiled modules, so should probably
// be the first script in your page
window.exports = window;
import
Aussagen übersetzt, um Anrufe zu require()
. Das Ergebnis (oder die daraus extrahierten Eigenschaften) wird der Variablen zugewiesen, die als Bezeichner in der Importanweisung verwendet wird. Es gibt ein wenig Komplikationen bei Standardimporten, die davon abhängen, ob das Ergebnis require()
die Eigenschaft __esModule
enthält. Wenn dies nicht der Fall ist, sind die Dinge einfacher (aber Sie können nicht unterstützen, sowohl Standard als auch benannte Exporte in demselben Modul zu haben ... wenn Sie dies tun müssen, schauen Sie sich den Code an, den babel erzeugt und finden Sie heraus, wie Sie ihn machen Arbeit).
Also, wir brauchen eine funktionierende Version von require()
. Wir können einen bereitstellen, indem wir dem exportierten Symbol/Symbolen eine statische Übersetzung des Modulnamens geben. Zum Beispiel in einer Demo-Seite für eine Komponente Reaktion, ich habe folgende Umsetzung:
function require (module) {
if (module === "react") return React;
if (module === "react-dom") return ReactDOM;
}
Für ein Modul mehr Symbole zurückkehrt, dann würden Sie nur ein Objekt zurückgeben, die Symbole als Eigenschaften.
diese Weise eine Aussage wie
`import React from "react";`
übersetzt Code, der effektiv ist:
`React = React;`
, die grob ist, was wir wollen.
Der Fehler bedeutet "Import" sollte in der obersten Ebene einer Datei nicht in einer Klasse oder Funktion angezeigt werden. –
Ich habe meine Import-Anweisung in einer js-Datei mit keinem anderen Code. Nur dieses Import-Modul von './modules/mymodule'; – icode