ГоловнаПісочницяВітринаДодатокДокументаціяБлог
    • Englishанглійська
      EN
    • русскийросійська
      RU
    • 日本語японська
      JA
    • françaisфранцузька
      FR
    • 한국어корейська
      KO
    • 中文китайська
      ZH
    • españolіспанська
      ES
    • Deutschнімецька
      DE
    • العربيةарабська
      AR
    • italianoіталійська
      IT
    • British Englishанглійська (Велика Британія)
      EN-GB
    • portuguêsпортугальська
      PT
    • हिन्दीгінді
      HI
    • Türkçeтурецька
      TR
    • polskiпольська
      PL
    • Indonesiaіндонезійська
      ID
    • Tiếng Việtвʼєтнамська
      VI
    • українськаукраїнська
      UK
    /
    Фільтрувати документи за фреймворком
    Alt+←
    Чому Intlayer?
    Почати
    Концепція
    • Як працює Intlayer
    • Конфігурація
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Візуальний редактор
    • CMS
    • Інтеграція CI/CD
    • ПерекладМножинаПерелікУмоваРідВставкаФайлВкладеністьMarkdownHTMLОтримання функції
    • Файл для кожної локалі
    • Компілятор
    • Автозаповнення
    • Тестування
    • Оптимізація пакета
    Середовище
    • Next.js 14 та App Router
      Next.js 15
      Next.js без locale URL
      Next.js та Page Router
      Compiler
    • Tanstack Start Solid
    • Astro та React
      Astro та Svelte
      Astro та Vue
      Astro та Solid
      Astro та Preact
      Astro та Lit
      Astro та Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt та Vue
    • Vite та Solid
    • SvelteKit
    • Vite та Preact
    • Vite та Vanilla JS
    • Vite та Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native та Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx та React
    Plugins
    • JSON
    • gettext (.po)
    Розширення VS Code
    Агент
    • Сервер MCP
    • Навички агента
    Релізи
    • v8
    • v7
    • v6
    Бенчмарк
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Блог
    Задати питання
    1. Documentation
    2. Концепція
    3. Bundle optimization
    Дата створення:2025-11-25Останнє оновлення:2026-04-08
    Надішліть цей документ вашому улюбленому AI-асистенту
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту

    Історія версій

    1. "Додано опції `minify` та `purge` до конфігурації збірки"
      v8.7.008.04.2026

    Вміст цієї сторінки перекладено за допомогою штучного інтелекту.

    Переглянути останню версію оригінального вмісту англійською
    Редагувати цей документ

    Якщо у вас є ідея щодо покращення цієї документації, будь ласка, долучіться, надіславши pull request на GitHub.

    Посилання на документацію на GitHub
    Копіювати

    Скопіювати документацію у форматі Markdown в буфер обміну

    Оптимізація розміру бандла i18n та продуктивності

    Однією з найпоширеніших проблем традиційних i18n-рішень, що покладаються на JSON-файли, є управління розміром контенту. Якщо розробники вручну не розділяють контент на простори імен (namespaces), користувачі часто завантажують переклади для кожної сторінки і, можливо, для кожної мови лише для того, щоб переглянути одну сторінку.

    Наприклад, застосунок із 10 сторінками, перекладеними 10 мовами, може призвести до того, що користувач завантажить контент 100 сторінок, хоча йому потрібна лише одна (поточна сторінка поточною мовою). Це призводить до марної витрати трафіку та сповільнення часу завантаження.

    Intlayer вирішує цю проблему за допомогою оптимізації на етапі збірки. Він аналізує ваш код, щоб визначити, які словники дійсно використовуються в кожному компоненті, і впроваджує лише необхідний контент у ваш бандл.

    Зміст

    Сканування бандла

    Аналіз бандла - це перший крок до виявлення "важких" JSON-файлів та можливостей розділення коду. Ці інструменти генерують візуальну деревоподібну карту (treemap) скомпільованого коду вашого застосунку, дозволяючи вам точно побачити, які бібліотеки займають найбільше місця.

    Vite / Rollup

    Vite використовує Rollup під капотом. Плагін rollup-plugin-visualizer генерує інтерактивний HTML-файл, що показує розмір кожного модуля у вашому графі.

    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    npm install -D rollup-plugin-visualizer
    vite.config.ts
    Копіювати код

    Скопіюйте код у буфер обміну

    import { defineConfig } from "vite";import { visualizer } from "rollup-plugin-visualizer";export default defineConfig({ plugins: [   visualizer({     open: true, // Автоматично відкрити звіт у браузері     filename: "stats.html",     gzipSize: true,     brotliSize: true,   }), ],});

    Next.js (Turbopack)

    Для проєктів, що використовують App Router та Turbopack, Next.js надає вбудований експериментальний аналізатор, який не потребує додаткових залежностей.

    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    npx next experimental-analyze

    Next.js (Webpack)

    Якщо ви використовуєте стандартний збирач Webpack у Next.js, використовуйте офіційний аналізатор бандлів. Запустіть його, встановивши змінну оточення під час збірки.

    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    npm install -D @next/bundle-analyzer
    next.config.js
    Копіювати код

    Скопіюйте код у буфер обміну

    const withBundleAnalyzer = require("@next/bundle-analyzer")({ enabled: process.env.ANALYZE === "true",});module.exports = withBundleAnalyzer({ // Ваша конфігурація Next.js});

    Використання:

    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    ANALYZE=true npm run build

    Стандартний Webpack

    Для Create React App (ejected), Angular або кастомних налаштувань Webpack використовуйте галузевий стандарт webpack-bundle-analyzer.

    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    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,   }), ],};

    Як це працює

    Intlayer використовує підхід на рівні компонентів. На відміну від глобальних JSON-файлів, ваш контент визначається поруч із вашими компонентами або всередині них. У процесі збірки Intlayer:

    1. Аналізує ваш код на наявність викликів useIntlayer.
    2. Збирає відповідний контент словника.
    3. Замінює виклик useIntlayer оптимізованим кодом на основі вашої конфігурації.

    Це гарантує, що:

    • Якщо компонент не імпортовано, його контент не включається в бандл (видалення мертвого коду).
    • Якщо компонент завантажується ліниво (lazy-loading), його контент також завантажується ліниво.

    Налаштування за платформами

    Next.js

    Для трансформації Next.js потрібен плагін @intlayer/swc, оскільки Next.js використовує SWC для збірки.

    Цей плагін не встановлюється за замовчуванням, оскільки плагіни SWC для Next.js все ще знаходяться на стадії експерименту. Це може змінитися в майбутньому.
    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    npm install -D @intlayer/swc

    Після встановлення Intlayer автоматично виявить і використовуватиме плагін.

    Vite

    Vite використовує плагін @intlayer/babel, який включено як залежність vite-intlayer. Оптимізацію увімкнено за замовчуванням. Більше нічого робити не потрібно.

    Webpack

    Щоб увімкнути оптимізацію бандла за допомогою Intlayer у Webpack, вам потрібно встановити та налаштувати відповідний плагін Babel (@intlayer/babel) або SWC (@intlayer/swc).

    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    npm install -D @intlayer/babel
    babel.config.js
    Копіювати код

    Скопіюйте код у буфер обміну

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

    Конфігурація

    Ви можете керувати тим, як Intlayer оптимізує ваш бандл, за допомогою властивості build у вашому intlayer.config.ts.

    intlayer.config.ts
    Копіювати код

    Скопіюйте код у буфер обміну

    import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  internationalization: {    locales: [Locales.ENGLISH, Locales.FRENCH],    defaultLocale: Locales.ENGLISH,  },  dictionary: {    importMode: "dynamic",  },  build: {    /**     * Мініфікувати словники для зменшення розміру бандла.     */     minify: true;    /**     * Видаляти невикористані ключі в словниках (purge)     */     purge: true;    /**     * Вказує, чи повинна збірка перевіряти типи TypeScript     */    checkTypes: false;  },};export default config;
    У переважній більшості випадків рекомендується залишати значення за замовчуванням для параметра optimize.
    Подробиці дивіться у документації з конфігурації: Конфігурація

    Опції збірки

    В об'єкті конфігурації build доступні такі опції:

    Показати весь вміст таблиці

    Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані

    Властивість Тип За замовчуванням Опис
    optimize boolean undefined Керує увімкненням оптимізації збірки. Якщо true, Intlayer замінює виклики словника оптимізованими вставками. Якщо false, оптимізацію вимкнено. В ідеалі в продакшені має бути true.
    minify boolean false Чи мініфікувати словники для зменшення розміру бандла.
    purge boolean false Чи видаляти невикористані ключі в словниках.

    Мініфікація

    Мініфікація словників видаляє непотрібні пробіли, коментарі та зменшує розмір вмісту JSON. Це особливо корисно для великих словників.

    intlayer.config.ts
    Копіювати код

    Скопіюйте код у буфер обміну

    import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    minify: true,  },};export default config;
    Примітка: Мініфікація ігнорується, якщо optimize вимкнено або якщо увімкнено Візуальний редактор (оскільки редактору потрібен повний контент для можливості редагування).

    Очищення (Purging)

    Очищення гарантує, що у фінальний бандл словників будуть включені лише ті ключі, які дійсно використовуються у вашому коді. Це може значно зменшити розмір вашого бандла, якщо у вас є великі словники з багатьма ключами, які використовуються не у всіх частинах вашого застосунку.

    intlayer.config.ts
    Копіювати код

    Скопіюйте код у буфер обміну

    import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    purge: true,  },};export default config;
    Примітка: Очищення ігнорується, якщо параметр optimize вимкнено.

    Режим імпорту (Import Mode)

    Для великих застосунків, що включають багато сторінок та локалей, ваші JSON-файли можуть становити значну частину розміру бандла. Intlayer дозволяє вам керувати способом завантаження словників.

    Режим імпорту може бути визначений за замовчуванням глобально у вашому файлі intlayer.config.ts.

    intlayer.config.ts
    Копіювати код

    Скопіюйте код у буфер обміну

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

    А також для кожного словника у ваших файлах .content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5}}.

    ts
    Копіювати код

    Скопіюйте код у буфер обміну

    import { type Dictionary, t } from "intlayer";const appContent: Dictionary = {  key: "app",  importMode: "dynamic", // Перевизначити режим імпорту за замовчуванням  content: {    // ...  },};export default appContent;
    Показати весь вміст таблиці

    Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані

    Властивість Тип За замовчуванням Опис
    importMode 'static', 'dynamic', 'fetch' 'static' Застаріло: Використовуйте dictionary.importMode замість цього. Визначає, як завантажуються словники (деталі нижче).

    Налаштування importMode визначає, як вміст словника впроваджується у ваш компонент. Ви можете визначити його глобально у файлі intlayer.config.ts в об'єкті dictionary або перевизначити для конкретного словника у його файлі .content.ts.

    1. Статичний режим (default)

    У статичному режимі Intlayer замінює useIntlayer на useDictionary і впроваджує словник безпосередньо в JavaScript бандл.

    • Плюси: Миттєвий рендеринг (синхронний), відсутність додаткових мережевих запитів під час гідратації.
    • Мінуси: Бандл містить переклади для всіх доступних мов для цього конкретного компонента.
    • Найкраще для: Односторінкових застосунків (SPA).

    Приклад трансформованого коду:

    tsx
    Копіювати код

    Скопіюйте код у буфер обміну

    // Ваш кодconst content = useIntlayer("my-key");// Оптимізований код (Статичний)const content = useDictionary({  key: "my-key",  content: {    nodeType: "translation",    translation: {      en: "My title",      fr: "Mon titre",    },  },});

    2. Динамічний режим

    У динамічному режимі Intlayer замінює useIntlayer на useDictionaryAsync. Це використовує import() (механізм типу Suspense) для лінивого завантаження конкретно JSON для поточної локалі.

    • Плюси: Tree shaking на рівні локалі. Користувач, що переглядає англійську версію, завантажить лише англійський словник. Французький словник ніколи не завантажиться.
    • Мінуси: Викликає мережевий запит (завантаження ассету) для кожного компонента під час гідратації.
    • Найкраще для: Великих текстових блоків, статей або застосунків із підтримкою багатьох мов, де розмір бандла є критичним.

    Приклад трансформованого коду:

    tsx
    Копіювати код

    Скопіюйте код у буфер обміну

    // Ваш кодconst content = useIntlayer("my-key");// Оптимізований код (Динамічний)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    ),});
    При використанні importMode: 'dynamic', якщо у вас на одній сторінці 100 компонентів використовують useIntlayer, браузер спробує виконати 100 окремих завантажень. Щоб уникнути цього "водоспаду" запитів, групуйте контент у меншу кількість файлів .content (наприклад, один словник на розділ сторінки), а не по одному на кожен дрібний компонент.

    3. Режим Fetch

    Поводиться аналогічно динамічному режиму, але спочатку намагається отримати словники з API Intlayer Live Sync. Якщо виклик API завершується невдало або контент не позначено для живих оновлень, він перемикається на динамічний імпорт.

    Подробиці дивіться у документації CMS: CMS
    У режимі fetch не можна використовувати очищення (purge) та мініфікацію.

    Резюме: Статичний vs Динамічний

    Показати весь вміст таблиці

    Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані

    Функція Статичний режим Динамічний режим
    Розмір JS бандла Більший (включає всі мови для компонента) Найменший (лише код, контенту немає)
    Початкове завантаження Миттєво (контент уже в бандлі) Невелика затримка (завантаження JSON)
    Мережеві запити 0 додаткових запитів 1 запит на кожен словник
    Tree Shaking На рівні компонентів На рівні компонентів + на рівні локалей
    Найкращий варіант використання UI-компоненти, невеликі застосунки Сторінки з великою кількістю тексту, багато мов
    Тестування
    Next.js
    Alt+→

    На цій сторінці

      Обговорення анонімні та регулярно переглядаються для вирішення поширених проблем. Не соромтеся ділитися ідеями функцій, відгуками про документацію або будь-чим, що стосується Intlayer, ми використовуємо цю інформацію для формування нашої дорожньої карти та покращення продукту.

      npm install -D rollup-plugin-visualizer
      import { defineConfig } from "vite";import { visualizer } from "rollup-plugin-visualizer";export default defineConfig({ plugins: [   visualizer({     open: true, // Автоматично відкрити звіт у браузері     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({ // Ваша конфігурація 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: {    /**     * Мініфікувати словники для зменшення розміру бандла.     */     minify: true;    /**     * Видаляти невикористані ключі в словниках (purge)     */     purge: true;    /**     * Вказує, чи повинна збірка перевіряти типи 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", // Перевизначити режим імпорту за замовчуванням  content: {    // ...  },};export default appContent;
      // Ваш кодconst content = useIntlayer("my-key");// Оптимізований код (Статичний)const content = useDictionary({  key: "my-key",  content: {    nodeType: "translation",    translation: {      en: "My title",      fr: "Mon titre",    },  },});
      // Ваш кодconst content = useIntlayer("my-key");// Оптимізований код (Динамічний)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    ),});