| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/import/source | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Experimentell: Dies ist eine experimentelle Technologie
berprfen Sie die Browser-Kompatibilittstabelle sorgfltig vor der Verwendung auf produktiven Webseiten.
Die Deklaration import source hnelt der regulren Deklaration import, fhrt jedoch zu einem Objekt, das den kompilierten Quellcode des Moduls reprsentiert. Das Modul wird abgerufen und kompiliert, aber seine Abhngigkeiten werden nicht geladen und es wird weder verknpft noch ausgewertet. Es kann spter imperativ ausgewertet werden, etwa durch die Verwendung von dynamischem Import oder WebAssembly.instantiate().
Um import source zu verwenden, muss das Zielmodul ein Typ sein, der Quellphasenimporte untersttzt. Derzeit untersttzen nur WebAssembly-Module Quellphasenimporte und ergeben WebAssembly.Module-Objekte. JavaScript-Modulquellobjekte werden durch den Vorschlag ECMAScript Module Phase Imports hinzugefgt.
import source x from "module-name";
xName, der sich auf das Modulquellobjekt bezieht. Muss ein gltiger JavaScript-Identifier sein.
module-nameDas Modul, aus dem importiert werden soll. Wird genauso behandelt wie der module-name in regulren import-Deklarationen.
Importattribute werden ebenfalls untersttzt, indem nach dem Modulspezifizierer eine with-Klausel verwendet wird.
source ist kein reserviertes Wort. Beispielsweise ist import source from "./module.js" weiterhin ein regulrer Standardimport, dessen lokale Bindung source heit.
SyntaxErrorWird ausgelst, wenn das Zielmodul keine Quellphasenimporte untersttzt.
Standardmig fhrt die import-Deklaration viele Aufgaben gleichzeitig aus: das Auflsen des Modulspezifizierers, das Abrufen des Modulquellcodes, das Parsen (wobei mglicherweise transitive Abhngigkeiten entdeckt werden), das Verknpfen und das Auswerten. Diese Form der sofortigen Auswertung ist nicht immer wnschenswert, insbesondere wenn der Modulquellcode in einem anderen Kontext ausgewertet werden soll, beispielsweise in einem Worker-Thread.
Der Importphasenmodifikator ermglicht es, den Modulimportprozess in einer bestimmten Phase anzuhalten. Durch das Hinzufgen von source nach import wird der Quellcode geparst und kompiliert, bleibt jedoch unverknpft und nicht ausgewertet. Der Quellimport ldt die transitiven Abhngigkeiten des Moduls nicht.
Traditionell bestand die einzige Mglichkeit, einen Teil der Pipeline auszufhren, darin, sie vollstndig manuell zu implementieren. Bei WebAssembly verwenden Sie beispielsweise zunchst fetch(), um die binren Bytes des Moduls abzurufen, und kompilieren diese spter mit WebAssembly.compile() oder kompilieren den Antwortstream mit WebAssembly.compileStreaming() zu einem WebAssembly.Module-Objekt.
const myModuleSource = await WebAssembly.compileStreaming(
fetch("./my-module.wasm"),
);
Diese Art manueller Arbeitsablauf ist aus mehreren Grnden problematisch:
Die Verwendung von Quellphasenimporten vermeidet diese Probleme.
import source myModuleSource from "./my-module.wasm";
Das aus diesem Import erhaltene Objekt ist eine Instanz einer Unterklasse von AbstractModuleSource. Jeder Modultyp, der Quellphasenimporte untersttzt, definiert seine eigene Unterklasse. Fr WebAssembly ist die Unterklasse WebAssembly.Module. Dieses Objekt wird fr das jeweilige Modul zwischengespeichert, sodass sptere Quellimporte desselben Spezifizierers exakt dasselbe Objekt zurckgeben.
Anders als bei import defer wird bei einem Quellimport auch das Verknpfen aufgeschoben. Ein vorheriges Verknpfen ermglicht dem Modullader, Abhngigkeiten aufzulsen und fehlende Abhngigkeiten oder ungltige Importe zu erkennen, bevor das Modul verwendet wird. Das Modul unverknpft zu lassen, vermeidet das Laden von Abhngigkeiten, die Sie mglicherweise nicht bentigen, und ermglicht es Ihnen, seine Instanziierung zu steuern. Beispielsweise knnen Sie ein per Quellimport importiertes WebAssembly-Modul mehrfach mit unterschiedlichen Importen instanziieren oder es zur dortigen Instanziierung an einen Worker senden.
Anders als bei import() wird das per Quellimport importierte Modul im Voraus abgerufen und kompiliert, ohne ausgewertet zu werden. import source bietet auerdem die meisten Vorteile einer statischen Deklaration, etwa eine bessere statische Analyse.
Beachten Sie, dass nur die Syntax fr den Standardimport untersttzt wird. Sie knnen beispielsweise nicht import source { property } from "./my-module.wasm" verwenden.
Fr WebAssembly stellen Sie die importierten Werte bei der Instanziierung des Moduls bereit:
import source myModuleSource from "./my-module.wasm";
const instance = await WebAssembly.instantiate(myModuleSource, {
env: { log: console.log },
});
const { exports } = instance;
Anders als bei einem gewhnlichen WebAssembly-Modulimport wird dadurch eine neue Instanz mit den von Ihnen bereitgestellten Importen erstellt, statt die vom Modullader verknpfte zwischengespeicherte Instanz zu verwenden. Ihr exports-Objekt ist kein JavaScript-Modul-Namespace-Objekt. Beispielsweise werden WebAssembly-Globals ber instance.exports als WebAssembly.Global-Objekte verfgbar gemacht, whrend die ESM-Integration ihre Werte fr JavaScript-Importierende verfgbar macht.
Hinweis:
Die Untersttzung fr Quellphasenimporte von WebAssembly bedeutet nicht, dass gewhnliche WebAssembly-Modulimporte untersttzt werden. Ein Host kann import source mod from "./mod.wasm" untersttzen und gleichzeitig import * as ns from "./mod.wasm" ablehnen.
Quellimporte verwenden den Modullader des Hosts, einschlielich seiner Kompilierungseinstellungen. Sie entsprechen nicht unbedingt einem Aufruf von WebAssembly.compileStreaming() mit Standardoptionen. Beispielsweise aktiviert Node.js JavaScript-String-Built-ins fr Wasm-Importe und lehnt reservierte Import- und Exportnamen ab. Verwenden Sie die direkten WebAssembly-Kompilierungs-APIs, wenn Sie benutzerdefinierte Kompilierungsoptionen bentigen.
Fr JavaScript (unter der Annahme der vorgeschlagenen Untersttzung fr import(moduleSource), ebenfalls in ECMAScript Module Phase Imports):
import * as namespace from "./my-module.js";
// Is equivalent to:
import source myModuleSource from "./my-module.js";
const namespace = await import(myModuleSource);
Der Modifikator gilt fr einen Import, nicht fr das Modul selbst. Wenn ein anderer Teil der Anwendung dasselbe Modul ohne source importiert, wird das Modul wie gewohnt ausgewertet. Beide Formen teilen denselben Modulzustand, und der Code des Moduls wird hchstens einmal ausgefhrt. Das ndern der Importphase erstellt kein separates Modul im Cache:
import * as x from "foo";
import source xSource from "foo";
console.log((await import(xSource)) === x); // true
Hinweis:
Diese zwischengespeicherte Instanz wird bei Verwendung von import() wiederverwendet, jedoch nicht bei manueller Instanziierung von WebAssembly. Jeder Aufruf von WebAssembly.instantiate(modSource, imports) oder new WebAssembly.Instance(modSource, imports) erstellt eine neue Instanz und fhrt ihre Initialisierung aus, einschlielich einer etwaigen Startfunktion. Im Gegensatz dazu kompiliert WebAssembly.compileStreaming() nur; es fhrt das Modul nicht aus und verwendet nicht den ESM-Modulcache.
Im Gegensatz dazu knnen Importattribute die Modulidentitt beeinflussen. Beispielsweise fordern diese beiden Deklarationen auf einem Host, der Textmodule untersttzt, unterschiedliche Modultypen an:
import * as mod from "./module.js";
import text from "./module.js" with { type: "text" };
Die beiden Importe gelten als Importe aus unterschiedlichen Modulen, die zufllig denselben String-Spezifizierer teilen (im Web werden sie mit unterschiedlichen HTTP-Headern angefordert). Die untersttzten Attribute und ihre Auswirkungen auf das Laden und die Modulidentitt werden vom Host definiert.
Angenommen, counter.wasm importiert aus env ein unvernderliches i32-Global namens initial, initialisiert daraus einen internen Zhler und exportiert eine Funktion namens increment. Sie knnen den kompilierten Quellcode mit unterschiedlichen Importen und unabhngigen internen Zhlern wiederverwenden:
import source counterSource from "./counter.wasm";
const first = await WebAssembly.instantiate(counterSource, {
env: { initial: 0 },
});
const second = await WebAssembly.instantiate(counterSource, {
env: { initial: 100 },
});
console.log(first.exports.increment()); // 1
console.log(first.exports.increment()); // 2
console.log(second.exports.increment()); // 101
Jede Instanz hat ihren eigenen internen Zustand, obwohl explizit importierte Speicher, Tabellen oder andere vernderliche Objekte zwischen Instanzen geteilt werden knnen. Sie knnen den kompilierten Quellcode auch an einen Worker senden, um ihn dort zu instanziieren.
Es gibt keine Syntax export source (weitere Informationen finden Sie unter export). Sie knnen einen Modulquellcode importieren und anschlieend seine Bindung exportieren, ohne das Modul zu instanziieren oder auszuwerten:
// -- sources.js --
import source counterSource from "./counter.wasm";
export { counterSource };
// -- main.js --
import { counterSource } from "./sources.js";
const instance = new WebAssembly.Instance(counterSource, {
env: { initial: 0 },
});
| Spezifikation |
|---|
| Source Phase Imports # sec-imports |
Der Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |