ГлавнаяПесочницаВитринаПриложениеДокументБлог
    • 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

    Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI

    История версий

    1. "Добавлены опции `minify` и `purge` в конфигурацию сборки"
      v8.7.008.04.2026

    Содержимое этой страницы было переведено с помощью ИИ.

    Смотреть последнюю версию оригинального контента на английском
    Изменить эту документацию

    Если у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на 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    ),});