Автор:
    БозданиС:2025-11-25ПослСднСС обновлСниС:2026-08-09

    ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сборки i18n ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

    Одной ΠΈΠ· самых распространСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ использовании Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ i18n, ΠΎΠΏΠΈΡ€Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° JSON-Ρ„Π°ΠΉΠ»Ρ‹, являСтся ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. Если Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π½Π° пространства ΠΈΠΌΠ΅Π½ (namespaces) Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ часто Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы ΠΈ, ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ языка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ страницу.

    НапримСр, Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ с 10 страницами, ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° 10 языков, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ сразу для 100 страниц, хотя Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° (тСкущая страница Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ языкС). Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ напрасной Ρ‚Ρ€Π°Ρ‚Π΅ пропускной способности ΠΈ замСдлСнию Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

    Intlayer Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ посрСдством ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎ врСмя сборки (build-time optimization). Он Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ваш ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ словари фактичСски ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅, ΠΈ встраиваСт Π² Π²Π°ΡˆΡƒ сборку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚.

    ОглавлСниС

    Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

    Intlayer ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… JSON-Ρ„Π°ΠΉΠ»ΠΎΠ², ваш ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ опрСдСляСтся рядом с вашими ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½ΠΈΡ…. Π’ процСссС сборки Intlayer выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

    1. АнализируСт ваш ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ useIntlayer.
    2. Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ словаря.
    3. ЗамСняСт Π²Ρ‹Π·ΠΎΠ² useIntlayer ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° основС вашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

    Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

    • Если ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π΅ импортируСтся, Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² сборку (устранСниС ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° β€” Dead Code Elimination).
    • Если ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ загруТаСтся Π»Π΅Π½ΠΈΠ²ΠΎ (lazy-loaded), Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ загруТаСтся Π»Π΅Π½ΠΈΠ²ΠΎ.

    Настройка ΠΏΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°ΠΌ

    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 β€” Ρ‚Π°ΠΊΠΈΠ΅ сборки всё Ρ€Π°Π²Π½ΠΎ проходят ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, просто Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π°Π½Π΄Π»Π°.
    bash
    npm install -D @intlayer/swc
    
    Cargo.toml
    [dependencies]
    intlayer-swc-plugin = "*"
    

    View on Crates.io

    ПослС установки Intlayer автоматичСски ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот ΠΏΠ»Π°Π³ΠΈΠ½.

    ΠŸΡ€ΠΎΡ…ΠΎΠ΄Ρ‹ purge ΠΈ ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ (ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ) Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π½ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π½ΠΈ babel.config.js. ΠžΠ±Π΅Ρ€Π½ΠΈΡ‚Π΅ Π²Π°ΡˆΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² withIntlayer ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ„Π»Π°Π³ΠΈ Π² intlayer.config.ts:

    next.config.ts
    import { withIntlayer } from "next-intlayer/server";
    import type { NextConfig } from "next";
    
    const nextConfig: NextConfig = {/* ваша конфигурация */};
    
    export default withIntlayer(nextConfig);
    
    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      build: {
        purge: true, // удаляСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ поля ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΈΠ· собранного JSON
        minify: true, // ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ псСвдонимы
      },
    };
    
    export default config;
    

    Π’ΠΎ врСмя next build withIntlayer Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ваши исходники, пСрСписываСт скомпилированныС словари ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ пСрСимСнования ΠΏΠΎΠ»Π΅ΠΉ Π² @intlayer/swc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обновляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ обращСния ΠΊ свойствам Π² вашСм ΠΊΠΎΠ΄Π΅.

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ асинхронный withIntlayer, Π° Π½Π΅ withIntlayerSync. Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π΅ запускаСт ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π°Π½Π°Π»ΠΈΠ·Π°, поэтому purge ΠΈ минификация с Π½ΠΈΠΌ Π½Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚.
    Purge ΠΈ минификация Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ next build β€” ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π²ΠΎ врСмя next dev.

    Π‘ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΠ΅ вСрсии (Π΄ΠΎ 9.2.1) Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈ @intlayer/babel ΠΈ Ρ„Π°ΠΉΠ» babel.config.js, ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉ intlayerPurgeBabelPlugin ΠΈ intlayerMinifyBabelPlugin. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Ρ‘Π½.

    Vite

    Vite ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ»Π°Π³ΠΈΠ½ @intlayer/babel, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² качСствС зависимости ΠΊ vite-intlayer. ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (pipeline) β€” ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ², ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ (purge) ΠΈ минификация (minify) β€” Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ рСгистрации Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ².

    Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ purge ΠΈ minify, установив ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π»Π°Π³ΠΈ Π² intlayer.config.ts:

    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      build: {
        purge: true, // удаляСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ поля ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΈΠ· собранных JSON
        minify: true, // ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ алиасы
      },
    };
    
    export default config;
    

    Webpack (и Next.js с Babel)

    УстановитС @intlayer/babel:

    bash
    npm install -D @intlayer/babel
    

    Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² babel.config.js Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС:

    babel.config.js
    const {
      intlayerExtractBabelPlugin,
      intlayerPurgeBabelPlugin,
      intlayerMinifyBabelPlugin,
      intlayerOptimizeBabelPlugin,
      getExtractPluginOptions,
      getPurgePluginOptions,
      getMinifyPluginOptions,
      getOptimizePluginOptions,
    } = require("@intlayer/babel");
    
    module.exports = {
      plugins: [
        // Extract: ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ .content.ts β†’ .intlayer/**/*.json
        [intlayerExtractBabelPlugin, getExtractPluginOptions()],
    
        // Purge: удаляСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ поля ΠΈΠ· .intlayer/**/*.json
        //    (считываСт Ρ„Π»Π°Π³ build.purge ΠΈΠ· intlayer.config.ts)
        [intlayerPurgeBabelPlugin, getPurgePluginOptions()],
    
        // Minify: ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ΠΈ Π² JSON + исходном ΠΊΠΎΠ΄Π΅
        //    (считываСт Ρ„Π»Π°Π³ build.minify ΠΈΠ· intlayer.config.ts)
        [intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
    
        // Optimize: пСрСписываСт useIntlayer('key') β†’ useDictionary(hash)
        //    Π”ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ послСдним, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ удаляСт ΠΊΠ»ΡŽΡ‡ словаря.
        [intlayerOptimizeBabelPlugin, getOptimizePluginOptions()],
      ],
    };
    

    Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌ

    ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ сборки 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/минификация JSONNode, Π²Π½ΡƒΡ‚Ρ€ΠΈ withIntlayer()Π§ΠΈΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ исходный Ρ„Π°ΠΉΠ» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, пСрСписываСт .intlayer/**/*.json, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ пСрСимСнования
    ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Π½ΠΈΠ΅ исходного ΠΊΠΎΠ΄Π° (content.title β†’ .a)@intlayer/swc (Wasm)ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ пСрСимСнования ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ обращСниям ΠΊ свойствам Π² вашСм ΠΊΠΎΠ΄Π΅
    ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Π½ΠΈΠ΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ² (useIntlayer β†’ dict)@intlayer/swc (Wasm)Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ intlayerOptimizeBabelPlugin

    ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ поля Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ псСвдоним ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ…, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ состояния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, поэтому эта ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° выполняСтся Π² Node; ΠΏΠ»Π°Π³ΠΈΠ½ SWC ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ лишь Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

    ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

    Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Intlayer ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π°ΡˆΡƒ сборку, Ρ‡Π΅Ρ€Π΅Π· свойство build Π² вашСм intlayer.config.ts.

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.RUSSIAN],
        defaultLocale: Locales.ENGLISH,
      },
      dictionary: {
        importMode: "dynamic",
      },
      build: {
        // ЗамСняСт Π²Ρ‹Π·ΠΎΠ²Ρ‹ useIntlayer() Π½Π° прямыС ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ словарСй Π²ΠΎ врСмя сборки.
        // undefined = auto (Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅), true = всСгда, false = Π½ΠΈΠΊΠΎΠ³Π΄Π°.
        optimize: undefined,
    
        // ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π² скомпилированных словарях Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅
        // Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Π΅ алиасы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, title β†’ a). Π£ΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ JSON; Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ optimize.
        minify: true,
    
        // УдаляСт поля ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ происходит ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π² исходном ΠΊΠΎΠ΄Π΅.
        // Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ optimize.
        purge: true,
      },
    };
    
    export default config;
    
    Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях рСкомСндуСтся ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (undefined) для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° optimize.
    Π‘ΠΌ. справочник ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ со всСми опциями: ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сборки (Build Options)

    Π‘Π²ΠΎΠΉΡΡ‚Π²ΠΎΠ’ΠΈΠΏΠŸΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅
    optimizeboolean / undefinedundefinedΠ’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„Π°Π·Ρƒ пСрСзаписи ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ². undefined = Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½-сборок. false Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ purge ΠΈ minify.
    minifybooleanfalseΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π² скомпилированных JSON-Ρ„Π°ΠΉΠ»Π°Ρ… Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Π΅ алиасы. Π’Π°ΠΊΠΆΠ΅ пСрСзаписываСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ обращСния Π² исходном ΠΊΠΎΠ΄Π΅. НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ optimize: false.
    purgebooleanfalseУдаляСт поля ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΈΠ· скомпилированных JSON-Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ происходит статичСского обращСния Π² ΠΊΠΎΠ΄Π΅. НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ optimize: false.

    ΠœΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ (Minification) β€” ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΏΠΎΠ»Π΅ΠΉ

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ build.minify Π½Π΅ занимаСтся ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ вашСго JavaScript-Π±Π°Π½Π΄Π»Π° β€” с этой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ ваш сборщик. ВмСсто этого ΠΎΠ½ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ JSON-Ρ„Π°ΠΉΠ»ΠΎΠ² скомпилированных словарСй, замСняя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠ»ΡŽΡ‡ Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹ΠΉ алиас:

    plaintext
    // ΠŸΠ΅Ρ€Π΅Π΄ ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ
    { "title": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", "subtitle": "ΠœΠΈΡ€" }
    
    // ПослС ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
    { "a": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", "b": "ΠœΠΈΡ€" }
    

    АналогичноС ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ примСняСтся ΠΊΠΎ всСм обращСниям ΠΊ свойствам Π² вашСм исходном ΠΊΠΎΠ΄Π΅, поэтому content.title Π² скомпилированном Π²Ρ‹Ρ…ΠΎΠ΄Π΅ прСвратится Π² content.a. ПовСдСниС прилоТСния Π²ΠΎ врСмя выполнСния остаСтся Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ.

    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      build: {
        minify: true,
      },
    };
    
    export default config;
    
    ΠœΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ пропускаСтся, Ссли optimize установлСн Π² false. Когда editor.enabled ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, ΠΎΠ½Π° ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ выполняСтся, Π½ΠΎ Π±Π΅Π· этапа пСрСимСнования ΠΏΠΎΠ»Π΅ΠΉ β€” Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· keyPath, поэтому исходныС ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ.
    Π’ Next.js минификация Ρ‚Π°ΠΊΠΆΠ΅ пропускаСтся, ΠΊΠΎΠ³Π΄Π° @intlayer/swc Π½Π΅ установлСн ΠΈΠ»ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ (Next.js Π½ΠΈΠΆΠ΅ 16.1.0). Плагин β€” это Ρ‚Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°, которая пСрСписываСт обращСния Π² исходном ΠΊΠΎΠ΄Π΅, поэтому ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ словарСй Π±Π΅Π· Π½Π΅Π³ΠΎ оставило Π±Ρ‹ ваш ΠΊΠΎΠ΄ Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΌ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС Π½Π΅Ρ‚.
    ΠœΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Ρ‚Π°ΠΊΠΆΠ΅ пропускаСтся для словарСй, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· importMode: 'fetch', ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… JSON выдаСтся ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ API с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»Π΅ΠΉ β€” ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π½Π° клиСнтской сторонС Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ сСрвСр/ΠΊΠ»ΠΈΠ΅Π½Ρ‚.

    Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ (Purging)

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ build.purge Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ полям ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° фактичСски обращаСтся ваш исходный ΠΊΠΎΠ΄, ΠΈ удаляСт всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ поля ΠΈΠ· скомпилированных JSON-Ρ„Π°ΠΉΠ»ΠΎΠ².

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

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ΠΏΡΡ‚ΡŒΡŽ полями, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π°:

    plaintext
    // Π”ΠΎ очистки (purge)
    { "title": "…", "subtitle": "…", "cta": "…", "footer": "…", "badge": "…" }
    
    // ПослС очистки (Π² ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ title ΠΈ subtitle)
    { "title": "…", "subtitle": "…" }
    
    ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° пропускаСтся, Ссли optimize установлСн Π² false. Она остаётся Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° editor.enabled ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true β€” ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π½Π΅ читаСтся Π½ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, поэтому Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚. Π’ Next.js ΠΎΠ½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ пропускаСтся, ΠΊΠΎΠ³Π΄Π° @intlayer/swc нСдоступСн ΠΈ ΠΊΠΎΠ³Π΄Π° настроСны Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠ· Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ² совмСстимости.
    ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ отмСняСтся ΠΈΠ· сообраТСний надСТности, ΠΊΠΎΠ³Π΄Π° исходный Ρ„Π°ΠΉΠ» Π½Π΅ удаСтся Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ (парсинг), ΠΈΠ»ΠΈ Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ useIntlayer присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ пСрСдаСтся способами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ статичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, spreading ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‡Π΅Ρ€Π΅Π· prop Π±Π΅Π· дСструктуризации). Π’ этих случаях сохраняСтся вСсь ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

    Π Π΅ΠΆΠΈΠΌ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° (Import Mode)

    Для ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… нСсколько страниц ΠΈ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ, ваш JSON ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° вашСй сборки (bundle). Intlayer позволяСт Π²Π°ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ способ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ словарСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ importMode.

    Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

    Π Π΅ΠΆΠΈΠΌ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ глобально Π² вашСм Ρ„Π°ΠΉΠ»Π΅ intlayer.config.ts.

    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      dictionary: {
        importMode: "dynamic", // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” 'static'
      },
    };
    
    export default config;
    

    ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ словаря

    Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… словарСй Π² ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… .content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5|md|mdx|yaml|yml}}.

    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. БтатичСский Ρ€Π΅ΠΆΠΈΠΌ (Static Mode - default)

    Π’ статичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ Intlayer замСняСт useIntlayer Π½Π° useDictionary ΠΈ внСдряСт ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ нСпосрСдствСнно Π² ΠΏΠ°ΠΊΠ΅Ρ‚ (bundle) JavaScript.

    • ΠŸΠ»ΡŽΡΡ‹: ΠœΠ³Π½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ (синхронный), ноль Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сСтСвых запросов Π²ΠΎ врСмя Π³ΠΈΠ΄Ρ€Π°Ρ‚Π°Ρ†ΠΈΠΈ (hydration).
    • ΠœΠΈΠ½ΡƒΡΡ‹: Π‘Π±ΠΎΡ€ΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ для всСх доступных языков, Ссли ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.
    • ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для: ΠžΠ΄Π½ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (SPA).

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

    tsx
    // Π’Π°Ρˆ ΠΊΠΎΠ΄
    const content = useIntlayer("my-key");
    
    // ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ послС прСобразования (Static)
    // Π­Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ, Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎ сообраТСниям ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
    const content = useDictionary({
      key: "my-key",
      content: {
        nodeType: "translation",
        translation: {
          en: "My title",
          ru: "Мой заголовок",
        },
      },
    });
    

    2. ДинамичСский Ρ€Π΅ΠΆΠΈΠΌ (Dynamic Mode)

    Π’ динамичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ Intlayer замСняСт useIntlayer Π½Π° useDictionaryAsync. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ import() (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ Suspense), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ JSON для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ.

    • ΠŸΠ»ΡŽΡΡ‹: Tree shaking Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π»ΠΎΠΊΠ°Π»ΠΈ (языка). ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π°Π½Π³Π»ΠΈΠΉΡΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ английский ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ. Русский ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½.
    • ΠœΠΈΠ½ΡƒΡΡ‹: Π’Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сСтСвой запрос (ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ассСтов) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π²ΠΎ врСмя Π³ΠΈΠ΄Ρ€Π°Ρ‚Π°Ρ†ΠΈΠΈ.
    • ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для: ΠšΡ€ΡƒΠΏΠ½Ρ‹Ρ… тСкстовых Π±Π»ΠΎΠΊΠΎΠ², статСй ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ большого числа языков, Π³Π΄Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ сборки ΠΈΠΌΠ΅Π΅Ρ‚ критичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

    tsx
    // Π’Π°Ρˆ ΠΊΠΎΠ΄
    const content = useIntlayer("my-key");
    
    // Π˜Π»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (Dynamic)
    // Π­Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ, Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ
    const content = useDictionaryAsync({
      en: () =>
        import(".intlayer/dynamic_dictionary/my-key/en.json").then(
          (mod) => mod.default
        ),
      ru: () =>
        import(".intlayer/dynamic_dictionary/my-key/ru.json").then(
          (mod) => mod.default
        ),
    });
    
    Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ importMode: 'dynamic' ΠΈ Ρƒ вас Π΅ΡΡ‚ΡŒ 100 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ useIntlayer, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ 100 ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ получСния Ρ„Π°ΠΉΠ»ΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этого Β«Π²ΠΎΠ΄ΠΎΠΏΠ°Π΄Π°Β» запросов, Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π² мСньшСм количСствС Ρ„Π°ΠΉΠ»ΠΎΠ² .content (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ΄ΠΈΠ½ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π° Ρ€Π°Π·Π΄Π΅Π» страницы), Π° Π½Π΅ создавайтС ΠΈΡ… ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² .content с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ: Intlayer ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ ΠΈΡ… Π² ΠΎΠ΄ΠΈΠ½ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ.

    3. Π Π΅ΠΆΠΈΠΌ Fetch

    Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ динамичСскому Ρ€Π΅ΠΆΠΈΠΌΡƒ, Π½ΠΎ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ словари ΠΈΠ· API синхронизации Intlayer Live Sync. Если Π²Ρ‹Π·ΠΎΠ² API Π½Π΅ удаСтся ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, происходит ΠΎΡ‚ΠΊΠ°Ρ‚ (fallback) ΠΊ динамичСскому ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρƒ.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

    tsx
    // Π’Π°Ρˆ ΠΊΠΎΠ΄
    const content = useIntlayer("my-key");
    
    // Π˜Π»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (Fetch)
    const content = useDictionaryAsync({
      en: () =>
        fetch("https://intlayer.my-domain.com/dictionary/my-key/en").then((res) =>
          res.json()
        ),
      ru: () =>
        fetch("https://intlayer.my-domain.com/dictionary/my-key/ru").then((res) =>
          res.json()
        ),
    });
    
    ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ смотритС Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ CMS: CMS
    Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ fetch Π½ΠΈ purge (очистка), Π½ΠΈ minify (минификация) Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ исходный JSON отдаСтся ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ API с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ названиями ΠΏΠΎΠ»Π΅ΠΉ.

    Π˜Ρ‚ΠΎΠ³: БтатичСский vs ДинамичСский

    Π₯арактСристикаБтатичСский Ρ€Π΅ΠΆΠΈΠΌ (Static Mode)ДинамичСский Ρ€Π΅ΠΆΠΈΠΌ (Dynamic Mode)
    Π Π°Π·ΠΌΠ΅Ρ€ сборки (JS)Π‘ΠΎΠ»ΡŒΡˆΠ΅ (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС языки для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°)ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄, Π±Π΅Π· ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°)
    ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°ΠœΠ³Π½ΠΎΠ²Π΅Π½Π½Π°Ρ (ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π² Π±Π°Π½Π΄Π»Π΅)НСбольшая Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° (Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° JSON)
    Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ запросы0 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов1 запрос Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ словаря
    Tree ShakingНа ΡƒΡ€ΠΎΠ²Π½Π΅ компонСнтовНа ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ
    Π›ΡƒΡ‡ΡˆΠΈΠΉ сцСнарийUI-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, нСбольшиС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠšΡ€ΡƒΠΏΠ½Ρ‹ΠΉ тСкст, ΠΌΠ½ΠΎΠ³ΠΎΡΠ·Ρ‹Ρ‡Π½ΠΎΡΡ‚ΡŒ

    Анализ вашСй сборки

    Анализ вашСй сборки (Π±Π°Π½Π΄Π»Π°) β€” это самый прямой способ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ «тяТСлыС» JSON-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ возмоТности для раздСлСния ΠΊΠΎΠ΄Π° (code-splitting). Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ инструмСнты Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ (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
    
    webpack.config.ts
    import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";
    
    export default {
      plugins: [
        new BundleAnalyzerPlugin({
          analyzerMode: "static",
          reportFilename: "bundle-analyzer.html",
          openAnalyzer: false,
        }),
      ],
    };