Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI
История версий
- "Добавлены опции `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-файл, показывающий размер каждого модуля в вашем графе.
Копировать код в буфер обмена
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, }), ],});Как это работает
Intlayer использует подход на уровне компонентов. В отличие от глобальных JSON-файлов, ваш контент определяется рядом с вашими компонентами или внутри них. В процессе сборки Intlayer:
- Анализирует ваш код на наличие вызовов
useIntlayer. - Собирает соответствующий контент словаря.
- Заменяет вызов
useIntlayerоптимизированным кодом на основе вашей конфигурации.
Это гарантирует, что:
- Если компонент не импортирован, его контент не включается в бандл (удаление мертвого кода).
- Если компонент загружается лениво (lazy-loading), его контент также загружается лениво.
Настройка по платформам
Next.js
Для трансформации Next.js требуется плагин @intlayer/swc, так как Next.js использует SWC для сборки.
Этот плагин не устанавливается по умолчанию, так как плагины SWC для Next.js все еще находятся в стадии эксперимента. Это может измениться в будущем.
Копировать код в буфер обмена
npm install -D @intlayer/swcПосле установки Intlayer автоматически обнаружит и будет использовать плагин.
Конфигурация
Вы можете управлять тем, как Intlayer оптимизирует ваш бандл, с помощью свойства build в вашем 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. Это особенно полезно для больших словарей.
Копировать код в буфер обмена
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { build: { minify: true, },};export default config;Примечание: Минификация игнорируется, если optimize отключен или если включен Визуальный редактор (так как редактору требуется полный контент для возможности редактирования).
Очистка (Purging)
Очистка гарантирует, что в финальный бандл словарей будут включены только те ключи, которые действительно используются в вашем коде. Это может значительно уменьшить размер вашего бандла, если у вас есть большие словари со множеством ключей, которые используются не во всех частях вашего приложения.
Копировать код в буфер обмена
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { build: { purge: true, },};export default config;Примечание: Очистка игнорируется, если параметр optimize отключен.
Режим импорта (Import Mode)
Для больших приложений, включающих множество страниц и локалей, ваши JSON-файлы могут составлять значительную часть размера бандла. Intlayer позволяет вам контролировать способ загрузки словарей.
Режим импорта может быть определен по умолчанию глобально в вашем файле 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}}.
Копировать код в буфер обмена
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).
Пример трансформированного кода:
Копировать код в буфер обмена
// Ваш код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 на уровне локали. Пользователь, просматривающий английскую версию, скачает только английский словарь. Французский словарь никогда не загрузится.
- Минусы: Вызывает сетевой запрос (загрузку ассета) для каждого компонента во время гидратации.
- Лучше всего для: Больших текстовых блоков, статей или приложений с поддержкой многих языков, где размер бандла критичен.
Пример трансформированного кода:
Копировать код в буфер обмена
// Ваш код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-компоненты, небольшие приложения | Страницы с большим количеством текста, много языков |