Importattribute
Baseline
2025
*
Newly available
Since April 2025, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
* Some parts of this feature may have varying levels of support.
Hinweis:
Eine frühere Version dieses Vorschlags verwendete das Schlüsselwort assert anstelle von with. Die Assertionsfunktion ist jetzt nicht standardisiert. Überprüfen Sie die Browser-Kompatibilitätstabelle für Details.
Das Importattribute-Feature weist die Laufzeit an, wie ein Modul geladen werden soll, einschließlich des Verhaltens bei der Modulauflösung, beim Abrufen, Parsen und Bewerten. Es wird in import-Deklarationen, export...from-Deklarationen und dem dynamischen import() unterstützt.
Attribute können an jede Art von import/export from-Anweisung angehängt werden, einschließlich Standardimport, Namespace-Import usw. Sie folgen der Modulspezifikationszeichenkette und beginnen mit dem Schlüsselwort with. Bei Verwendung mit import() werden die Attribute im options-Parameter als with-Eigenschaft angegeben.
Syntax
import { names } from "module-name" with {};
import { names } from "module-name" with { key: "data" };
import { names } from "module-name" with { key: "data", key2: "data2" };
import { names } from "module-name" with { key: "data", key2: "data2", /* …, */ keyN: "dataN" };
export { names } from "module-name" with {};
export { names } from "module-name" with { key: "data" };
export { names } from "module-name" with { key: "data", key2: "data2" };
export { names } from "module-name" with { key: "data", key2: "data2", /* …, */ keyN: "dataN" };
Parameter
Beschreibung
Importattribute geben der Laufzeit vor, wie ein bestimmtes Modul geladen werden soll.
Der Hauptanwendungsfall ist das Laden von Nicht-JS-Modulen wie JSON-Modulen und CSS-Modulen. Betrachten Sie die folgende Anweisung:
import data from "https://example.com/data.json";
Im Web führt jede Importanweisung zu einer HTTP-Anfrage. Die Antwort wird dann in einen JavaScript-Wert vorbereitet und der Laufzeit zur Verfügung gestellt. Beispielsweise könnte die Antwort so aussehen:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
...
{"name":"Maria"}
Module werden nur basierend auf ihrem bereitgestellten MIME-Typ identifiziert und geparst - die Dateierweiterung in der URL kann nicht zur Identifizierung des Datei-Typs verwendet werden. In diesem Fall ist der MIME-Typ application/json, was dem Browser mitteilt, dass die Datei JSON ist und als JSON geparst werden muss. Wenn aus irgendeinem Grund (z.B. der Server wurde kompromittiert oder ist fehlerhaft) der MIME-Typ in der Serverantwort auf text/javascript (für JavaScript-Quellcode) gesetzt ist, wird die Datei als Code geparst und ausgeführt. Wenn die "JSON"-Datei tatsächlich bösartigen Code enthält, würde die import-Deklaration unbeabsichtigt externen Code ausführen, was ein ernstes Sicherheitsrisiko darstellt.
Importattribute beheben dieses Problem, indem sie dem Autor ermöglichen, explizit anzugeben, wie ein Modul validiert werden soll. Beispielsweise würde die oben stehende Importanweisung, die ein Attribut fehlt, tatsächlich fehlschlagen:
Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "application/json". Strict MIME type checking is enforced for module scripts per HTML spec.
Stattdessen müssen Sie ein Attribut angeben, um der Laufzeit mitzuteilen, dass diese Datei JSON enthalten muss. Zur Validierung des Modultyps (über den MIME-Typ) verwenden Sie den Attributschlüssel type. Um zu validieren, dass das Modul ein JSON-Modul ist, ist der Wert "json".
Hinweis:
Der tatsächliche Wert des type-Attributs stimmt nicht direkt mit dem MIME-Typ überein. Es wird separat durch die HTML-Spezifikation festgelegt.
Daher sollte der obige Code neu geschrieben werden als:
import data from "https://example.com/data.json" with { type: "json" };
Das type-Attribut ändert, wie das Modul abgerufen wird (der Browser sendet die Anfrage mit dem -Header), ändert jedoch nicht, wie das Modul geparst oder ausgewertet wird. Die Laufzeit weiß bereits, dass das Modul als JSON geparst werden muss, gemäß dem MIME-Typ der Antwort. Sie verwendet das Attribut nur zur nachträglichen Überprüfung, dass das Accept: application/jsondata.json-Modul tatsächlich ein JSON-Modul ist. Beispielweise, wenn der Antwortheader zu Content-Type: text/javascript geändert wird, wird das Programm mit einem ähnlichen Fehler wie oben fehlschlagen.
Die Spezifikation ruft explizit type: "json" auf, um unterstützt zu werden — wenn ein Modul als type: "json" deklariert wird und die Laufzeit diesen Import nicht fehlschlagen lässt, dann muss es als JSON geparst werden. Es gibt jedoch keine anderen Verhaltensanforderungen: für Importe ohne ein type: "json"-Attribut, kann die Laufzeit es trotzdem als JSON parsen, wenn Sicherheit in dieser Umgebung kein Problem darstellt. Browser hingegen nehmen implizit an, dass das Modul JavaScript ist und schlagen fehl, wenn das Modul nicht JavaScript ist (z.B. JSON). Dies stellt sicher, dass Modultypen immer streng validiert werden und verhindert Sicherheitsrisiken. In der Praxis passen sich Nicht-Browser-Laufzeiten wie Node und Deno den Browser-Semantiken an und erzwingen das type für JSON-Module.
Das type-Attribut unterstützt auch andere Modultypen. Beispielsweise definiert die HTML-Spezifikation auch den css-Typ, der ein CSSStyleSheet-Objekt importiert:
import styles from "https://example.com/styles.css" with { type: "css" };
Die Syntax für Attribute ist so gestaltet, dass sie erweiterbar ist — obwohl nur type von der Sprache spezifiziert ist, kann die Laufzeit andere Attribute lesen und verarbeiten. Ein Attribut kann das Verhalten der Laufzeit in jeder Phase des Modulladungsprozesses ändern:
-
Auflösung: Das Attribut ist Teil des Modulspezifikators (der Zeichenkette in der
from-Klausel). Daher können bei gleicher Zeichenkettenpfad durch unterschiedliche Attribute völlig unterschiedliche Module geladen werden. Beispielsweise unterstützt TypeScript dasresolution-mode-Attribut.tsimport type { TypeFromRequire } from "pkg" with { "resolution-mode": "require", }; -
Abrufen: Beispielsweise werden CSS-Module mit dem
destinationauf"style"gesetzt, und JSON-Module werden mitdestination: "json"abgerufen. Dies bedeutet, dass der Server bei gleicher Ziel-URL immer noch unterschiedlichen Inhalt zurückgeben kann. -
Parsen und Bewertung: Die Laufzeit kann das Attribut verwenden, um zu bestimmen, wie das Modul geparst und bewertet werden soll.
Sie können jedoch keine unbekannten Attribute verwenden — die Laufzeit wirft einen Fehler, wenn sie auf ein unbekanntes Attribut stößt.
Beispiele
Importieren von JSON-Modulen mit dem type-Attribut
In data.json:
{
"name": "Shilpa"
}
In index.html:
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<script type="module">
import data from "./data.json" with { type: "json" };
const p = document.createElement("p");
p.textContent = `name: ${data.name}`;
document.body.appendChild(p);
</script>
</head>
<body></body>
</html>
Starten Sie einen lokalen HTTP-Server (siehe Fehlerbehebung) und gehen Sie zur index.html-Seite. Sie sollten Shilpa auf der Seite sehen.
Hinweis:
JSON-Module haben nur einen Standardexport. Sie können keine benannten Importe von ihnen machen (wie import { name } from "data.json").
Verwendung von Importattributen mit dynamischen Importen
Importattribute werden auch als zweiter Parameter der import()-Syntax akzeptiert.
const data = await import("./data.json", {
with: { type: "json" },
});
Beachten Sie, dass dynamische Importe, wie statische Importe, für die Lebensdauer der Umgebung (z.B. eine Seite oder ein Worker) zwischengespeichert werden. Wenn Sie erwarten, dass sich diese Daten ändern (wie die neuesten Nachrichten oder die Credits eines Benutzers), verwenden Sie stattdessen die Fetch API.
Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification # prod-WithClause |