Strona głównaPiaskownicaPrezentacjaAplikacjaDokumentacjaBlog
    • Englishangielski
      EN
    • русскийrosyjski
      RU
    • 日本語japoński
      JA
    • françaisfrancuski
      FR
    • 한국어koreański
      KO
    • 中文chiński
      ZH
    • españolhiszpański
      ES
    • Deutschniemiecki
      DE
    • العربيةarabski
      AR
    • italianowłoski
      IT
    • British Englishangielski brytyjski
      EN-GB
    • portuguêsportugalski
      PT
    • हिन्दीhindi
      HI
    • Türkçeturecki
      TR
    • polskipolski
      PL
    • Indonesiaindonezyjski
      ID
    • Tiếng Việtwietnamski
      VI
    • українськаukraiński
      UK
    /
    Filtruj dokumenty według frameworka
    Alt+←
    Dlaczego Intlayer?
    Zacząć
    Koncepcja
    • Jak działa Intlayer
    • Konfiguracja
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Edytor wizualny
    • CMS
    • Integracja CI/CD
    • TłumaczenieLiczba mnogaWyliczenieWarunekPłećWstawieniePlikZagnieżdżanieMarkdownHTMLPobieranie funkcji
    • Plik dla każdej lokalizacji
    • Kompilator
    • Automatyczne wypełnianie
    • Testowanie
    • Optymalizacja pakietu
    Środowisko
    • Next.js 14 i App Router
      Next.js 15
      Next.js bez locale URL
      Next.js dan Page Router
      Kompilator
    • Tanstack Start Solid
    • Astro dan React
      Astro dan Svelte
      Astro dan Vue
      Astro dan Solid
      Astro dan Preact
      Astro dan Lit
      Astro dan Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt dan Vue
    • Vite dan Solid
    • SvelteKit
    • Vite dan Preact
    • Vite dan Vanilla JS
    • Vite dan Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native dan Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx dan React
    Plugins
    • JSON
    • gettext (.po)
    Rozszerzenie VS Code
    Agent
    • Serwer MCP
    • Umiejętności agenta
    Wersje
    • v8
    • v7
    • v6
    Benchmark
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Blog
    Zadaj pytanie
    1. Documentation
    2. Koncepcja
    3. Bundle optimization
    Data utworzenia:2025-11-25Ostatnia aktualizacja:2026-04-08
    Prześlij ten dokument do swojego ulubionego asystenta AI
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI

    Historia wersji

    1. "Dodano opcje `minify` i `purge` do konfiguracji builda"
      v8.7.08.04.2026

    Treść tej strony została przetłumaczona przy użyciu sztucznej inteligencji.

    Zobacz ostatnią wersję oryginalnej treści w języku angielskim
    Edytuj tę dokumentację

    Jeśli masz pomysł na ulepszenie tej dokumentacji, zachęcamy do przesłania pull requesta na GitHubie.

    Link do dokumentacji na GitHubie
    Kopiuj

    Kopiuj dokument Markdown do schowka

    Optymalizacja rozmiaru i wydajności bundle'a i18n

    Jednym z najczęstszych wyzwań w tradycyjnych rozwiązaniach i18n opartych na plikach JSON jest zarządzanie rozmiarem treści. Jeśli programiści nie rozdzielą ręcznie treści na przestrzenie nazw (namespaces), użytkownicy często pobierają tłumaczenia dla każdej strony, a potencjalnie dla każdego języka, tylko po to, by wyświetlić jedną stronę.

    Na przykład aplikacja z 10 stronami przetłumaczonymi na 10 języków może spowodować, że użytkownik pobierze treść 100 stron, mimo że potrzebuje tylko jednej (aktualnej strony w aktualnym języku). Prowadzi to do marnowania przepustowości i wolniejszego czasu ładowania.

    Intlayer rozwiązuje ten problem poprzez optymalizację na etapie budowania. Analizuje on kod, aby wykryć, które słowniki są faktycznie używane w poszczególnych komponentach, i wstrzykuje do bundle'a tylko niezbędną treść.

    Spis treści

    Skanowanie bundle'a

    Analiza bundle'a to pierwszy krok do zidentyfikowania "ciężkich" plików JSON i możliwości podziału kodu (code-splitting). Narzędzia te generują wizualną mapę drzewa (treemap) skompilowanego kodu aplikacji, co pozwala dokładnie zobaczyć, które biblioteki zajmują najwięcej miejsca.

    Vite / Rollup

    Vite wykorzystuje pod maską Rollup. Wtyczka rollup-plugin-visualizer generuje interaktywny plik HTML pokazujący rozmiar każdego modułu w grafie.

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm install -D rollup-plugin-visualizer
    vite.config.ts
    Kopiuj kod

    Skopiuj kod do schowka

    import { defineConfig } from "vite";import { visualizer } from "rollup-plugin-visualizer";export default defineConfig({ plugins: [   visualizer({     open: true, // Automatycznie otwórz raport w przeglądarce     filename: "stats.html",     gzipSize: true,     brotliSize: true,   }), ],});

    Next.js (Turbopack)

    Dla projektów korzystających z App Router i Turbopack, Next.js udostępnia wbudowany eksperymentalny analizator, który nie wymaga dodatkowych zależności.

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npx next experimental-analyze

    Next.js (Webpack)

    Jeśli używasz domyślnego bundlera Webpack w Next.js, skorzystaj z oficjalnego analizatora bundle'a. Uruchom go, ustawiając zmienną środowiskową podczas budowania.

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm install -D @next/bundle-analyzer
    next.config.js
    Kopiuj kod

    Skopiuj kod do schowka

    const withBundleAnalyzer = require("@next/bundle-analyzer")({ enabled: process.env.ANALYZE === "true",});module.exports = withBundleAnalyzer({ // Twoja konfiguracja Next.js});

    Użycie:

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    ANALYZE=true npm run build

    Standardowy Webpack

    W przypadku Create React App (ejected), Angulara lub niestandardowych konfiguracji Webpack, użyj standardowego narzędzia webpack-bundle-analyzer.

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm install -D webpack-bundle-analyzer
    Kopiuj kod

    Skopiuj kod do schowka

    import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";export default { plugins: [   new BundleAnalyzerPlugin({     analyzerMode: "static",     reportFilename: "bundle-analyzer.html",     openAnalyzer: false,   }), ],};

    Jak to działa

    Intlayer stosuje podejście oparte na komponentach. W przeciwieństwie do globalnych plików JSON, treść jest definiowana obok komponentów lub w ichewnątrz. Podczas procesu budowania Intlayer:

    1. Analizuje kod w celu znalezienia wywołań useIntlayer.
    2. Buduje odpowiadającą im treść słownika.
    3. Zastępuje wywołanie useIntlayer zoptymalizowanym kodem na podstawie Twojej konfiguracji.

    Zapewnia to, że:

    • Jeśli komponent nie zostanie zaimportowany, jego treść nie zostanie dołączona do bundle'a (Dead Code Elimination).
    • Jeśli komponent jest ładowany leniwie (lazy-loaded), jego treść również jest ładowana leniwie.

    Konfiguracja według platformy

    Next.js

    Next.js wymaga wtyczki @intlayer/swc do obsługi transformacji, ponieważ Next.js używa SWC do budowania.

    Ta wtyczka nie jest instalowana domyślnie, ponieważ wtyczki SWC są nadal eksperymentalne w Next.js. Może to ulec zmianie w przyszłości.
    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm install -D @intlayer/swc

    Po zainstalowaniu Intlayer automatycznie wykryje i użyje wtyczki.

    Vite

    Vite używa wtyczki @intlayer/babel, która jest dołączona jako zależność vite-intlayer. Optymalizacja jest domyślnie włączona. Nie trzeba nic więcej robić.

    Webpack

    Aby włączyć optymalizację bundle'a za pomocą Intlayer w Webpacku, musisz zainstalować i skonfigurować odpowiednią wtyczkę Babel (@intlayer/babel) lub SWC (@intlayer/swc).

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm install -D @intlayer/babel
    babel.config.js
    Kopiuj kod

    Skopiuj kod do schowka

    const { getOptimizePluginOptions, intlayerOptimizeBabelPlugin,} = require("@intlayer/babel");module.exports = { plugins: [[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()]],};

    Konfiguracja

    Możesz kontrolować sposób optymalizacji bundle'a przez Intlayer za pomocą właściwości build w pliku intlayer.config.ts.

    intlayer.config.ts
    Kopiuj kod

    Skopiuj kod do schowka

    import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  internationalization: {    locales: [Locales.ENGLISH, Locales.FRENCH],    defaultLocale: Locales.ENGLISH,  },  dictionary: {    importMode: "dynamic",  },  build: {    /**     * Minifikuj słowniki, aby zmniejszyć rozmiar bundle'a.     */     minify: true;    /**     * Usuwaj nieużywane klucze w słownikach (purge)     */     purge: true;    /**     * Wskazuje, czy proces budowania powinien sprawdzać typy TypeScript     */    checkTypes: false;  },};export default config;
    W większości przypadków zaleca się pozostawienie domyślnej opcji dla optimize.
    Zobacz dokumentację konfiguracji, aby uzyskać więcej szczegółów: Konfiguracja

    Opcje budowania

    Dostępne są następujące opcje w obiekcie konfiguracji build:

    Pokaż całą zawartość tabeli

    Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość

    Właściwość Typ Domyślnie Opis
    optimize boolean undefined Kontroluje, czy optymalizacja budowania jest włączona. Jeśli true, Intlayer zastępuje wywołania słowników zoptymalizowanymi wstrzyknięciami. Jeśli false, optymalizacja jest wyłączona. Idealnie true na prod.
    minify boolean false Czy minifikować słowniki w celu zmniejszenia rozmiaru bundle'a.
    purge boolean false Czy usuwać nieużywane klucze w słownikach.

    Minifikacja

    Minifikacja słowników usuwa niepotrzebne białe znaki, komentarze i zmniejsza rozmiar treści JSON. Jest to szczególnie przydatne w przypadku dużych słowników.

    intlayer.config.ts
    Kopiuj kod

    Skopiuj kod do schowka

    import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    minify: true,  },};export default config;
    Uwaga: Minifikacja jest ignorowana, jeśli optimize jest wyłączone lub jeśli włączony jest Edytor Wizualny (ponieważ edytor potrzebuje pełnej treści, aby umożliwić edycję).

    Purging (Czyszczenie)

    Purging zapewnia, że tylko klucze faktycznie używane w kodzie zostaną uwzględnione w końcowym bundle'u słowników. Może to znacznie zmniejszyć rozmiar bundle'a, jeśli masz duże słowniki z wieloma kluczami, które nie są używane w każdej części aplikacji.

    intlayer.config.ts
    Kopiuj kod

    Skopiuj kod do schowka

    import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    purge: true,  },};export default config;
    Uwaga: Purging jest ignorowany, jeśli optimize jest wyłączone.

    Tryb importu (Import Mode)

    W przypadku dużych aplikacji, obejmujących wiele stron i języków, pliki JSON mogą stanowić znaczną część rozmiaru bundle'a. Intlayer pozwala kontrolować sposób ładowania słowników.

    Tryb importu można zdefiniować domyślnie globalnie w pliku intlayer.config.ts.

    intlayer.config.ts
    Kopiuj kod

    Skopiuj kod do schowka

    import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    minify: true,  },};export default config;

    Jak również dla każdego słownika w plikach .content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5}}.

    ts
    Kopiuj kod

    Skopiuj kod do schowka

    import { type Dictionary, t } from "intlayer";const appContent: Dictionary = {  key: "app",  importMode: "dynamic", // Nadpisz domyślny tryb importu  content: {    // ...  },};export default appContent;
    Pokaż całą zawartość tabeli

    Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość

    Właściwość Typ Domyślnie Opis
    importMode 'static', 'dynamic', 'fetch' 'static' Przestarzałe: Zamiast tego używaj dictionary.importMode. Określa, jak ładowane są słowniki (szczegóły poniżej).

    Ustawienie importMode dyktuje, w jaki sposób treść słownika jest wstrzykiwana do komponentu. Możesz je zdefiniować globalnie w pliku intlayer.config.ts w obiekcie dictionary lub nadpisać dla konkretnego słownika w jego pliku .content.ts.

    1. Tryb statyczny (default)

    W trybie statycznym Intlayer zastępuje useIntlayer przez useDictionary i wstrzykuje słownik bezpośrednio do bundle'a JavaScript.

    • Zalety: Natychmiastowe renderowanie (synchroniczne), zero dodatkowych żądań sieciowych podczas hydratacji.
    • Wady: Bundle zawiera tłumaczenia dla wszystkich dostępnych języków dla tego konkretnego komponentu.
    • Najlepszy dla: Single Page Applications (SPA).

    Przykład przetransformowanego kodu:

    tsx
    Kopiuj kod

    Skopiuj kod do schowka

    // Twój kodconst content = useIntlayer("my-key");// Zoptymalizowany kod (Statyczny)const content = useDictionary({  key: "my-key",  content: {    nodeType: "translation",    translation: {      en: "My title",      fr: "Mon titre",    },  },});

    2. Tryb dynamiczny

    W trybie dynamicznym Intlayer zastępuje useIntlayer przez useDictionaryAsync. Wykorzystuje to import() (mechanizm typu Suspense) do leniwego ładowania pliku JSON konkretnie dla aktualnego języka.

    • Zalety: Tree shaking na poziomie języka. Użytkownik przeglądający wersję angielską pobierze tylko słownik angielski. Słownik francuski nigdy nie zostanie załadowany.
    • Wady: Wyzwala żądanie sieciowe (pobranie zasobu) dla każdego komponentu podczas hydratacji.
    • Najlepszy dla: Dużych bloków tekstu, artykułów lub aplikacji obsługujących wiele języków, gdzie rozmiar bundle'a jest krytyczny.

    Przykład przetransformowanego kodu:

    tsx
    Kopiuj kod

    Skopiuj kod do schowka

    // Twój kodconst content = useIntlayer("my-key");// Zoptymalizowany kod (Dynamiczny)const content = useDictionaryAsync({  en: () =>    import(".intlayer/dynamic_dictionary/my-key/en.json").then(      (mod) => mod.default    ),  fr: () =>    import(".intlayer/dynamic_dictionary/my-key/fr.json").then(      (mod) => mod.default    ),});
    Korzystając z importMode: 'dynamic', jeśli masz 100 komponentów używających useIntlayer na jednej stronie, przeglądarka podejmie 100 oddzielnych prób pobrania. Aby uniknąć tego "wodospadu" żądań, grupuj treści w mniejszej liczbie plików .content (np. jeden słownik na sekcję strony) zamiast jednego na każdy drobny komponent.

    3. Tryb Fetch

    Zachowuje się podobnie do trybu dynamicznego, ale najpierw próbuje pobrać słowniki z Intlayer Live Sync API. Jeśli wywołanie API nie powiedzie się lub treść nie jest oznaczona do aktualizacji na żywo, powraca do importu dynamicznego.

    Zobacz dokumentację CMS, aby uzyskać więcej szczegółów: CMS
    W trybie fetch nie można używać czyszczenia (purge) ani minifikacji.

    Podsumowanie: Statyczny vs Dynamiczny

    Pokaż całą zawartość tabeli

    Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość

    Funkcja Tryb statyczny Tryb dynamiczny
    Rozmiar bundle'a JS Większy (zawiera wszystkie języki dla komponentu) Najmniejszy (tylko kod, brak treści)
    Ładowanie początkowe Natychmiastowe (treść jest w bundle'u) Lekkie opóźnienie (pobiera JSON)
    Żądania sieciowe 0 dodatkowych żądań 1 żądanie na każdy słownik
    Tree Shaking Poziom komponentu Poziom komponentu + Poziom języka
    Najlepszy przypadek Komponenty UI, małe aplikacje Strony z dużą ilością tekstu, wiele języków
    Testowanie
    Next.js
    Alt+→

    Na tej stronie

      Dyskusje są anonimowe i regularnie przeglądane w celu rozwiązania typowych problemów. Podziel się pomysłami na funkcje, opinią o dokumentacji lub czymkolwiek związanym z Intlayer, wykorzystujemy te informacje do kształtowania naszej mapy drogowej i ulepszania produktu.

      npm install -D rollup-plugin-visualizer
      import { defineConfig } from "vite";import { visualizer } from "rollup-plugin-visualizer";export default defineConfig({ plugins: [   visualizer({     open: true, // Automatycznie otwórz raport w przeglądarce     filename: "stats.html",     gzipSize: true,     brotliSize: true,   }), ],});
      npx next experimental-analyze
      npm install -D @next/bundle-analyzer
      const withBundleAnalyzer = require("@next/bundle-analyzer")({ enabled: process.env.ANALYZE === "true",});module.exports = withBundleAnalyzer({ // Twoja konfiguracja Next.js});
      ANALYZE=true npm run build
      npm install -D webpack-bundle-analyzer
      import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";export default { plugins: [   new BundleAnalyzerPlugin({     analyzerMode: "static",     reportFilename: "bundle-analyzer.html",     openAnalyzer: false,   }), ],};
      npm install -D @intlayer/swc
      npm install -D @intlayer/babel
      const { getOptimizePluginOptions, intlayerOptimizeBabelPlugin,} = require("@intlayer/babel");module.exports = { plugins: [[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()]],};
      import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  internationalization: {    locales: [Locales.ENGLISH, Locales.FRENCH],    defaultLocale: Locales.ENGLISH,  },  dictionary: {    importMode: "dynamic",  },  build: {    /**     * Minifikuj słowniki, aby zmniejszyć rozmiar bundle'a.     */     minify: true;    /**     * Usuwaj nieużywane klucze w słownikach (purge)     */     purge: true;    /**     * Wskazuje, czy proces budowania powinien sprawdzać typy TypeScript     */    checkTypes: false;  },};export default config;
      import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    minify: true,  },};export default config;
      import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    purge: true,  },};export default config;
      import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    minify: true,  },};export default config;
      import { type Dictionary, t } from "intlayer";const appContent: Dictionary = {  key: "app",  importMode: "dynamic", // Nadpisz domyślny tryb importu  content: {    // ...  },};export default appContent;
      // Twój kodconst content = useIntlayer("my-key");// Zoptymalizowany kod (Statyczny)const content = useDictionary({  key: "my-key",  content: {    nodeType: "translation",    translation: {      en: "My title",      fr: "Mon titre",    },  },});
      // Twój kodconst content = useIntlayer("my-key");// Zoptymalizowany kod (Dynamiczny)const content = useDictionaryAsync({  en: () =>    import(".intlayer/dynamic_dictionary/my-key/en.json").then(      (mod) => mod.default    ),  fr: () =>    import(".intlayer/dynamic_dictionary/my-key/fr.json").then(      (mod) => mod.default    ),});