JSON in ES-Modulen importieren (ohne Fetch, ohne Bundler)
Wenn Sie jemals versucht haben, import config from './config.json' in einem reinen ES-Modul-Projekt zu verwenden und dabei auf eine Mauer gestoßen sind, sind Sie nicht allein. Jahrelang bedeutete das Importieren von JSON ohne Bundler, auf fetch() zurückzugreifen oder die Daten in eine JavaScript-Datei zu konvertieren. Diese Ära der Workarounds ist vorbei.
Seit 2025 sind Import Attributes browserübergreifend in modernen Browsern verfügbar. Sie können jetzt einen nativen JavaScript-JSON-Modul-Import durchführen, ohne jegliche Build-Tools.
Wichtigste Erkenntnisse
- Verwenden Sie
with { type: 'json' }, um JSON nativ in ES-Modulen zu importieren – ohne Bundler oderfetch(). - Das
type-Attribut ist aus Sicherheitsgründen obligatorisch: Es stellt sicher, dass die Runtime den MIME-Typ validiert, bevor die Datei verarbeitet wird. - JSON-Module stellen nur einen Default-Export bereit. Destrukturieren Sie nach dem Import daraus.
- Ihre JSON-Dateien müssen über HTTP mit dem korrekten
Content-Type: application/json-Header ausgeliefert werden.
Die moderne Syntax: Import Attributes
Die aktuelle Syntax verwendet das with-Schlüsselwort, um den Modultyp zu deklarieren:
// Static import
import config from './config.json' with { type: 'json' }
console.log(config.apiUrl)
Für dynamisches Laden:
// Dynamic import
const { default: config } = await import('./config.json', {
with: { type: 'json' }
})
Hinweis: Die ältere
assert { type: 'json' }-Syntax (unterstützt in Chrome 91–122) ist mittlerweile veraltet. Verwenden Sie immerwith.
Warum das type: 'json'-Attribut erforderlich ist
Das with { type: 'json' }-Attribut ist keine optionale Dekoration. Es erfüllt einen spezifischen Sicherheitszweck: Es zwingt den Browser oder die Runtime, den MIME-Typ der Antwort als application/json zu validieren, bevor irgendetwas verarbeitet wird.
Ohne dieses Attribut könnte ein Server JavaScript zurückgeben, das als JSON-Datei getarnt ist, und die Engine hätte keine Möglichkeit, diese Unterscheidung durchzusetzen. Das Type-Attribut verhindert dies.
JSON-Module haben nur einen Default-Export
Ein Punkt, über den Entwickler stolpern: JSON-Module unterstützen keine Named Exports. Das gesamte JSON-Objekt wird als Default-Export bereitgestellt.
import data from './data.json' with { type: 'json' }
// ✅ Korrekt
const { users, settings } = data
// ❌ Das funktioniert nicht
import { users } from './data.json' with { type: 'json' }
Destrukturieren Sie nach dem Import aus dem Default-Export.
Discover how at OpenReplay.com.
Browser- und Node.js-Unterstützung
| Umgebung | Mindestversion |
|---|---|
| Chrome | 123+ |
| Firefox | 138+ |
| Safari | 17.2+ |
| Node.js | Aktuelle LTS und neuer |
All diese Versionen sind mittlerweile weit verbreitet. Wenn Sie moderne Browser und aktuelle Node.js-Releases anvisieren, benötigen Sie weder einen Bundler noch einen fetch()-Aufruf, um JSON zu laden.
Hinweis: Frühere Node.js-Versionen stellten JSON-Module hinter experimentellen Flags bereit. Die Unterstützung von JSON-Modulen mit Import Attributes ist in aktuellen Node.js-Releases nun stabil. Details zu den genauen Versionen finden Sie in der Node.js ESM-Dokumentation.
Praktische Einschränkungen, die Sie vor dem Deployment kennen sollten
Sie benötigen einen HTTP-Server. Modul-Imports – einschließlich JSON-Module – funktionieren im Allgemeinen nicht, wenn Seiten direkt über file:// geladen werden. Browser wenden strenge Sicherheitsregeln auf das Laden von Modulen an. Verwenden Sie einen lokalen Dev-Server wie Vite, serve oder einen beliebigen Static-File-Server.
Ihre JSON-Datei muss mit dem korrekten MIME-Typ ausgeliefert werden. Der Server muss Content-Type: application/json zurückgeben. Die meisten Static-Server handhaben dies automatisch für .json-Dateien, aber überprüfen Sie dies doppelt, wenn Sie einen benutzerdefinierten Server oder eine CDN-Konfiguration verwenden.
JSON muss valide sein. Es gibt keine Fehlerbehandlung auf Import-Ebene. Ein Syntaxfehler in Ihrer JSON-Datei führt dazu, dass das Modul vollständig nicht geladen werden kann. Validieren Sie Ihr JSON vor dem Deployment.
Ein praxisnahes Beispiel
// config.json
{
"apiUrl": "https://api.example.com",
"timeout": 5000,
"features": {
"darkMode": true
}
}
// app.js
import config from './config.json' with { type: 'json' }
const { apiUrl, timeout, features } = config
if (!apiUrl || typeof timeout !== 'number') {
throw new Error('Invalid configuration')
}
Dieses Muster funktioniert einwandfrei für Konfigurationsdateien, Feature-Flags, i18n-Strings oder beliebige statische strukturierte Daten, die Ihre App beim Start benötigt.
Fazit
Import Attributes bieten Ihnen eine saubere, native Möglichkeit, JSON in ES-Modulen zu importieren – ohne fetch(), ohne Bundler und ohne Workarounds. Die with { type: 'json' }-Syntax wird mittlerweile in modernen Browsern und aktuellen Node.js-Releases umfassend unterstützt. Stellen Sie einfach sicher, dass Ihre Dateien über HTTP mit dem richtigen MIME-Typ ausgeliefert werden, und Sie sind startklar.
FAQs
Ja. Der Import-Attributes-Vorschlag ist so konzipiert, dass er erweiterbar ist. CSS-Modul-Skripte verwenden beispielsweise with type css in unterstützten Browsern. JSON ist jedoch der heute am weitesten unterstützte Typ. Andere Typen hängen von der Runtime ab und sind möglicherweise noch nicht überall verfügbar.
Der Import schlägt vollständig fehl und wirft einen SyntaxError. Anders als bei fetch, wo Sie die rohe Antwort abfangen und inspizieren können, bietet ein JSON-Modul-Import keine teilweise Wiederherstellung. Validieren Sie Ihre JSON-Dateien mit einem Linter oder einem CI-Check vor dem Deployment, um stille Fehler beim Laden zu vermeiden.
Nicht für den JSON-Import selbst. Moderne Browser und Node.js handhaben dies nativ. Sie möchten jedoch möglicherweise aus anderen Gründen noch einen Bundler verwenden, wie Code-Splitting, Tree-Shaking oder Transpilierung der Syntax für ältere Zielplattformen. Der Punkt ist, dass das Laden von JSON allein keinen Bundler mehr erfordert.
Browser setzen strenge Sicherheitsregeln beim Laden von Modulen durch. Das file-Protokoll unterstützt nicht die Mechanismen, die für Modul-Requests erforderlich sind, sodass der Browser den Import blockiert. Sie müssen Ihre Dateien über einen HTTP-Server ausliefern, auch lokal. Tools wie Vite oder das serve-npm-Paket handhaben dies mit minimalem Setup.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Check our GitHub repo and join the thousands of developers in our community.