import.meta
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Januar 2020 browserübergreifend verfügbar.
Die Meta-Eigenschaft import.meta stellt einem JavaScript-Modul kontextspezifische Metadaten zur Verfügung. Sie enthält Informationen über das Modul, beispielsweise dessen URL.
Syntax
import.meta
Wert
Das Objekt import.meta wird von der Host-Umgebung als erweiterbares Objekt mit null-Prototyp erstellt. Alle seine Eigenschaften sind beschreibbar, konfigurierbar und aufzählbar. Die Spezifikation legt keine Eigenschaften fest, die darauf definiert sein müssen. Host-Umgebungen implementieren jedoch üblicherweise die folgenden Eigenschaften:
url-
Die vollständige URL des Moduls, einschließlich Abfrageparametern und/oder Fragmentbezeichner (nach
?beziehungsweise#). In Browsern ist dies entweder die URL, von der das Skript geladen wurde (bei externen Skripten), oder die Basis-URL des Dokuments zum Zeitpunkt der Erstellung des Modulskripts (bei Inline-Skripten). In Node.js verwenden dateibasierte Module einefile:-URL; Module, die über andere unterstützte URL-Schemata geladen werden, verwenden die entsprechenden URLs. resolve-
Löst einen Modulbezeichner zu einer URL auf, wobei die URL des aktuellen Moduls als Basis dient.
Beschreibung
Die Syntax von import.meta besteht aus dem Schlüsselwort import, einem Punkt und dem Bezeichner meta. Da import ein reserviertes Wort und kein Bezeichner ist, handelt es sich nicht um einen Eigenschaftszugriff, sondern um eine besondere Ausdruckssyntax.
Die Meta-Eigenschaft import.meta ist in JavaScript-Modulen verfügbar. Die Verwendung von import.meta außerhalb eines Moduls ist ein Syntaxfehler. Das gilt auch für direktes eval() innerhalb eines Moduls.
Beispiele
>Abfrageparameter übergeben
Mit Abfrageparametern im import-Modulbezeichner können Sie modulspezifische Argumente übergeben. Dies kann das Auslesen von Parametern aus dem anwendungsweiten window.location beziehungsweise in Node.js aus process.argv ergänzen. Betrachten Sie beispielsweise das folgende HTML:
<script type="module">
import "./index.mjs?someURLInfo=5";
</script>
Das Modul index.mjs kann den Parameter someURLInfo über import.meta abrufen:
// -- index.mjs --
new URL(import.meta.url).searchParams.get("someURLInfo"); // 5
Dasselbe gilt, wenn ein Modul ein anderes importiert:
// -- index.mjs --
import "./index2.mjs?someURLInfo=5";
// -- index2.mjs --
new URL(import.meta.url).searchParams.get("someURLInfo"); // 5
Die ES-Modulimplementierung in Node.js unterstützt die Auflösung von Modulbezeichnern, die Abfrageparameter oder einen Fragmentbezeichner enthalten, wie im letzten Beispiel. Sie können jedoch keine Abfrageparameter oder Fragmentbezeichner verwenden, wenn Sie das Modul über einen CLI-Befehl angeben (etwa node index.mjs?someURLInfo=5). Der CLI-Einstiegspunkt verwendet nämlich einen Auflösungsmodus, der eher CommonJS entspricht: Er behandelt den Pfad als Dateipfad statt als URL. Um Parameter an das Einstiegsmodul zu übergeben, verwenden Sie stattdessen CLI-Argumente und lesen Sie diese über process.argv aus (etwa node index.mjs --someURLInfo=5).
Eine Datei relativ zur aktuellen Datei auflösen
In CommonJS-Modulen von Node.js enthält die Variable __dirname den absoluten Pfad zum Verzeichnis des aktuellen Moduls. Dies ist hilfreich, um relative Pfade aufzulösen. Node.js stellt diese Variable in ES-Modulen jedoch nicht bereit. Um eine relative Datei aufzulösen, können Sie import.meta.url verwenden. Beachten Sie, dass dabei URLs statt Dateisystempfaden verwendet werden.
Vorher (CommonJS):
const fs = require("fs/promises");
const path = require("path");
const filePath = path.join(__dirname, "someFile.txt");
fs.readFile(filePath, "utf8").then(console.log);
Nachher (ES-Module):
import fs from "node:fs/promises";
const fileURL = new URL("./someFile.txt", import.meta.url);
fs.readFile(fileURL, "utf8").then(console.log);
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # prod-ImportMeta> |