Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI
История версий
- "`purge` и `minify` теперь работают в Next.js через `@intlayer/swc` — файл `babel.config.js` не требуется"v9.2.109.08.2026
- "Перечисление плагинов Babel в требуемом порядке конвейера (extract → purge → minify → optimize) в справочных таблицах"v8.12.024.06.2026
- "Добавлены `intlayerPurgeBabelPlugin` и `intlayerMinifyBabelPlugin` для Babel/Webpack; уточнен процесс работы плагинов (pipeline)"v8.12.007.06.2026
- "Добавлены параметры `minify` и `purge` в конфигурацию сборки"v8.7.008.04.2026
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомЕсли у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.
Ссылка на документацию GitHubКопировать Markdown документа в буфер обмена
Оптимизация размера сборки i18n и производительности
Одной из самых распространенных проблем при использовании традиционных решений i18n, опирающихся на JSON-файлы, является управление размером контента. Если разработчики не разделяют контент на пространства имен (namespaces) вручную, пользователи часто вынуждены скачивать переводы для каждой страницы и, потенциально, для каждого языка только для того, чтобы просмотреть одну единственную страницу.
Например, в приложении с 10 страницами, переведенными на 10 языков, пользователь может загрузить контент сразу для 100 страниц, хотя ему нужна только одна (текущая страница на текущем языке). Это приводит к напрасной трате пропускной способности и замедлению времени загрузки.
Intlayer решает эту проблему посредством оптимизации во время сборки (build-time optimization). Он анализирует ваш код, чтобы обнаружить, какие именно словари фактически используются в каждом компоненте, и встраивает в вашу сборку только необходимый контент.
Оглавление
Анализ вашей сборки
Анализ вашей сборки (бандла) — это первый шаг к выявлению «тяжелых» JSON-файлов и возможностей для разделения кода (code-splitting). Специализированные инструменты генерируют визуальное дерево (treemap) скомпилированного кода вашего приложения, что позволяет точно увидеть, какие библиотеки потребляют больше всего места.
Vite / Rollup
Vite использует Rollup «под капотом». Плагин rollup-plugin-visualizer генерирует интерактивный HTML-файл, отображающий размер каждого модуля в вашем графе.
Копировать код в буфер обмена
Копировать код в буфер обмена
Next.js (Turbopack)
Для проектов, использующих App Router и Turbopack, Next.js предоставляет встроенный экспериментальный анализатор, который не требует установки дополнительных зависимостей.
Копировать код в буфер обмена
Next.js (Webpack)
Если вы используете стандартный сборщик Webpack в Next.js, воспользуйтесь официальным анализатором сборки. Его можно запустить, установив переменную окружения во время сборки.
Копировать код в буфер обмена
Копировать код в буфер обмена
Использование:
Копировать код в буфер обмена
Стандартный Webpack
Для Create React App (ejected), Angular или пользовательских конфигураций Webpack используйте стандартный плагин webpack-bundle-analyzer.
Копировать код в буфер обмена
Копировать код в буфер обмена
Как это работает
Intlayer использует компонентный подход. В отличие от глобальных JSON-файлов, ваш контент определяется рядом с вашими компонентами или внутри них. В процессе сборки Intlayer выполняет следующие действия:
- Анализирует ваш код, чтобы найти вызовы
useIntlayer. - Создает соответствующий контент словаря.
- Заменяет вызов
useIntlayerоптимизированным кодом на основе вашей конфигурации.
Это гарантирует следующее:
- Если компонент не импортируется, его контент не включается в сборку (устранение мертвого кода — Dead Code Elimination).
- Если компонент загружается лениво (lazy-loaded), его контент также загружается лениво.
Справочник по плагинам
Оптимизация сборки Intlayer разделена на несколько дискретных плагинов, каждый из которых имеет свою единственную ответственность. Понимание того, что делает каждый плагин, предотвращает путаницу при их настройке.
Плагины Babel (@intlayer/babel)
Они используются непосредственно в babel.config.js для сборок на базе Webpack (Next.js с Babel, CRA, пользовательский Webpack и т.д.).
В таблице ниже они перечислены в требуемом порядке конвейера (в том же порядке, в котором они должны идти в babel.config.js):
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Плагин | Что делает |
|---|---|
intlayerExtractBabelPlugin | Сканирует .content.ts файлы и записывает скомпилированные словари в .intlayer/ |
intlayerPurgeBabelPlugin | Сканирует все исходные файлы, удаляет неиспользуемые поля контента из скомпилированных .intlayer/**/*.json файлов словарей |
intlayerMinifyBabelPlugin | Переименовывает ключи полей контента в короткие буквенные алиасы (например, title → a) как в JSON-файлах, так и в исходном коде |
intlayerOptimizeBabelPlugin | Переписывает useIntlayer('key') → useDictionary(hash) и внедряет (import) соответствующий словарь |
Порядок плагинов имеет значение. В вашемbabel.config.jsплагины purge и minify должны быть указаны до плагина optimize. Оптимизация (optimize) заменяетuseIntlayer('key')непрозрачным вызовомuseDictionary(hash), стирая информацию о ключе словаря, которая нужна плагинам purge и minify для определения того, какие поля используются.
Каждый плагин Babel имеет соответствующий помощник параметров (options helper), который однократно считывает ваш intlayer.config.ts во время загрузки конфигурации и возвращает предварительно разрешенные (resolved) значения:
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Помощник параметров | Используется вместе с |
|---|---|
getExtractPluginOptions() | intlayerExtractBabelPlugin |
getPurgePluginOptions() | intlayerPurgeBabelPlugin |
getMinifyPluginOptions() | intlayerMinifyBabelPlugin |
getOptimizePluginOptions() | intlayerOptimizeBabelPlugin |
Плагины Vite (vite-intlayer)
Пользователям Vite не нужно настраивать их напрямую. Они автоматически подключаются при вызове withIntlayer() в vite.config.ts. Флаги build.purge и build.minify в intlayer.config.ts включают соответствующее поведение без какой-либо дополнительной регистрации плагинов.
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Внутренний Vite плагин | Эквивалентное поведение |
|---|---|
| Usage analyzer | То же самое, что и анализ плагина intlayerPurgeBabelPlugin |
| Dictionary prune | То же самое, что и запись JSON плагином intlayerPurgeBabelPlugin |
| Dictionary minify | То же самое, что и запись JSON плагином intlayerMinifyBabelPlugin |
| Babel transform | То же самое, что и переименование исходного кода intlayerMinifyBabelPlugin + intlayerOptimizeBabelPlugin |
Плагин SWC (@intlayer/swc)
Пользователи Next.js тоже никогда не настраивают это напрямую. Начиная с v9.2.1, withIntlayer() в next.config.ts выполняет весь конвейер — purge, минификацию и переписывание импортов — опираясь только на флаги build.purge и build.minify.
Работа разделена на две части, поскольку Wasm-плагин SWC преобразует по одному файлу за раз и не имеет доступа к файловой системе:
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Проход | Где выполняется | Что делает |
|---|---|---|
| Анализ использования + purge/минификация JSON | Node, внутри withIntlayer() | Читает каждый исходный файл компонента, переписывает .intlayer/**/*.json, формирует таблицы переименования |
Переписывание исходного кода (content.title → .a) | @intlayer/swc (Wasm) | Применяет таблицы переименования к соответствующим обращениям к свойствам в вашем коде |
Переписывание импортов (useIntlayer → dict) | @intlayer/swc (Wasm) | То же, что intlayerOptimizeBabelPlugin |
Определение того, какие поля не используются и какой псевдоним получит каждое из них, требует состояния между файлами и файлового ввода-вывода, поэтому эта половина выполняется в Node; плагин SWC получает лишь готовые таблицы.
Настройка по платформам
Next.js
Next.js требует плагин @intlayer/swc, поскольку Next.js использует SWC для сборки. Начиная с v9.2.1 этот единственный пакет покрывает весь конвейер — оптимизацию (переписывание импортов), purge и минификацию.
Этот плагин не устанавливается по умолчанию, поскольку плагины SWC всё еще находятся на стадии эксперимента для Next.js. Это может измениться в будущем.
Next.js 16.1.0 — минимальная версия. Это первый релиз, построенный на прямо совместимом ABI Wasm-плагинов SWC; более ранние релизы отклоняют плагин. withIntlayer считывает вашу версию Next.js и просто не регистрирует плагин ниже 16.1.0 — такие сборки всё равно проходят успешно, просто без оптимизации бандла.
Копировать код в буфер обмена
Копировать код в буфер обмена
После установки Intlayer автоматически обнаружит и использует этот плагин.
Проходы purge и минификации (удаление и переименование полей) не требуют ни дополнительного пакета, ни babel.config.js. Оберните вашу конфигурацию в withIntlayer и включите флаги в intlayer.config.ts:
Копировать код в буфер обмена
Копировать код в буфер обмена
Во время next build withIntlayer анализирует ваши исходники, переписывает скомпилированные словари и передаёт полученные таблицы переименования полей в @intlayer/swc, который обновляет соответствующие обращения к свойствам в вашем коде.
Используйте асинхронныйwithIntlayer, а неwithIntlayerSync. Синхронный вариант не запускает конвейер анализа, поэтому purge и минификация с ним не действуют.
Purge и минификация выполняются только приnext build— конвейер оптимизации отключён во времяnext dev.
Они также отключаются, когда настроены вызывающие из адаптеров совместимости (swcExtraCallers, задаваемые пакетами совместимости, такими как@intlayer/next-intlили@intlayer/react-i18next): эти места вызова невидимы для анализатора использования, поэтому purge удалил бы поля, которые код всё ещё читает. Переписывание импортов остаётся активным.
Более ранние версии (до 9.2.1) требовали @intlayer/babel и файл babel.config.js, объявляющий intlayerPurgeBabelPlugin и intlayerMinifyBabelPlugin. Этот файл больше не нужен и может быть удалён.
Vite
Vite использует плагин @intlayer/babel, который включен в качестве зависимости к vite-intlayer. Полный цикл оптимизации (pipeline) — перезапись импортов, удаление (purge) и минификация (minify) — включен по умолчанию и не требует регистрации дополнительных плагинов.
Включите purge и minify, установив соответствующие флаги в intlayer.config.ts:
Копировать код в буфер обмена
Webpack (и Next.js с Babel)
Установите @intlayer/babel:
Копировать код в буфер обмена
Добавьте все четыре плагина в babel.config.js в правильном порядке:
Копировать код в буфер обмена
Конфигурация
Вы можете управлять тем, как Intlayer оптимизирует вашу сборку, через свойство build в вашем intlayer.config.ts.
Копировать код в буфер обмена
Во многих случаях рекомендуется оставлять значение по умолчанию (undefined) для параметраoptimize.
См. справочник конфигурации со всеми опциями: Конфигурация
Параметры сборки (Build Options)
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
optimize | boolean / undefined | undefined | Включает фазу перезаписи импортов. undefined = активно только для продакшен-сборок. false также отключает purge и minify. |
minify | boolean | false | Переименовывает ключи полей контента в скомпилированных JSON-файлах в короткие буквенные алиасы. Также перезаписывает соответствующие обращения в исходном коде. Не работает при optimize: false. |
purge | boolean | false | Удаляет поля контента из скомпилированных JSON-файлов, к которым не происходит статического обращения в коде. Не работает при optimize: false. |
Минификация (Minification) — переименование ключей полей
Параметр build.minify не занимается минификацией вашего JavaScript-бандла — с этой задачей должен справляться ваш сборщик. Вместо этого он уменьшает размер JSON-файлов скомпилированных словарей, заменяя каждый заданный пользователем ключ на короткий буквенный алиас:
Копировать код в буфер обмена
Аналогичное переименование применяется ко всем обращениям к свойствам в вашем исходном коде, поэтому content.title в скомпилированном выходе превратится в content.a. Поведение приложения во время выполнения остается абсолютно идентичным.
Копировать код в буфер обмена
Минификация пропускается, еслиoptimizeустановлен вfalse. Когдаeditor.enabledимеет значениеtrue, она по-прежнему выполняется, но без этапа переименования полей — визуальный редактор разрешает правки черезkeyPath, поэтому исходные имена полей должны сохраняться.
В Next.js минификация также пропускается, когда @intlayer/swc не установлен или не может быть загружен (Next.js ниже 16.1.0). Плагин — это та половина, которая переписывает обращения в исходном коде, поэтому переименование словарей без него оставило бы ваш код читающим имена полей, которых больше нет.
Минификация также пропускается для словарей, загружаемых через importMode: 'fetch', поскольку их JSON выдается удаленным API с оригинальными именами полей — изменение ключей на клиентской стороне нарушит контракт сервер/клиент.
Удаление неиспользуемых полей (Purging)
Параметр build.purge анализирует, к каким полям контента фактически обращается ваш исходный код, и удаляет все остальные поля из скомпилированных JSON-файлов.
Копировать код в буфер обмена
Пример: словарь с пятью полями, из которых в коде используются только два:
Копировать код в буфер обмена
Очистка пропускается, еслиoptimizeустановлен вfalse. Она остаётся активной, когдаeditor.enabledимеет значениеtrue— очищенное поле не читается ни одним компонентом, поэтому редактор никогда его не отображает. В Next.js она дополнительно пропускается, когда@intlayer/swcнедоступен и когда настроены вызывающие из адаптеров совместимости.
Очистка также отменяется из соображений надежности, когда исходный файл не удается разобрать (парсинг), или если результат работы useIntlayer присваивается переменной и передается способами, которые статический анализатор не может проконтролировать (например, spreading объекта, передача через prop без деструктуризации). В этих случаях сохраняется весь словарь целиком.
Режим импорта (Import Mode)
Для крупных приложений, включающих несколько страниц и локалей, ваш JSON может составлять значительную часть размера вашей сборки (bundle). Intlayer позволяет вам контролировать способ загрузки словарей с помощью опции importMode.
Глобальное определение
Режим импорта можно определить глобально в вашем файле intlayer.config.ts.
Копировать код в буфер обмена
Определение на уровне словаря
Вы можете переопределить режим импорта для отдельных словарей в их файлах .content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5|md|mdx|yaml|yml}}.
Копировать код в буфер обмена
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
importMode | 'static', 'dynamic', 'fetch' | 'static' | Устарело: Используйте dictionary.importMode. Определяет, каким образом загружаются словари (подробности см. ниже). |
Настройка importMode определяет, как контент словаря будет внедряться в ваш компонент. Эту настройку можно задать глобально в intlayer.config.ts (в объекте dictionary) или переопределить в файле .content.ts для каждого словаря.
1. Статический режим (Static Mode - default)
В статическом режиме Intlayer заменяет useIntlayer на useDictionary и внедряет словарь непосредственно в пакет (bundle) JavaScript.
- Плюсы: Мгновенный рендеринг (синхронный), ноль дополнительных сетевых запросов во время гидратации (hydration).
- Минусы: Сборка включает переводы для всех доступных языков, если они определены для данного компонента.
- Подходит для: Одностраничных приложений (SPA).
Пример измененного кода:
Копировать код в буфер обмена
2. Динамический режим (Dynamic Mode)
В динамическом режиме Intlayer заменяет useIntlayer на useDictionaryAsync. Он использует import() (подобно механизму Suspense), чтобы применять ленивую загрузку конкретно JSON для текущей локали.
- Плюсы: Tree shaking на уровне локали (языка). Пользователь, просматривающий английскую версию, загрузит только английский словарь. Русский словарь никогда не будет загружен.
- Минусы: Вызывает сетевой запрос (получение ассетов) для каждого компонента во время гидратации.
- Подходит для: Крупных текстовых блоков, статей или приложений с поддержкой большого числа языков, где размер сборки имеет критическое значение.
Пример измененного кода:
Копировать код в буфер обмена
Если вы используетеimportMode: 'dynamic'и у вас есть 100 компонентов на одной странице, каждый из которых вызываетuseIntlayer, браузер предпримет 100 отдельных попыток получения файлов. Чтобы избежать этого «водопада» запросов, группируйте контент в меньшем количестве файлов.content(например, один словарь на раздел страницы), а не создавайте их по одному на каждый атомарный компонент. Вы также можете использовать несколько файлов.contentс одним и тем же ключом: Intlayer объединит их в один единый словарь.
3. Режим Fetch
Данный режим работает аналогично динамическому режиму, но в первую очередь пытается получить словари из API синхронизации Intlayer Live Sync. Если вызов API не удается или контент не помечен для работы в реальном времени, происходит откат (fallback) к динамическому импорту.
Пример измененного кода:
Копировать код в буфер обмена
Подробнее смотрите в документации к CMS: CMS
В режиме fetch ни purge (очистка), ни minify (минификация) не применяются, поскольку исходный JSON отдается удаленным API с оригинальными названиями полей.
Итог: Статический vs Динамический
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Характеристика | Статический режим (Static Mode) | Динамический режим (Dynamic Mode) |
|---|---|---|
| Размер сборки (JS) | Больше (включает все языки для компонента) | Минимальный (только код, без контента) |
| Первоначальная загрузка | Мгновенная (контент в бандле) | Небольшая задержка (загрузка JSON) |
| Сетевые запросы | 0 дополнительных запросов | 1 запрос на каждый ключ словаря |
| Tree Shaking | На уровне компонентов | На уровне компонентов и локалей |
| Лучший сценарий | UI-компоненты, небольшие приложения | Крупный текст, многоязычность |
