Stellen Sie Ihre Frage und erhalten Sie einen Resümee des Dokuments, indem Sie diese Seite und den AI-Anbieter Ihrer Wahl referenzieren
Versionshistorie
- "`purge` und `minify` funktionieren jetzt in Next.js über `@intlayer/swc` — kein `babel.config.js` erforderlich"v9.2.19.8.2026
- "Babel-Plugins in den Referenztabellen in der erforderlichen Pipeline-Reihenfolge auflisten (extract → purge → minify → optimize)"v8.12.024.6.2026
- "Hinzufügen von `intlayerPurgeBabelPlugin` und `intlayerMinifyBabelPlugin` für Babel/Webpack; Klarstellung der Plugin-Pipeline"v8.12.07.6.2026
- "Hinzufügen der Optionen `minify` und `purge` zur Build-Konfiguration"v8.7.08.4.2026
Der Inhalt dieser Seite wurde mit einer KI übersetzt.
Den englischen Originaltext ansehenWenn Sie eine Idee haben, um diese Dokumentation zu verbessern, zögern Sie bitte nicht, durch das Einreichen eines Pull-Requests auf GitHub beizutragen.
GitHub-Link zur DokumentationMarkdown des Dokuments in die Zwischenablage kopieren
Optimierung der i18n-Bundle-Größe & Leistung
Eine der häufigsten Herausforderungen bei traditionellen i18n-Lösungen, die auf JSON-Dateien basieren, ist die Verwaltung der Inhaltsgröße. Wenn Entwickler den Inhalt nicht manuell in Namespaces trennen, laden Benutzer oft Übersetzungen für jede Seite und möglicherweise jede Sprache herunter, nur um eine einzige Seite anzuzeigen.
Beispielsweise könnte eine Anwendung mit 10 Seiten, die in 10 Sprachen übersetzt sind, dazu führen, dass ein Benutzer den Inhalt von 100 Seiten herunterlädt, obwohl er nur eine (die aktuelle Seite in der aktuellen Sprache) benötigt. Dies führt zu verschwendeter Bandbreite und langsameren Ladezeiten.
Intlayer löst dieses Problem durch Optimierung zur Build-Zeit. Es analysiert Ihren Code, um zu erkennen, welche Wörterbücher pro Komponente tatsächlich verwendet werden, und fügt nur den notwendigen Inhalt in Ihr Bundle ein.
Inhaltsverzeichnis
Analysieren Sie Ihr Bundle
Die Analyse Ihres Bundles ist der erste Schritt zur Identifizierung "schwerer" JSON-Dateien und Möglichkeiten zum Code-Splitting. Diese Tools generieren eine visuelle Treemap des kompilierten Codes Ihrer Anwendung, sodass Sie genau sehen können, welche Bibliotheken den meisten Platz beanspruchen.
Vite / Rollup
Vite verwendet Rollup im Hintergrund. Das Plugin rollup-plugin-visualizer generiert eine interaktive HTML-Datei, die die Größe jedes Moduls in Ihrem Diagramm anzeigt.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Next.js (Turbopack)
Für Projekte, die den App Router und Turbopack verwenden, bietet Next.js einen integrierten experimentellen Analyzer, der keine zusätzlichen Abhängigkeiten erfordert.
Kopieren Sie den Code in die Zwischenablage
Next.js (Webpack)
Wenn Sie den Standard-Webpack-Bundler in Next.js verwenden, verwenden Sie den offiziellen Bundle-Analyzer. Lösen Sie ihn aus, indem Sie während Ihres Builds eine Umgebungsvariable festlegen.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Verwendung:
Kopieren Sie den Code in die Zwischenablage
Standard Webpack
Verwenden Sie für Create React App (ejected), Angular oder benutzerdefinierte Webpack-Setups den branchenüblichen webpack-bundle-analyzer.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Wie es funktioniert
Intlayer verwendet einen pro-Komponente-Ansatz. Im Gegensatz zu globalen JSON-Dateien wird Ihr Inhalt neben oder in Ihren Komponenten definiert. Während des Build-Prozesses führt Intlayer Folgendes aus:
- Analysiert Ihren Code, um
useIntlayer-Aufrufe zu finden. - Baut den entsprechenden Wörterbuchinhalt auf.
- Ersetzt den
useIntlayer-Aufruf durch optimierten Code basierend auf Ihrer Konfiguration.
Dies stellt sicher, dass:
- Wenn eine Komponente nicht importiert wird, deren Inhalt nicht im Bundle enthalten ist (Dead Code Elimination).
- Wenn eine Komponente verzögert geladen wird (lazy loaded), ihr Inhalt ebenfalls verzögert geladen wird.
Plugin-Referenz
Die Build-Optimierung von Intlayer ist auf mehrere diskrete Plugins aufgeteilt, von denen jedes eine einzige Aufgabe hat. Zu verstehen, was jedes Plugin tut, verhindert Verwirrung beim Einrichten.
Babel Plugins (@intlayer/babel)
Diese werden direkt in der babel.config.js für Webpack-basierte Setups verwendet (Next.js mit Babel, CRA, benutzerdefiniertes Webpack usw.).
Die folgende Tabelle listet sie in der erforderlichen Pipeline-Reihenfolge auf (dieselbe Reihenfolge, in der sie in babel.config.js erscheinen müssen):
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Plugin | Was es tut |
|---|---|
intlayerExtractBabelPlugin | Scannt .content.ts-Dateien und schreibt kompilierte Wörterbücher nach .intlayer/ |
intlayerPurgeBabelPlugin | Scannt alle Quelldateien und entfernt nicht verwendete Inhaltsfelder aus den kompilierten .intlayer/**/*.json-Dateien |
intlayerMinifyBabelPlugin | Benennt Inhaltsfeld-Schlüssel um in kurze alphabetische Aliase (title → a) in JSON-Dateien und im Quellcode |
intlayerOptimizeBabelPlugin | Schreibt useIntlayer('key') → useDictionary(hash) um und fügt den passenden import des Wörterbuchs ein |
Die Reihenfolge der Plugins ist wichtig. In Ihrerbabel.config.jsmüssen das Purge- und Minify-Plugin vor dem Optimize-Plugin aufgeführt sein. Der Optimize-Pass ersetztuseIntlayer('key')durch einen undurchsichtigenuseDictionary(hash)-Aufruf, wodurch die Information über den Wörterbuchschlüssel gelöscht wird, die der Purge- und Minify-Pass benötigen, um zu identifizieren, welche Felder verwendet werden.
Jedes Babel-Plugin verfügt über einen entsprechenden Options-Helfer, der Ihre intlayer.config.ts einmal zur Konfigurationsladezeit liest und vorab aufgelöste Werte zurückgibt:
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Options-Helfer | Verwendet mit |
|---|---|
getExtractPluginOptions() | intlayerExtractBabelPlugin |
getPurgePluginOptions() | intlayerPurgeBabelPlugin |
getMinifyPluginOptions() | intlayerMinifyBabelPlugin |
getOptimizePluginOptions() | intlayerOptimizeBabelPlugin |
Vite Plugins (vite-intlayer)
Vite-Benutzer konfigurieren diese nie direkt. Sie werden automatisch eingerichtet, wenn Sie withIntlayer() in der vite.config.ts aufrufen. Die Flags build.purge und build.minify in der intlayer.config.ts schalten das entsprechende Verhalten ohne zusätzliche Plugin-Registrierung um.
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Internes Vite Plugin | Äquivalentes Verhalten |
|---|---|
| Usage analyzer | Gleich wie die Analysephase des intlayerPurgeBabelPlugin |
| Dictionary prune | Gleich wie die JSON-Schreibphase des intlayerPurgeBabelPlugin |
| Dictionary minify | Gleich wie die JSON-Schreibphase des intlayerMinifyBabelPlugin |
| Babel transform | Gleich wie die Quellcode-Umbenennung des intlayerMinifyBabelPlugin + intlayerOptimizeBabelPlugin |
SWC-Plugin (@intlayer/swc)
Auch Next.js-Nutzer konfigurieren diese nie direkt. Seit v9.2.1 führt withIntlayer() in next.config.ts die vollständige Pipeline aus — Purge, Minify und Import-Umschreibung — allein anhand der Flags build.purge und build.minify.
Die Arbeit ist zweigeteilt, denn ein SWC-Wasm-Plugin transformiert jeweils nur eine Datei und hat keinen Dateisystemzugriff:
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Durchlauf | Wo er läuft | Was er tut |
|---|---|---|
| Nutzungsanalyse + JSON-Purge/Minify | Node, innerhalb von withIntlayer() | Liest jede Komponenten-Quelldatei, schreibt .intlayer/**/*.json neu, erzeugt die Umbenennungstabellen |
Quellcode-Umschreibung (content.title → .a) | @intlayer/swc (Wasm) | Wendet die Umbenennungstabellen auf die passenden Eigenschaftszugriffe in Ihrem Code an |
Import-Umschreibung (useIntlayer → dict) | @intlayer/swc (Wasm) | Wie intlayerOptimizeBabelPlugin |
Zu entscheiden, welche Felder ungenutzt sind und welchen Alias jedes erhält, erfordert dateiübergreifenden Zustand und Datei-I/O; diese Hälfte läuft daher in Node, und das SWC-Plugin erhält nur die resultierenden Tabellen.
Setup nach Plattform
Next.js
Next.js benötigt das @intlayer/swc-Plugin, da Next.js SWC für Builds verwendet. Seit v9.2.1 deckt dieses eine Paket die gesamte Pipeline ab — Optimierung (Import-Umschreibung), Purge und Minify.
Dieses Plugin ist nicht standardmäßig installiert, da SWC-Plugins für Next.js noch experimentell sind. Dies kann sich in Zukunft ändern.
Next.js 16.1.0 ist die Mindestversion. Es ist die erste Version, die auf SWCs vorwärtskompatibler Wasm-Plugin-ABI aufbaut; frühere Versionen weisen das Plugin ab. withIntlayer liest Ihre Next.js-Version und registriert das Plugin unterhalb von 16.1.0 einfach nicht — diese Builds sind weiterhin erfolgreich, sie laufen nur ohne Bundle-Optimierung.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Nach der Installation erkennt Intlayer das Plugin automatisch und verwendet es.
Die Purge- und Minify-Durchläufe (Feldentfernung und Feldumbenennung) benötigen kein zusätzliches Paket und kein babel.config.js. Umschließen Sie Ihre Konfiguration mit withIntlayer und schalten Sie die Flags in intlayer.config.ts um:
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Während next build analysiert withIntlayer Ihre Quellen, schreibt die kompilierten Wörterbücher neu und übergibt die resultierenden Feldumbenennungstabellen an @intlayer/swc, das die passenden Eigenschaftszugriffe in Ihrem Code aktualisiert.
Verwenden Sie das asynchronewithIntlayer, nichtwithIntlayerSync. Die synchrone Variante führt die Analyse-Pipeline nicht aus, sodass Purge und Minify damit keine Wirkung haben.
Purge und Minify laufen nur beinext build— die Optimierungs-Pipeline ist währendnext devdeaktiviert.
Sie sind außerdem deaktiviert, wenn Kompatibilitäts-Adapter-Aufrufer konfiguriert sind (swcExtraCallers, gesetzt von den Kompatibilitätspaketen wie@intlayer/next-intloder@intlayer/react-i18next): Diese Aufrufstellen sind für den Nutzungsanalysator unsichtbar, sodass Purge Felder entfernen würde, die der Code noch liest. Die Import-Umschreibung bleibt aktiv.
Frühere Versionen (vor 9.2.1) benötigten @intlayer/babel und eine babel.config.js, die intlayerPurgeBabelPlugin und intlayerMinifyBabelPlugin deklariert. Diese Datei wird nicht mehr benötigt und kann gelöscht werden.
Vite
Vite verwendet das Plugin @intlayer/babel, das als Abhängigkeit von vite-intlayer enthalten ist. Die gesamte Optimierungspipeline — Importumschreibung, Purge und Minify — ist standardmäßig aktiviert und erfordert keine zusätzliche Plugin-Registrierung.
Aktivieren Sie Purge und Minify, indem Sie die entsprechenden Flags in intlayer.config.ts festlegen:
Kopieren Sie den Code in die Zwischenablage
Webpack (und Next.js mit Babel)
Installieren Sie @intlayer/babel:
Kopieren Sie den Code in die Zwischenablage
Fügen Sie alle vier Plugins in der richtigen Reihenfolge zur babel.config.js hinzu:
Kopieren Sie den Code in die Zwischenablage
Konfiguration
Sie können steuern, wie Intlayer Ihr Bundle optimiert, über die Eigenschaft build in Ihrer intlayer.config.ts.
Kopieren Sie den Code in die Zwischenablage
Es wird empfohlen, in den meisten Fällen den Standardwert (undefined) füroptimizebeizubehalten.
Siehe die Konferenzreferenz für alle Optionen: Konfiguration
Build-Optionen
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
optimize | boolean / undefined | undefined | Aktiviert den Import-Umschreibungspass. undefined = nur in Produktionsbuilds aktiv. false deaktiviert auch Purge und Minify. |
minify | boolean | false | Benennt Inhaltsfeld-Schlüssel in kompilierten JSON-Dateien in kurze alphabetische Aliase um. Schreibt auch entsprechende Eigenschaftszugriffe im Quellcode um. Hat keine Auswirkungen, wenn optimize auf false gesetzt ist. |
purge | boolean | false | Entfernt Inhaltsfelder, auf die nie statisch im Quellcode zugegriffen wird, aus den kompilierten JSON-Dateien. Hat keine Auswirkungen, wenn optimize auf false gesetzt ist. |
Minifizierung (Feld-Schlüssel-Umbennung)
build.minify verkleinert nicht Ihr JavaScript-Bundle — das erledigt Ihr Bundler. Stattdessen schrumpft es die kompilierten Wörterbuch-JSON-Dateien, indem jeder benutzerdefinierte Inhaltsfeld-Schlüssel durch einen kurzen alphabetischen Alias ersetzt wird:
Kopieren Sie den Code in die Zwischenablage
Dieselbe Umbenennung wird auf alle Eigenschaftszugriffe in Ihrem Quellcode angewendet, sodass content.title in der kompilierten Ausgabe zu content.a wird. Das Verhalten zur Laufzeit bleibt identisch.
Kopieren Sie den Code in die Zwischenablage
Die Minifizierung wird übersprungen, wennoptimizeauffalsegesetzt ist. Wenneditor.enabledauftruesteht, läuft sie weiterhin, jedoch ohne den Schritt zur Feldumbenennung — der visuelle Editor löst Bearbeitungen überkeyPathauf, daher müssen die ursprünglichen Feldnamen erhalten bleiben.
Unter Next.js wird die Minifizierung außerdem übersprungen, wenn @intlayer/swc nicht installiert ist oder nicht geladen werden kann (Next.js unterhalb von 16.1.0). Das Plugin ist die Hälfte, die die Quellcode-Zugriffe umschreibt; die Wörterbücher ohne es umzubenennen, würde Ihren Code Feldnamen lesen lassen, die es nicht mehr gibt.
Die Minifizierung wird ebenfalls für Wörterbücher übersprungen, die über importMode: 'fetch' geladen werden, da deren JSON von einer Remote-API mit den ursprünglichen Feldnamen bereitgestellt wird — das Umbenennen der clientseitigen Schlüssel würde den Server/Client-Vertrag brechen.
Purging (Entfernen ungenutzter Felder)
build.purge analysiert, auf welche Inhaltsfelder in Ihrem Quellcode tatsächlich zugegriffen wird, und entfernt alle anderen aus den kompilierten JSON-Dateien.
Kopieren Sie den Code in die Zwischenablage
Beispiel: Ein Wörterbuch mit fünf Feldern, von denen nur zwei verwendet werden:
Kopieren Sie den Code in die Zwischenablage
Der Purge wird übersprungen, wennoptimizeauffalsegesetzt ist. Er bleibt aktiv, wenneditor.enabledauftruesteht — ein bereinigtes Feld wird von keiner Komponente gelesen, daher rendert der Editor es nie. Unter Next.js wird er zusätzlich übersprungen, wenn@intlayer/swcnicht verfügbar ist und wenn Kompatibilitäts-Adapter-Aufrufer konfiguriert sind.
Der Purge wird auch konservativ übersprungen, wenn eine Quelldatei nicht analysiert werden kann, oder wenn das Ergebnis von useIntlayer einer Variablen zugewiesen und auf eine Weise weitergegeben wird, die der statische Analysator nicht verfolgen kann (z.B. in ein Objekt eingefügt oder als Prop ohne Destrukturierung übergeben). In diesen Fällen wird das gesamte Wörterbuch beibehalten.
Import-Modus
Für große Anwendungen, die mehrere Seiten und Sprachen umfassen, kann das JSON einen erheblichen Teil der Größe Ihres Bundles ausmachen. Intlayer ermöglicht es Ihnen zu steuern, wie Wörterbücher mit der importMode-Option geladen werden.
Globale Definition
Der Import-Modus kann global in Ihrer intlayer.config.ts-Datei definiert werden.
Kopieren Sie den Code in die Zwischenablage
Pro-Wörterbuch-Definition
Sie können den Import-Modus für einzelne Wörterbücher in deren .content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5|md|mdx|yaml|yml}}-Dateien überschreiben.
Kopieren Sie den Code in die Zwischenablage
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
importMode | 'static', 'dynamic', 'fetch' | 'static' | Veraltet: Verwenden Sie stattdessen dictionary.importMode. Legt fest, wie Wörterbücher geladen werden (siehe unten). |
Die Einstellung importMode bestimmt, wie der Wörterbuchinhalt in Ihre Komponente eingefügt wird. Sie können dies global in der intlayer.config.ts unter dem Objekt dictionary definieren oder für jedes Wörterbuch einzeln in dessen .content.ts-Datei überschreiben.
1. Statischer Modus (default)
Im statischen Modus ersetzt Intlayer useIntlayer durch useDictionary und injiziert das Wörterbuch direkt ins JavaScript-Bundle.
- Vorteile: Sofortiges Rendering (synchron), keine zusätzlichen Netzwerkanfragen während der Hydratation.
- Nachteile: Das Bundle enthält Übersetzungen für alle verfügbaren Sprachen für diese spezifische Komponente.
- Am besten für: Single Page Applications (SPA).
Beispiel für transformierten Code:
Kopieren Sie den Code in die Zwischenablage
2. Dynamischer Modus
Im dynamischen Modus ersetzt Intlayer useIntlayer durch useDictionaryAsync. Dies verwendet import() (ähnlich dem Suspense-Mechanismus), um spezifisch das JSON für die aktuelle Sprache verzögert zu laden.
- Vorteile: Tree Shaking auf Länderebene. Ein Benutzer, der die englische Version ansieht, wird nur das englische Wörterbuch herunterladen. Das deutsche Wörterbuch wird nie geladen.
- Nachteile: Löst eine Netzwerkanfrage (Asset-Abruf) pro Komponente während der Hydratation aus.
- Am besten für: Große Textblöcke, Artikel oder Anwendungen, die viele Sprachen unterstützen, bei denen die Bundle-Größe entscheidend ist.
Beispiel für transformierten Code:
Kopieren Sie den Code in die Zwischenablage
Wenn SieimportMode: 'dynamic'verwenden und auf einer einzigen Seite 100 Komponenten haben, dieuseIntlayeraufrufen, versucht der Browser, 100 separate Abrufe durchzuführen. Um diese "Wasserfall"-Anfragen zu vermeiden, gruppieren Sie Inhalte in weniger.content-Dateien (z.B. ein Wörterbuch pro Seitenabschnitt) anstatt in eines pro Atom-Komponente. Sie können auch mehrere.content-Dateien mit demselben Schlüssel verwenden. Intlayer wird sie dann zu einem einzigen Wörterbuch zusammenführen.
3. Fetch-Modus
Verhält sich ähnlich wie der dynamische Modus, versucht jedoch zuerst, Wörterbücher von der Intlayer Live Sync API abzurufen. Wenn der API-Aufruf fehlschlägt oder der Inhalt nicht für Live-Updates markiert ist, wird auf den dynamischen Import zurückgegriffen.
Beispiel für transformierten Code:
Kopieren Sie den Code in die Zwischenablage
Weitere Details finden Sie in der CMS-Dokumentation: CMS
Im Fetch-Modus werden Purge und Minifizierung nicht angewendet, da das JSON von einer Remote-API mit den ursprünglichen Feldnamen bereitgestellt wird.
Zusammenfassung: Statisch vs Dynamisch
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Feature | Statischer Modus | Dynamischer Modus |
|---|---|---|
| JS Bundle-Größe | Größer (enthält alle Sprachen für die Komponente) | Kleinstmöglich (nur Code, kein Inhalt) |
| Initiales Laden | Sofortig (Inhalt ist im Bundle) | Leichte Verzögerung (lädt JSON) |
| Netzwerkanfragen | 0 zusätzliche Anfragen | 1 Anfrage pro Wörterbuch-Schlüssel |
| Tree Shaking | Auf Komponentenebene | Auf Komponenten- + Länderebene |
| Bester Anwendungsfall | UI-Komponenten, Kleine Apps | Textreiche Seiten, Viele Sprachen |
