์ž‘๊ฐ€:
    ์ƒ์„ฑ:2026-01-21๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:2026-01-21

    intlayerPrune Vite ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฌธ์„œ

    intlayerPrune Vite ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒˆ๋“ค์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์‚ฌ์ „(dictionary)์„ ํŠธ๋ฆฌ ์‰์ดํ‚นํ•˜๊ณ  ์ œ๊ฑฐ(prune)ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋‹ค๊ตญ์–ด ์ฝ˜ํ…์ธ ๋งŒ ํฌํ•จ๋˜์–ด ์ตœ์ข… ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ”Œ๋Ÿฌ๊ทธ์ธ์€ intlayer()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด๋ฏธ ์ž๋™์œผ๋กœ ํฌํ•จ๋˜๊ณ  ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ์Šคํƒ์„ ์ง์ ‘ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    ์‚ฌ์šฉ๋ฒ•

    intlayer()์˜ ์ผ๋ถ€๋กœ (๊ถŒ์žฅ)

    Intlayer config๋ฅผ ํ†ตํ•ด pruning์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด main plugin์ด ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

    ts
    // intlayer.config.ts
    import { defineConfig } from "intlayer";
    
    export default defineConfig({
      build: {
        optimize: true, // prune๊ณผ minify๋ฅผ ๋ชจ๋‘ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค
      },
    });
    
    ts
    // vite.config.ts
    import { defineConfig } from "vite";
    import { intlayer } from "vite-intlayer";
    
    export default defineConfig({
      plugins: [intlayer()],
    });
    

    Standalone

    ํ”Œ๋Ÿฌ๊ทธ์ธ ์Šคํƒ์„ ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ, intlayerPrune๊ณผ intlayerMinify๋Š” ํ•œ ๋ฒˆ ์ƒ์„ฑํ•˜๊ณ  ๋‘˜ ๋‹ค์— ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” PruneContext ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค:

    ts
    // vite.config.ts
    import { defineConfig } from "vite";
    import { intlayerPrune, intlayerMinify } from "vite-intlayer";
    import { createPruneContext } from "@intlayer/babel";
    import { getConfiguration } from "@intlayer/config/node";
    
    const intlayerConfig = getConfiguration();
    const pruneContext = createPruneContext();
    
    export default defineConfig({
      plugins: [
        intlayerPrune(intlayerConfig, pruneContext),
        intlayerMinify(intlayerConfig, pruneContext), // ์„ ํƒ์‚ฌํ•ญ, ๋™์ผํ•œ context์—์„œ ์ฝ์Œ
      ],
    });
    

    ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€

    1. Usage analysis (buildStart)

    buildStart ์ค‘์— intlayerOptimize ํ”Œ๋Ÿฌ๊ทธ์ธ(intlayer()์˜ ์ผ๋ถ€)์€ build.filesList์— ๋‚˜์—ด๋œ ๋ชจ๋“  component ์†Œ์Šค ํŒŒ์ผ์„ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ useIntlayer('key') ๋˜๋Š” getIntlayer('key') ํ˜ธ์ถœ์— ๋Œ€ํ•ด, ์ •ํ™•ํžˆ ์–ด๋–ค ํ•„๋“œ๊ฐ€ ์•ก์„ธ์Šค๋˜๋Š”์ง€ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

    ts
    const { title, description } = useIntlayer("myDict");
    // records: myDict โ†’ { title, description }
    

    ์ด๋Š” ๋ชจ๋“  transform ํ˜ธ์ถœ์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— pruneContext.fieldUsageMap์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    2. JSON pruning (transform, enforce: 'pre')

    Vite๊ฐ€ ์ปดํŒŒ์ผ๋œ dictionary JSON ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ, intlayerPrune์€ Vite์˜ built-in JSON โ†’ ESM ๋ณ€ํ™˜ ์ „์— ์ด๋ฅผ ๊ฐ€๋กœ์ฑ•๋‹ˆ๋‹ค. pruneContext์—์„œ field-usage map์„ ์ฝ๊ณ  ๊ธฐ๋ก๋œ usage set์— ์—†๋Š” ๋ชจ๋“  content field๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๋‘ ๊ฐ€์ง€ content shape์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค:

    • Static dictionaries โ€” { nodeType: "translation", translation: { en: {...}, fr: {...} } }. Fields๋Š” translation ๋‚ด์—์„œ per-locale๋ณ„๋กœ pruned๋ฉ๋‹ˆ๋‹ค.
    • Dynamic (per-locale) dictionaries โ€” flat { fieldA: ..., fieldB: ... }. Fields๋Š” top level์—์„œ pruned๋ฉ๋‹ˆ๋‹ค.

    3. Edge cases

    ์‚ฌ์ „์˜ ์ฝ˜ํ…์ธ  ๊ตฌ์กฐ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๋น„์ •์ƒ์ ์ธ ์ค‘์ฒฉ๋œ ํ˜•ํƒœ), ์ด๋Š” pruneContext.dictionariesWithEdgeCases์— ์ถ”๊ฐ€๋˜๊ณ  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. intlayerMinify๋„ ์ด๋Ÿฌํ•œ ์‚ฌ์ „์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

    4. Field-rename map

    pruning์ด ์„ฑ๊ณตํ•˜๋ฉด, intlayerPrune์€ pruneContext.dictionaryKeyToFieldRenameMap๋„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์›๋ณธ ํ•„๋“œ ์ด๋ฆ„์„ ์งง์€ ๋ณ„์นญ์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. intlayerMinify๋Š” ์ด ๋งต์„ ์ฝ์–ด ์ถœ๋ ฅ JSON์˜ ํ•„๋“œ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ณ , intlayerOptimize์˜ Babel rename pass๋Š” ์†Œ์Šค ํŒŒ์ผ์˜ property ์ ‘๊ทผ์„ ๊ทธ์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    ํ™œ์„ฑํ™” ์กฐ๊ฑด

    intlayerPrune์€ ๋‹ค์Œ์˜ ๋ชจ๋“  ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ๋งŒ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค:

    1. Vite ๋ช…๋ น์ด build์ž…๋‹ˆ๋‹ค.
    2. build.optimize๊ฐ€ true์ž…๋‹ˆ๋‹ค (๋˜๋Š” undefined์ธ ๊ฒฝ์šฐ, ๋นŒ๋“œ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ๊ฐ’์ด true์ž…๋‹ˆ๋‹ค).
    3. Intlayer ๊ตฌ์„ฑ์—์„œ build.purge๊ฐ€ true์ž…๋‹ˆ๋‹ค.

    editor.enabled๊ฐ€ true์ผ ๋•Œ๋„ ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฃผ์–ผ ์—๋””ํ„ฐ๋Š” ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์€ ์‚ฌ์ „์— ๋Œ€ํ•ด dictionaryKey์™€ keyPath๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ํŽธ์ง‘์„ ํ•ด์„ํ•˜๋ฉฐ, ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•ด๋‹น ์‚ฌ์ „์„ ์ „ํ˜€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌ๋œ ํ•„๋“œ๋Š” ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋„ ์ฝ์ง€ ์•Š๋Š” ํ•„๋“œ์ด๋ฏ€๋กœ, ๋ Œ๋”๋ง๋˜์ง€๋„ ํŽ˜์ด์ง€์—์„œ ์„ ํƒ๋˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.