HomeAmbiente di testVetrinaAppDocBlog
    • Englishinglese
      EN
    • русскийrusso
      RU
    • 日本語giapponese
      JA
    • françaisfrancese
      FR
    • 한국어coreano
      KO
    • 中文cinese
      ZH
    • españolspagnolo
      ES
    • Deutschtedesco
      DE
    • العربيةarabo
      AR
    • italianoitaliano
      IT
    • British Englishinglese britannico
      EN-GB
    • portuguêsportoghese
      PT
    • हिन्दीhindi
      HI
    • Türkçeturco
      TR
    • polskipolacco
      PL
    • Indonesiaindonesiano
      ID
    • Tiếng Việtvietnamita
      VI
    • українськаucraino
      UK
    /
    Filtra la documentazione per framework
    Alt+←
    Perché Intlayer?
    Iniziare
    Concetto
    • Come funziona Intlayer
    • Configurazione
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Editor visuale
    • CMS
    • Integrazione CI/CD
    • TraduzionePluraleEnumerazioneCondizioneGenereInserimentoFileAnnidamentoMarkdownHTMLRecupero funzione
    • File per locale
    • Compilatore
    • Compilazione automatica
    • Test
    • Ottimizzazione del bundle
    Ambiente
    • Next.js 14 e App Router
      Next.js 15
      Next.js senza locale URL
      Next.js e Page Router
      Compiler
    • Tanstack Start Solid
    • Astro e React
      Astro e Svelte
      Astro e Vue
      Astro e Solid
      Astro e Preact
      Astro e Lit
      Astro e Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt e Vue
    • Vite e Solid
    • SvelteKit
    • Vite e Preact
    • Vite e Vanilla JS
    • Vite e Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native e Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx e React
    Plugins
    • JSON
    • gettext (.po)
    Estensione VS Code
    Agente
    • Server MCP
    • Abilità dell’agente
    Versioni
    • v8
    • v7
    • v6
    Benchmark
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Blog
    Fai una domanda
    1. Documentation
    2. Concetto
    3. Bundle optimization
    Creazione:2025-11-25Ultimo aggiornamento:2026-04-08
    Riferimento a questa documentazione al tuo assistente AI preferito
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Pose una domanda e ottieni un riassunto del documento facendo riferimento a questa pagina e al provider AI di tua scelta

    Cronologia delle versioni

    1. "Aggiunte le opzioni `minify` e `purge` alla configurazione di build"
      v8.7.008/04/2026

    Il contenuto di questa pagina è stato tradotto con un'IA.

    Vedi l'ultima versione del contenuto originale in inglese
    Modifica questa documentazione

    Se hai un’idea per migliorare questa documentazione, non esitare a contribuire inviando una pull request su GitHub.

    Collegamento GitHub alla documentazione
    Copia

    Copia il Markdown del documento nella porta-documenti

    Ottimizzazione della dimensione del bundle i18n e prestazioni

    Una delle sfide più comuni con le soluzioni i18n tradizionali che si affidano a file JSON è la gestione della dimensione dei contenuti. Se gli sviluppatori non separano manualmente i contenuti in namespace, gli utenti finiscono spesso per scaricare le traduzioni per ogni pagina e potenzialmente per ogni lingua solo per visualizzare una singola pagina.

    Ad esempio, un'applicazione con 10 pagine tradotte in 10 lingue potrebbe comportare il download dei contenuti di 100 pagine da parte di un utente, anche se ne serve solo una (quella corrente nella lingua corrente). Ciò comporta uno spreco di larghezza di banda e tempi di caricamento più lenti.

    Intlayer risolve questo problema attraverso l'ottimizzazione in fase di build. Analizza il tuo codice per rilevare quali dizionari sono effettivamente utilizzati per ogni componente e reinserisce solo il contenuto necessario nel tuo bundle.

    Sommario

    Scansiona il tuo bundle

    Analizzare il tuo bundle è il primo passo per identificare file JSON "pesanti" e opportunità di code-splitting. Questi strumenti generano una mappa ad albero visiva del codice compilato della tua applicazione, permettendoti di vedere esattamente quali librerie stanno consumando più spazio.

    Vite / Rollup

    Vite utilizza Rollup internamente. Il plugin rollup-plugin-visualizer genera un file HTML interattivo che mostra le dimensioni di ogni modulo nel tuo grafico.

    bash
    Copiare il codice

    Copiare il codice nella clipboard

    npm install -D rollup-plugin-visualizer
    vite.config.ts
    Copiare il codice

    Copiare il codice nella clipboard

    import { defineConfig } from "vite";import { visualizer } from "rollup-plugin-visualizer";export default defineConfig({ plugins: [   visualizer({     open: true, // Apre automaticamente il report nel tuo browser     filename: "stats.html",     gzipSize: true,     brotliSize: true,   }), ],});

    Next.js (Turbopack)

    Per i progetti che utilizzano App Router e Turbopack, Next.js fornisce un analizzatore sperimentale integrato che non richiede dipendenze extra.

    bash
    Copiare il codice

    Copiare il codice nella clipboard

    npx next experimental-analyze

    Next.js (Webpack)

    Se stai utilizzando il bundler Webpack predefinito in Next.js, usa l'analizzatore di bundle ufficiale. Attivalo impostando una variabile d'ambiente durante la build.

    bash
    Copiare il codice

    Copiare il codice nella clipboard

    npm install -D @next/bundle-analyzer
    next.config.js
    Copiare il codice

    Copiare il codice nella clipboard

    const withBundleAnalyzer = require("@next/bundle-analyzer")({ enabled: process.env.ANALYZE === "true",});module.exports = withBundleAnalyzer({ // La tua configurazione Next.js});

    Utilizzo:

    bash
    Copiare il codice

    Copiare il codice nella clipboard

    ANALYZE=true npm run build

    Webpack Standard

    Per Create React App (ejected), Angular o configurazioni Webpack personalizzate, usa lo standard di settore webpack-bundle-analyzer.

    bash
    Copiare il codice

    Copiare il codice nella clipboard

    npm install -D webpack-bundle-analyzer
    Copiare il codice

    Copiare il codice nella clipboard

    import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";export default { plugins: [   new BundleAnalyzerPlugin({     analyzerMode: "static",     reportFilename: "bundle-analyzer.html",     openAnalyzer: false,   }), ],};

    Come funziona

    Intlayer utilizza un approccio per componente. A differenza dei file JSON globali, i tuoi contenuti sono definiti insieme o all'interno dei tuoi componenti. Durante il processo di build, Intlayer:

    1. Analizza il tuo codice per trovare le chiamate a useIntlayer.
    2. Costruisce il contenuto del dizionario corrispondente.
    3. Sostituisce la chiamata a useIntlayer con codice ottimizzato in base alla tua configurazione.

    Questo assicura che:

    • Se un componente non viene importato, il suo contenuto non viene incluso nel bundle (Dead Code Elimination).
    • Se un componente è caricato in modalità lazy, anche il suo contenuto viene caricato in modalità lazy.

    Configurazione per piattaforma

    Next.js

    Next.js richiede il plugin @intlayer/swc per gestire la trasformazione, poiché Next.js utilizza SWC per le build.

    Questo plugin non è installato di default perché i plugin SWC sono ancora sperimentali per Next.js. Potrebbe cambiare in futuro.
    bash
    Copiare il codice

    Copiare il codice nella clipboard

    npm install -D @intlayer/swc

    Una volta installato, Intlayer rileverà e utilizzerà automaticamente il plugin.

    Vite

    Vite utilizza il plugin @intlayer/babel che è incluso come dipendenza di vite-intlayer. L'ottimizzazione è abilitata di default. Non c'è altro da fare.

    Webpack

    Per abilitare l'ottimizzazione del bundle con Intlayer su Webpack, è necessario installare e configurare il plugin Babel (@intlayer/babel) o SWC (@intlayer/swc) appropriato.

    bash
    Copiare il codice

    Copiare il codice nella clipboard

    npm install -D @intlayer/babel
    babel.config.js
    Copiare il codice

    Copiare il codice nella clipboard

    const { getOptimizePluginOptions, intlayerOptimizeBabelPlugin,} = require("@intlayer/babel");module.exports = { plugins: [[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()]],};

    Configurazione

    Puoi controllare come Intlayer ottimizza il tuo bundle tramite la proprietà build nel tuo intlayer.config.ts.

    intlayer.config.ts
    Copiare il codice

    Copiare il codice nella clipboard

    import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  internationalization: {    locales: [Locales.ENGLISH, Locales.FRENCH],    defaultLocale: Locales.ENGLISH,  },  dictionary: {    importMode: "dynamic",  },  build: {    /**     * Minimizza i dizionari per ridurre la dimensione del bundle.     */     minify: true;    /**     * Elimina le chiavi inutilizzate nei dizionari     */     purge: true;    /**     * Indica se la build deve controllare i tipi TypeScript     */    checkTypes: false;  },};export default config;
    Mantenere l'opzione predefinita per optimize è raccomandato nella stragrande maggioranza dei casi.
    Vedi la doc di configurazione per maggiori dettagli: Configurazione

    Opzioni di Build

    Le seguenti opzioni sono disponibili sotto l'oggetto di configurazione build:

    Mostra tutto il contenuto della tabella

    Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro

    Proprietà Tipo Predefinito Descrizione
    optimize boolean undefined Controlla se l'ottimizzazione della build è abilitata. Se true, Intlayer sostituisce le chiamate ai dizionari con iniezioni ottimizzate. Se false, l'ottimizzazione è disabilitata. Idealmente a true in produzione.
    minify boolean false Se minimizzare i dizionari per ridurre la dimensione del bundle.
    purge boolean false Se eliminare le chiavi inutilizzate nei dizionari.

    Minimizzazione

    Minimizzare i dizionari rimuove spazi bianchi non necessari, commenti e riduce la dimensione dei contenuti JSON. Ciò è particolarmente utile per dizionari di grandi dimensioni.

    intlayer.config.ts
    Copiare il codice

    Copiare il codice nella clipboard

    import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    minify: true,  },};export default config;
    Nota: La minimizzazione viene ignorata se optimize è disabilitato o se il Visual Editor è abilitato (poiché l'editor ha bisogno del contenuto completo per consentire le modifiche).

    Purging (Eliminazione)

    Il purging assicura che solo le chiavi effettivamente utilizzate nel codice siano incluse nel bundle finale dei dizionari. Ciò può ridurre significativamente la dimensione del bundle se si hanno dizionari grandi con molte chiavi che non vengono utilizzate in ogni parte dell'applicazione.

    intlayer.config.ts
    Copiare il codice

    Copiare il codice nella clipboard

    import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  build: {    purge: true,  },};export default config;
    Nota: Il purging viene ignorato se optimize è disabilitato.

    Modalità di Importazione

    Per applicazioni di grandi dimensioni, comprese diverse pagine e lingue, i tuoi file JSON possono rappresentare una parte significativa della dimensione del tuo bundle. Intlayer ti consente di controllare come vengono caricati i dizionari.

    La modalità di importazione può essere definita di default a livello globale nel file intlayer.config.ts.

    intlayer.config.ts
    Copiare il codice

    Copiare il codice nella clipboard

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

    Così come per ogni dizionario nei tuoi file .content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5}}.

    ts
    Copiare il codice

    Copiare il codice nella clipboard

    import { type Dictionary, t } from "intlayer";const appContent: Dictionary = {  key: "app",  importMode: "dynamic", // Sovrascrive la modalità di importazione predefinita  content: {    // ...  },};export default appContent;
    Mostra tutto il contenuto della tabella

    Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro

    Proprietà Tipo Predefinito Descrizione
    importMode 'static', 'dynamic', 'fetch' 'static' Deprecato: Usa dictionary.importMode invece. Determina come vengono caricati i dizionari (vedi i dettagli di seguito).

    L'impostazione importMode dettata come il contenuto del dizionario viene iniettato nel tuo componente. Puoi definirlo globalmente nel file intlayer.config.ts sotto l'oggetto dictionary, oppure puoi sovrascriverlo per un dizionario specifico nel suo file .content.ts.

    1. Modalità Statica (default)

    In modalità statica, Intlayer sostituisce useIntlayer con useDictionary e inietta il dizionario direttamente nel bundle JavaScript.

    • Pro: Rendering istantaneo (sincrono), zero richieste di rete extra durante l'idratazione.
    • Contro: Il bundle include le traduzioni per tutte le lingue disponibili per quel componente specifico.
    • Ideale per: Single Page Applications (SPA).

    Esempio di codice trasformato:

    tsx
    Copiare il codice

    Copiare il codice nella clipboard

    // Il tuo codiceconst content = useIntlayer("my-key");// Codice ottimizzato (Statico)const content = useDictionary({  key: "my-key",  content: {    nodeType: "translation",    translation: {      en: "My title",      fr: "Mon titolo",    },  },});

    2. Modalità Dinamica

    In modalità dinamica, Intlayer sostituisce useIntlayer con useDictionaryAsync. Questo utilizza import() (meccanismo simile a Suspense) per caricare in modalità lazy specificamente il JSON per la lingua corrente.

    • Pro: Tree shaking a livello di lingua. Un utente che visualizza la versione inglese scaricherà solo il dizionario inglese. Il dizionario francese non viene mai caricato.
    • Contro: Attiva una richiesta di rete (recupero dell'asset) per componente durante l'idratazione.
    • Ideale per: Grandi blocchi di testo, articoli o applicazioni che supportano molte lingue in cui la dimensione del bundle è critica.

    Esempio di codice trasformato:

    tsx
    Copiare il codice

    Copiare il codice nella clipboard

    // Il tuo codiceconst content = useIntlayer("my-key");// Codice ottimizzato (Dinamico)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    ),});
    Quando usi importMode: 'dynamic', se hai 100 componenti che usano useIntlayer in una singola pagina, il browser tenterà 100 recuperi separati. Per evitare questo "waterfall" di richieste, raggruppa i contenuti in meno file .content (ad esempio, un dizionario per sezione della pagina) invece di uno per ogni singolo componente atomico.

    3. Modalità Fetch

    Si comporta in modo simile alla modalità dinamica ma tenta prima di recuperare i dizionari dall'API Intlayer Live Sync. Se la chiamata API fallisce o il contenuto non è contrassegnato per gli aggiornamenti live, ricorre all'importazione dinamica.

    Vedi la documentazione CMS per maggiori dettagli: CMS
    In modalità fetch, purghe e minimizzazioni non possono essere utilizzate.

    Riepilogo: Statico vs Dinamico

    Mostra tutto il contenuto della tabella

    Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro

    Caratteristica Modalità Statica Modalità Dinamica
    Dimensione Bundle JS Maggiore (include tutte le lingue per il componente) Minore (solo codice, nessun contenuto)
    Caricamento Iniziale Istantaneo (Il contenuto è nel bundle) Leggero ritardo (Recupera JSON)
    Richieste di Rete 0 richieste extra 1 richiesta per dizionario
    Tree Shaking Livello componente Livello componente + Livello lingua
    Miglior Caso d'Uso Componenti UI, Piccole Applicazioni Pagine con molto testo, molte lingue
    Test
    Next.js
    Alt+→

    In questa pagina

      Le discussioni sono anonime e vengono regolarmente esaminate per affrontare problemi comuni. Sentiti libero di condividere idee per nuove funzionalità, feedback sulla documentazione o qualsiasi cosa relativa a Intlayer, utilizziamo questi input per definire la nostra roadmap e migliorare il prodotto.

      npm install -D rollup-plugin-visualizer
      import { defineConfig } from "vite";import { visualizer } from "rollup-plugin-visualizer";export default defineConfig({ plugins: [   visualizer({     open: true, // Apre automaticamente il report nel tuo browser     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({ // La tua configurazione 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: {    /**     * Minimizza i dizionari per ridurre la dimensione del bundle.     */     minify: true;    /**     * Elimina le chiavi inutilizzate nei dizionari     */     purge: true;    /**     * Indica se la build deve controllare i tipi 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", // Sovrascrive la modalità di importazione predefinita  content: {    // ...  },};export default appContent;
      // Il tuo codiceconst content = useIntlayer("my-key");// Codice ottimizzato (Statico)const content = useDictionary({  key: "my-key",  content: {    nodeType: "translation",    translation: {      en: "My title",      fr: "Mon titolo",    },  },});
      // Il tuo codiceconst content = useIntlayer("my-key");// Codice ottimizzato (Dinamico)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    ),});