@intlayer/docs 8.12.2 → 8.12.4-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/blog.cjs.map +1 -1
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/frequentQuestions.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +1 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +1 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +1 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +1 -0
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/cjs/legal.cjs.map +1 -1
- package/dist/esm/blog.mjs.map +1 -1
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/frequentQuestions.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/esm/legal.mjs.map +1 -1
- package/dist/types/blog.d.ts.map +1 -1
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/frequentQuestions.d.ts.map +1 -1
- package/dist/types/legal.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +250 -102
- package/docs/ar/configuration.md +10 -10
- package/docs/bn/bundle_optimization.md +252 -104
- package/docs/bn/configuration.md +10 -10
- package/docs/cs/bundle_optimization.md +253 -105
- package/docs/cs/configuration.md +10 -10
- package/docs/de/bundle_optimization.md +245 -97
- package/docs/de/configuration.md +10 -10
- package/docs/en/bundle_optimization.md +172 -49
- package/docs/en/configuration.md +10 -10
- package/docs/en-GB/bundle_optimization.md +230 -82
- package/docs/en-GB/configuration.md +10 -10
- package/docs/es/bundle_optimization.md +250 -102
- package/docs/es/configuration.md +10 -10
- package/docs/fr/bundle_optimization.md +223 -75
- package/docs/fr/configuration.md +10 -10
- package/docs/hi/bundle_optimization.md +253 -105
- package/docs/hi/configuration.md +10 -10
- package/docs/id/bundle_optimization.md +258 -110
- package/docs/id/configuration.md +10 -10
- package/docs/it/bundle_optimization.md +249 -103
- package/docs/it/configuration.md +10 -10
- package/docs/ja/bundle_optimization.md +245 -97
- package/docs/ja/configuration.md +10 -10
- package/docs/ko/bundle_optimization.md +253 -105
- package/docs/ko/configuration.md +10 -10
- package/docs/nl/bundle_optimization.md +249 -101
- package/docs/nl/configuration.md +10 -10
- package/docs/pl/bundle_optimization.md +258 -111
- package/docs/pl/configuration.md +10 -10
- package/docs/pt/bundle_optimization.md +256 -115
- package/docs/pt/configuration.md +10 -10
- package/docs/ru/bundle_optimization.md +253 -105
- package/docs/ru/configuration.md +10 -10
- package/docs/tr/bundle_optimization.md +255 -107
- package/docs/tr/configuration.md +10 -10
- package/docs/uk/bundle_optimization.md +250 -102
- package/docs/uk/configuration.md +10 -10
- package/docs/ur/bundle_optimization.md +257 -109
- package/docs/ur/configuration.md +10 -10
- package/docs/vi/bundle_optimization.md +259 -111
- package/docs/vi/configuration.md +10 -10
- package/docs/zh/bundle_optimization.md +260 -112
- package/docs/zh/configuration.md +10 -10
- package/docs/zh-TW/bundle_optimization.md +602 -0
- package/package.json +8 -8
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
4
|
-
title: Optimización del tamaño y rendimiento del
|
|
5
|
-
description:
|
|
3
|
+
updatedAt: 2026-06-07
|
|
4
|
+
title: Optimización del tamaño y rendimiento del paquete i18n
|
|
5
|
+
description: Reduce el tamaño del paquete de tu aplicación optimizando el contenido de internacionalización (i18n). Aprende cómo aprovechar el tree shaking y el lazy loading para diccionarios con Intlayer.
|
|
6
6
|
keywords:
|
|
7
|
-
- Optimización de
|
|
7
|
+
- Optimización de paquete
|
|
8
8
|
- Automatización de contenido
|
|
9
9
|
- Contenido dinámico
|
|
10
10
|
- Intlayer
|
|
@@ -16,33 +16,36 @@ slugs:
|
|
|
16
16
|
- concept
|
|
17
17
|
- bundle-optimization
|
|
18
18
|
history:
|
|
19
|
+
- version: 8.12.0
|
|
20
|
+
date: 2026-06-07
|
|
21
|
+
changes: "Añadidos `intlayerPurgeBabelPlugin` y `intlayerMinifyBabelPlugin` para Babel/Webpack; aclaración del flujo de plugins"
|
|
19
22
|
- version: 8.7.0
|
|
20
23
|
date: 2026-04-08
|
|
21
|
-
changes: "
|
|
24
|
+
changes: "Añadidas las opciones `minify` y `purge` a la configuración de compilación"
|
|
22
25
|
---
|
|
23
26
|
|
|
24
|
-
# Optimización del tamaño y rendimiento del
|
|
27
|
+
# Optimización del tamaño y rendimiento del paquete i18n
|
|
25
28
|
|
|
26
|
-
Uno de los desafíos más comunes con las soluciones i18n tradicionales
|
|
29
|
+
Uno de los desafíos más comunes con las soluciones i18n tradicionales basadas en archivos JSON es la gestión del tamaño del contenido. Si los desarrolladores no separan manualmente el contenido en espacios de nombres (namespaces), a menudo los usuarios terminan descargando traducciones para cada página y potencialmente para todos los idiomas solo para ver una página en concreto.
|
|
27
30
|
|
|
28
|
-
Por ejemplo, una aplicación con 10 páginas traducidas a 10 idiomas podría
|
|
31
|
+
Por ejemplo, una aplicación con 10 páginas traducidas a 10 idiomas podría provocar que un usuario descargue el contenido de 100 páginas, aunque solo necesite **una** (la página actual en el idioma actual). Esto genera un desperdicio de ancho de banda y tiempos de carga más lentos.
|
|
29
32
|
|
|
30
|
-
**Intlayer resuelve este problema a través de la optimización en
|
|
33
|
+
**Intlayer resuelve este problema a través de la optimización en el momento de la compilación.** Analiza tu código para detectar qué diccionarios se utilizan realmente por cada componente y reinyecta en tu paquete (bundle) solo el contenido necesario.
|
|
31
34
|
|
|
32
35
|
## Tabla de contenidos
|
|
33
36
|
|
|
34
37
|
<TOC />
|
|
35
38
|
|
|
36
|
-
##
|
|
39
|
+
## Analiza tu paquete
|
|
37
40
|
|
|
38
|
-
Analizar
|
|
41
|
+
Analizar tu paquete es el primer paso para identificar archivos JSON "pesados" y oportunidades de división de código (code-splitting). Estas herramientas generan un treemap visual del código compilado de tu aplicación, permitiéndote ver exactamente qué bibliotecas consumen más espacio.
|
|
39
42
|
|
|
40
43
|
<Tabs>
|
|
41
44
|
<Tab value="vite">
|
|
42
45
|
|
|
43
46
|
### Vite / Rollup
|
|
44
47
|
|
|
45
|
-
Vite utiliza Rollup
|
|
48
|
+
Vite utiliza Rollup bajo el capó. El complemento `rollup-plugin-visualizer` genera un archivo HTML interactivo que muestra el tamaño de cada módulo en tu gráfico de dependencias.
|
|
46
49
|
|
|
47
50
|
```bash
|
|
48
51
|
npm install -D rollup-plugin-visualizer
|
|
@@ -55,7 +58,7 @@ import { visualizer } from "rollup-plugin-visualizer";
|
|
|
55
58
|
export default defineConfig({
|
|
56
59
|
plugins: [
|
|
57
60
|
visualizer({
|
|
58
|
-
open: true, //
|
|
61
|
+
open: true, // Abre automáticamente el informe en tu navegador
|
|
59
62
|
filename: "stats.html",
|
|
60
63
|
gzipSize: true,
|
|
61
64
|
brotliSize: true,
|
|
@@ -69,7 +72,7 @@ export default defineConfig({
|
|
|
69
72
|
|
|
70
73
|
### Next.js (Turbopack)
|
|
71
74
|
|
|
72
|
-
Para proyectos que
|
|
75
|
+
Para proyectos que usan App Router y Turbopack, Next.js incluye un analizador experimental incorporado que no requiere dependencias adicionales.
|
|
73
76
|
|
|
74
77
|
```bash packageManager='npm'
|
|
75
78
|
npx next experimental-analyze
|
|
@@ -92,7 +95,7 @@ bun next experimental-analyze
|
|
|
92
95
|
|
|
93
96
|
### Next.js (Webpack)
|
|
94
97
|
|
|
95
|
-
Si
|
|
98
|
+
Si estás usando el bundler predeterminado de Webpack en Next.js, usa el analizador de paquetes oficial. Actívalo definiendo una variable de entorno durante la compilación.
|
|
96
99
|
|
|
97
100
|
```bash packageManager='npm'
|
|
98
101
|
npm install -D @next/bundle-analyzer
|
|
@@ -116,7 +119,7 @@ const withBundleAnalyzer = require("@next/bundle-analyzer")({
|
|
|
116
119
|
});
|
|
117
120
|
|
|
118
121
|
module.exports = withBundleAnalyzer({
|
|
119
|
-
//
|
|
122
|
+
// Tu configuración de Next.js
|
|
120
123
|
});
|
|
121
124
|
```
|
|
122
125
|
|
|
@@ -131,7 +134,7 @@ ANALYZE=true npm run build
|
|
|
131
134
|
|
|
132
135
|
### Webpack estándar
|
|
133
136
|
|
|
134
|
-
Para Create React App (ejected), Angular o configuraciones
|
|
137
|
+
Para Create React App (ejected), Angular, o configuraciones de Webpack personalizadas, utiliza el estándar de la industria `webpack-bundle-analyzer`.
|
|
135
138
|
|
|
136
139
|
```bash packageManager='npm'
|
|
137
140
|
npm install -D webpack-bundle-analyzer
|
|
@@ -168,16 +171,53 @@ export default {
|
|
|
168
171
|
|
|
169
172
|
## Cómo funciona
|
|
170
173
|
|
|
171
|
-
Intlayer utiliza un **enfoque por componente**. A diferencia de los archivos JSON globales,
|
|
174
|
+
Intlayer utiliza un **enfoque por componente**. A diferencia de los archivos JSON globales, el contenido se define junto a o dentro de tus componentes. Durante el proceso de compilación, Intlayer:
|
|
172
175
|
|
|
173
|
-
1.
|
|
174
|
-
2.
|
|
175
|
-
3.
|
|
176
|
+
1. **Analiza** tu código para encontrar llamadas a `useIntlayer`.
|
|
177
|
+
2. **Construye** el contenido del diccionario correspondiente.
|
|
178
|
+
3. **Reemplaza** la llamada a `useIntlayer` con un código optimizado basado en tu configuración.
|
|
176
179
|
|
|
177
|
-
Esto
|
|
180
|
+
Esto asegura que:
|
|
178
181
|
|
|
179
|
-
- Si un componente no se importa, su contenido no se incluye en el
|
|
180
|
-
- Si un componente se carga
|
|
182
|
+
- Si un componente no se importa, su contenido no se incluye en el paquete (Eliminación de código muerto o Dead Code Elimination).
|
|
183
|
+
- Si un componente se carga mediante lazy loading, su contenido también se carga dinámicamente.
|
|
184
|
+
|
|
185
|
+
## Referencia de Plugins
|
|
186
|
+
|
|
187
|
+
La optimización de compilación de Intlayer se divide en varios complementos discretos, cada uno con una responsabilidad única. Entender lo que hace cada uno evita la confusión al configurarlos.
|
|
188
|
+
|
|
189
|
+
### Plugins de Babel (`@intlayer/babel`)
|
|
190
|
+
|
|
191
|
+
Se utilizan directamente en `babel.config.js` para configuraciones basadas en Webpack (Next.js con Babel, CRA, Webpack personalizado, etc.).
|
|
192
|
+
|
|
193
|
+
| Plugin | Qué hace |
|
|
194
|
+
| :---------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
195
|
+
| `intlayerExtractBabelPlugin` | Analiza archivos `.content.ts` y escribe los diccionarios compilados en `.intlayer/` |
|
|
196
|
+
| `intlayerOptimizeBabelPlugin` | Reescribe `useIntlayer('key')` → `useDictionary(hash)` e inyecta la declaración `import` del diccionario correspondiente |
|
|
197
|
+
| `intlayerPurgeBabelPlugin` | Analiza todos los archivos fuente y elimina **los campos de contenido no utilizados** de los archivos JSON `.intlayer/**/*.json` |
|
|
198
|
+
| `intlayerMinifyBabelPlugin` | **Renombra las claves de campos de contenido** por alias alfabéticos cortos (`title` → `a`) tanto en archivos JSON como en el código fuente |
|
|
199
|
+
|
|
200
|
+
> **El orden de los plugins es importante.** En tu `babel.config.js`, los complementos de purga (purge) y minificación (minify) deben aparecer **antes** del complemento de optimización. La fase de optimización reemplaza `useIntlayer('key')` con una llamada opaca `useDictionary(hash)`, lo que borra la información de clave del diccionario que las fases de purga y minificación necesitan para saber qué campos se usan.
|
|
201
|
+
|
|
202
|
+
Cada complemento de Babel cuenta con una función auxiliar de opciones que lee tu `intlayer.config.ts` una vez en tiempo de carga y devuelve los valores pre-resueltos:
|
|
203
|
+
|
|
204
|
+
| Helper de opciones | Utilizado con |
|
|
205
|
+
| :--------------------------- | :---------------------------- |
|
|
206
|
+
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
207
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
208
|
+
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
209
|
+
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
210
|
+
|
|
211
|
+
### Plugins de Vite (`vite-intlayer`)
|
|
212
|
+
|
|
213
|
+
Los usuarios de Vite **nunca los configuran directamente**. Se vinculan de forma automática al invocar `withIntlayer()` en `vite.config.ts`. Las variables `build.purge` y `build.minify` en `intlayer.config.ts` alternan el comportamiento correspondiente sin necesidad de registrar ningún otro complemento.
|
|
214
|
+
|
|
215
|
+
| Plugin interno de Vite | Comportamiento equivalente |
|
|
216
|
+
| :--------------------- | :----------------------------------------------------------------------------------------------------------- |
|
|
217
|
+
| Analizador de uso | Igual que la fase de análisis del `intlayerPurgeBabelPlugin` |
|
|
218
|
+
| Poda de diccionarios | Igual que la fase de escritura JSON del `intlayerPurgeBabelPlugin` |
|
|
219
|
+
| Minificar diccionario | Igual que la fase de escritura JSON del `intlayerMinifyBabelPlugin` |
|
|
220
|
+
| Transformación Babel | Igual que la fase de renombramiento en código de `intlayerMinifyBabelPlugin` + `intlayerOptimizeBabelPlugin` |
|
|
181
221
|
|
|
182
222
|
## Configuración por plataforma
|
|
183
223
|
|
|
@@ -186,9 +226,9 @@ Esto garantiza que:
|
|
|
186
226
|
|
|
187
227
|
### Next.js
|
|
188
228
|
|
|
189
|
-
Next.js requiere el complemento `@intlayer/swc` para
|
|
229
|
+
Next.js requiere el complemento `@intlayer/swc` para la fase de optimización (reescritura de importaciones) ya que Next.js emplea SWC en las compilaciones.
|
|
190
230
|
|
|
191
|
-
> Este complemento no se instala
|
|
231
|
+
> Este complemento no se instala por defecto ya que los complementos SWC son experimentales en Next.js. Podría cambiar en el futuro.
|
|
192
232
|
|
|
193
233
|
```bash packageManager="npm"
|
|
194
234
|
npm install -D @intlayer/swc
|
|
@@ -208,19 +248,61 @@ bun add -d @intlayer/swc
|
|
|
208
248
|
|
|
209
249
|
Una vez instalado, Intlayer detectará y utilizará automáticamente el complemento.
|
|
210
250
|
|
|
251
|
+
Para las fases de **purga y minificación** (eliminación de campos y renombramiento), instala de manera adicional `@intlayer/babel` y añade los complementos de Babel. Debido a que Next.js usa SWC para la transformación pero aún evalúa `babel.config.js` para la configuración, estos complementos de Babel se ejecutan en un paso previo antes de SWC.
|
|
252
|
+
|
|
253
|
+
```bash packageManager="npm"
|
|
254
|
+
npm install -D @intlayer/babel
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
```javascript fileName="babel.config.js"
|
|
258
|
+
const {
|
|
259
|
+
intlayerPurgeBabelPlugin,
|
|
260
|
+
intlayerMinifyBabelPlugin,
|
|
261
|
+
getPurgePluginOptions,
|
|
262
|
+
getMinifyPluginOptions,
|
|
263
|
+
} = require("@intlayer/babel");
|
|
264
|
+
|
|
265
|
+
module.exports = {
|
|
266
|
+
presets: ["next/babel"],
|
|
267
|
+
plugins: [
|
|
268
|
+
// Purga: eliminar los campos de contenido no usados de .intlayer/**/*.json
|
|
269
|
+
[intlayerPurgeBabelPlugin, getPurgePluginOptions()],
|
|
270
|
+
// Minificar: renombrar claves de campos en el JSON y el código fuente
|
|
271
|
+
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
272
|
+
// Nota: intlayerOptimizeBabelPlugin NO es necesario aquí porque
|
|
273
|
+
// @intlayer/swc se encarga de reescribir useIntlayer → useDictionary.
|
|
274
|
+
],
|
|
275
|
+
};
|
|
276
|
+
```
|
|
277
|
+
|
|
211
278
|
</Tab>
|
|
212
279
|
<Tab value="vite">
|
|
213
280
|
|
|
214
281
|
### Vite
|
|
215
282
|
|
|
216
|
-
Vite utiliza el complemento `@intlayer/babel`,
|
|
283
|
+
Vite utiliza el complemento `@intlayer/babel`, el cual está incluido como una dependencia de `vite-intlayer`. El flujo de optimización completo —reescritura de importaciones, purga y minificación— está activado por defecto y no requiere registrar complementos extra.
|
|
284
|
+
|
|
285
|
+
Activa la purga y la minificación fijando las variables pertinentes en `intlayer.config.ts`:
|
|
286
|
+
|
|
287
|
+
```typescript fileName="intlayer.config.ts"
|
|
288
|
+
import type { IntlayerConfig } from "intlayer";
|
|
289
|
+
|
|
290
|
+
const config: IntlayerConfig = {
|
|
291
|
+
build: {
|
|
292
|
+
purge: true, // eliminar campos no usados de los JSON empaquetados
|
|
293
|
+
minify: true, // renombrar las claves de campos a alias cortos
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
export default config;
|
|
298
|
+
```
|
|
217
299
|
|
|
218
300
|
</Tab>
|
|
219
301
|
<Tab value="webpack">
|
|
220
302
|
|
|
221
|
-
### Webpack
|
|
303
|
+
### Webpack (y Next.js con Babel)
|
|
222
304
|
|
|
223
|
-
|
|
305
|
+
Instala `@intlayer/babel`:
|
|
224
306
|
|
|
225
307
|
```bash packageManager="npm"
|
|
226
308
|
npm install -D @intlayer/babel
|
|
@@ -238,14 +320,37 @@ pnpm add -D @intlayer/babel
|
|
|
238
320
|
bun add -d @intlayer/babel
|
|
239
321
|
```
|
|
240
322
|
|
|
241
|
-
|
|
323
|
+
Agrega los cuatro plugins a `babel.config.js` en el orden correcto:
|
|
324
|
+
|
|
325
|
+
```javascript fileName="babel.config.js"
|
|
242
326
|
const {
|
|
243
|
-
|
|
327
|
+
intlayerExtractBabelPlugin,
|
|
328
|
+
intlayerPurgeBabelPlugin,
|
|
329
|
+
intlayerMinifyBabelPlugin,
|
|
244
330
|
intlayerOptimizeBabelPlugin,
|
|
331
|
+
getExtractPluginOptions,
|
|
332
|
+
getPurgePluginOptions,
|
|
333
|
+
getMinifyPluginOptions,
|
|
334
|
+
getOptimizePluginOptions,
|
|
245
335
|
} = require("@intlayer/babel");
|
|
246
336
|
|
|
247
337
|
module.exports = {
|
|
248
|
-
plugins: [
|
|
338
|
+
plugins: [
|
|
339
|
+
// Extract: compilar archivos .content.ts → .intlayer/**/*.json
|
|
340
|
+
[intlayerExtractBabelPlugin, getExtractPluginOptions()],
|
|
341
|
+
|
|
342
|
+
// Purge: eliminar los campos no usados de .intlayer/**/*.json
|
|
343
|
+
// (lee la variable build.purge de intlayer.config.ts)
|
|
344
|
+
[intlayerPurgeBabelPlugin, getPurgePluginOptions()],
|
|
345
|
+
|
|
346
|
+
// Minify: renombrar las claves en el JSON y el código fuente
|
|
347
|
+
// (lee la variable build.minify de intlayer.config.ts)
|
|
348
|
+
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
349
|
+
|
|
350
|
+
// Optimize: reescribe useIntlayer('key') → useDictionary(hash)
|
|
351
|
+
// Debe ir al último porque elimina la clave del diccionario.
|
|
352
|
+
[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()],
|
|
353
|
+
],
|
|
249
354
|
};
|
|
250
355
|
```
|
|
251
356
|
|
|
@@ -254,57 +359,62 @@ module.exports = {
|
|
|
254
359
|
|
|
255
360
|
## Configuración
|
|
256
361
|
|
|
257
|
-
|
|
362
|
+
Puedes controlar cómo Intlayer optimiza el tamaño de tu paquete mediante la propiedad `build` en tu `intlayer.config.ts`.
|
|
258
363
|
|
|
259
364
|
```typescript fileName="intlayer.config.ts"
|
|
260
365
|
import { Locales, type IntlayerConfig } from "intlayer";
|
|
261
366
|
|
|
262
367
|
const config: IntlayerConfig = {
|
|
263
368
|
internationalization: {
|
|
264
|
-
locales: [Locales.ENGLISH, Locales.
|
|
369
|
+
locales: [Locales.ENGLISH, Locales.SPANISH],
|
|
265
370
|
defaultLocale: Locales.ENGLISH,
|
|
266
371
|
},
|
|
267
372
|
dictionary: {
|
|
268
373
|
importMode: "dynamic",
|
|
269
374
|
},
|
|
270
375
|
build: {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
* Indica si la construcción debe verificar los tipos de TypeScript
|
|
283
|
-
*/
|
|
284
|
-
checkTypes: false;
|
|
376
|
+
// Reemplaza llamadas a useIntlayer() con importaciones directas de diccionario
|
|
377
|
+
// al momento de compilar. undefined = auto (activo en prod), true = siempre, false = nunca.
|
|
378
|
+
optimize: undefined,
|
|
379
|
+
|
|
380
|
+
// Renombra las claves de campos de contenido en los diccionarios a alias cortos
|
|
381
|
+
// alfabéticos (ej. title → a). Reduce el tamaño de JSON; requiere optimize.
|
|
382
|
+
minify: true,
|
|
383
|
+
|
|
384
|
+
// Elimina los campos de contenido a los que no se acceda en el código fuente.
|
|
385
|
+
// Requiere optimize.
|
|
386
|
+
purge: true,
|
|
285
387
|
},
|
|
286
388
|
};
|
|
287
389
|
|
|
288
390
|
export default config;
|
|
289
391
|
```
|
|
290
392
|
|
|
291
|
-
> Se recomienda mantener
|
|
393
|
+
> Se recomienda mantener el valor por defecto (`undefined`) para `optimize` en la gran mayoría de los casos.
|
|
292
394
|
|
|
293
|
-
>
|
|
395
|
+
> Consulta la referencia de configuración para ver todas las opciones: [Configuración](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/configuration.md)
|
|
294
396
|
|
|
295
|
-
### Opciones de
|
|
397
|
+
### Opciones de compilación (Build Options)
|
|
296
398
|
|
|
297
|
-
|
|
399
|
+
| Propiedad | Tipo | Por defecto | Descripción |
|
|
400
|
+
| :------------- | :--------------------- | :---------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
401
|
+
| **`optimize`** | `boolean \| undefined` | `undefined` | Habilita el paso de reescritura de importación. `undefined` = activo solo en compilaciones de producción. `false` también deshabilita purga y minificación. |
|
|
402
|
+
| **`minify`** | `boolean` | `false` | Renombra las claves de campos en los JSON a alias alfabéticos cortos. También reescribe los accesos a propiedades que coincidan en el código fuente. No surte efecto si `optimize` es `false`. |
|
|
403
|
+
| **`purge`** | `boolean` | `false` | Elimina los campos a los que nunca se acceda en código estático desde los archivos JSON compilados. No surte efecto si `optimize` es `false`. |
|
|
298
404
|
|
|
299
|
-
|
|
300
|
-
| :------------- | :-------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
301
|
-
| **`optimize`** | `boolean` | `undefined` | Controla si la optimización de la construcción está habilitada. Si es `true`, Intlayer reemplaza las llamadas a diccionarios con inyecciones optimizadas. Si es `false`, la optimización se deshabilita. Ideal en prod. |
|
|
302
|
-
| **`minify`** | `boolean` | `false` | Si se deben minificar los diccionarios para reducir el tamaño del bundle. |
|
|
303
|
-
| **`purge`** | `boolean` | `false` | Si se deben purgar las claves no utilizadas en los diccionarios. |
|
|
405
|
+
### Minificación (renombramiento de campos)
|
|
304
406
|
|
|
305
|
-
|
|
407
|
+
`build.minify` **no** minifica tu código JavaScript; eso lo hace el bundler. Lo que hace es reducir el tamaño de los JSON resultantes al reemplazar toda clave definida por el usuario por un alias alfabético:
|
|
306
408
|
|
|
307
|
-
|
|
409
|
+
```
|
|
410
|
+
// Antes de minificar
|
|
411
|
+
{ "title": "Hola", "subtitle": "Mundo" }
|
|
412
|
+
|
|
413
|
+
// Después de minificar
|
|
414
|
+
{ "a": "Hola", "b": "Mundo" }
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Este mismo renombramiento se propaga en tus accesos a propiedades en el código, por lo que `content.title` pasa a ser `content.a` durante la compilación. El comportamiento en tiempo de ejecución sigue siendo idéntico.
|
|
308
418
|
|
|
309
419
|
```typescript fileName="intlayer.config.ts"
|
|
310
420
|
import type { IntlayerConfig } from "intlayer";
|
|
@@ -318,11 +428,13 @@ const config: IntlayerConfig = {
|
|
|
318
428
|
export default config;
|
|
319
429
|
```
|
|
320
430
|
|
|
321
|
-
>
|
|
431
|
+
> La minificación se omite cuando `optimize` es `false` o cuando `editor.enabled` es `true` (el Editor Visual requiere de los nombres de los campos originales para editarlos).
|
|
432
|
+
|
|
433
|
+
> La minificación también se omite con diccionarios de `importMode: 'fetch'`, dado que esos JSON son provistos por una API de terceros bajo sus nombres de campos originales; renombrarlo en el cliente perjudicaría a esa sincronización.
|
|
322
434
|
|
|
323
|
-
###
|
|
435
|
+
### Purga (eliminación de campos no utilizados)
|
|
324
436
|
|
|
325
|
-
|
|
437
|
+
`build.purge` analiza qué campos de contenido son visitados en tu código fuente y elimina al resto en el JSON compilado.
|
|
326
438
|
|
|
327
439
|
```typescript fileName="intlayer.config.ts"
|
|
328
440
|
import type { IntlayerConfig } from "intlayer";
|
|
@@ -336,34 +448,50 @@ const config: IntlayerConfig = {
|
|
|
336
448
|
export default config;
|
|
337
449
|
```
|
|
338
450
|
|
|
339
|
-
|
|
451
|
+
**Ejemplo:** en un diccionario con 5 campos de los cuales solo se emplean 2:
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
// Antes de la purga
|
|
455
|
+
{ "title": "…", "subtitle": "…", "cta": "…", "footer": "…", "badge": "…" }
|
|
456
|
+
|
|
457
|
+
// Después de la purga (solo título y subtítulo son consumidos)
|
|
458
|
+
{ "title": "…", "subtitle": "…" }
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
> La purga se omite cuando `optimize` es `false` o cuando `editor.enabled` es `true`.
|
|
462
|
+
|
|
463
|
+
> La purga también se omite por protección cuando un archivo del código fuente sea irreparable y no logre ejecutarse `useIntlayer` al mismo tiempo que una destructuración. Por lo cual todo el diccionario pasaría a formar parte por completo y sin purgar.
|
|
464
|
+
|
|
465
|
+
### Modo de Importación
|
|
340
466
|
|
|
341
|
-
|
|
467
|
+
Para aplicaciones grandes que incluyen múltiples páginas e idiomas, el contenido JSON puede ocupar un espacio significativo en tu paquete (bundle). Intlayer te permite controlar cómo se cargan los diccionarios usando la opción `importMode`.
|
|
342
468
|
|
|
343
|
-
|
|
469
|
+
### Definición global
|
|
344
470
|
|
|
345
|
-
El modo de importación puede
|
|
471
|
+
El modo de importación puede ser definido de manera global en tu archivo `intlayer.config.ts`.
|
|
346
472
|
|
|
347
473
|
```typescript fileName="intlayer.config.ts"
|
|
348
474
|
import type { IntlayerConfig } from "intlayer";
|
|
349
475
|
|
|
350
476
|
const config: IntlayerConfig = {
|
|
351
|
-
|
|
352
|
-
|
|
477
|
+
dictionary: {
|
|
478
|
+
importMode: "dynamic", // El valor predeterminado es 'static'
|
|
353
479
|
},
|
|
354
480
|
};
|
|
355
481
|
|
|
356
482
|
export default config;
|
|
357
483
|
```
|
|
358
484
|
|
|
359
|
-
|
|
485
|
+
### Definición individual
|
|
486
|
+
|
|
487
|
+
Puedes sobrescribir el modo de importación para diccionarios individuales en sus propios archivos `.content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5|md|mdx|yaml|yml}}`.
|
|
360
488
|
|
|
361
489
|
```ts
|
|
362
490
|
import { type Dictionary, t } from "intlayer";
|
|
363
491
|
|
|
364
492
|
const appContent: Dictionary = {
|
|
365
493
|
key: "app",
|
|
366
|
-
importMode: "dynamic", //
|
|
494
|
+
importMode: "dynamic", // Sobrescribe el valor global
|
|
367
495
|
content: {
|
|
368
496
|
// ...
|
|
369
497
|
},
|
|
@@ -372,28 +500,28 @@ const appContent: Dictionary = {
|
|
|
372
500
|
export default appContent;
|
|
373
501
|
```
|
|
374
502
|
|
|
375
|
-
| Propiedad | Tipo |
|
|
376
|
-
| :--------------- | :--------------------------------- |
|
|
377
|
-
| **`importMode`** | `'static'`, `'dynamic'`, `'fetch'` | `'static'`
|
|
503
|
+
| Propiedad | Tipo | Por Defecto | Descripción |
|
|
504
|
+
| :--------------- | :--------------------------------- | :---------- | :---------------------------------------------------------------------------------------------------------------------------------- |
|
|
505
|
+
| **`importMode`** | `'static'`, `'dynamic'`, `'fetch'` | `'static'` | **Obsoleto**: Utiliza `dictionary.importMode` en su lugar. Determina cómo se cargan los diccionarios (ver detalles a continuación). |
|
|
378
506
|
|
|
379
|
-
La configuración `importMode` dicta
|
|
380
|
-
Puede definirlo globalmente en el archivo `intlayer.config.ts` bajo el objeto `dictionary`, o puede sobrescribirlo para un diccionario específico en su archivo `.content.ts`.
|
|
507
|
+
La configuración `importMode` dicta la manera en que los contenidos del diccionario se inyectan en tu componente. Puedes fijarlo de forma global dentro del objeto `dictionary` en `intlayer.config.ts`, o para cada archivo en particular.
|
|
381
508
|
|
|
382
|
-
### 1. Modo
|
|
509
|
+
### 1. Modo Estático (`default`)
|
|
383
510
|
|
|
384
|
-
En modo estático, Intlayer reemplaza `useIntlayer`
|
|
511
|
+
En el modo estático, Intlayer reemplaza `useIntlayer` por `useDictionary` e inserta el diccionario directamente en el paquete de JavaScript.
|
|
385
512
|
|
|
386
|
-
- **
|
|
387
|
-
- **
|
|
388
|
-
- **
|
|
513
|
+
- **Ventajas:** Renderizado instantáneo (sincrónico), cero llamadas de red extra durante la hidratación (hydration).
|
|
514
|
+
- **Desventajas:** El paquete contendrá las traducciones de **todos** los idiomas posibles que ese componente pudiese alcanzar.
|
|
515
|
+
- **Mejor para:** Aplicaciones de una sola página (SPA).
|
|
389
516
|
|
|
390
517
|
**Ejemplo de código transformado:**
|
|
391
518
|
|
|
392
519
|
```tsx
|
|
393
|
-
//
|
|
520
|
+
// Tu código fuente
|
|
394
521
|
const content = useIntlayer("my-key");
|
|
395
522
|
|
|
396
|
-
//
|
|
523
|
+
// Ilustración del código optimizado después de la transformación (Static)
|
|
524
|
+
// Este código solo es de referencia y puede variar de forma interna
|
|
397
525
|
const content = useDictionary({
|
|
398
526
|
key: "my-key",
|
|
399
527
|
content: {
|
|
@@ -401,54 +529,74 @@ const content = useDictionary({
|
|
|
401
529
|
translation: {
|
|
402
530
|
en: "My title",
|
|
403
531
|
fr: "Mon titre",
|
|
532
|
+
es: "Mi título",
|
|
404
533
|
},
|
|
405
534
|
},
|
|
406
535
|
});
|
|
407
536
|
```
|
|
408
537
|
|
|
409
|
-
### 2. Modo
|
|
538
|
+
### 2. Modo Dinámico
|
|
410
539
|
|
|
411
|
-
En modo dinámico, Intlayer
|
|
540
|
+
En el modo dinámico, Intlayer sustituye `useIntlayer` con `useDictionaryAsync`. Para ello emplea importaciones dinámicas `import()` como mecanismo de Lazy Loading cargando el archivo de su propio lenguaje de modo pertinente.
|
|
412
541
|
|
|
413
|
-
- **
|
|
414
|
-
- **
|
|
415
|
-
- **
|
|
542
|
+
- **Ventajas:** **Tree shaking a nivel de idioma.** El usuario que navega tu portal en español, solo descargará el JSON en español. El JSON en francés jamás será consumido.
|
|
543
|
+
- **Desventajas:** Dispara una llamada HTTP adicional (asset) desde cada uno de los elementos presentes al hidratarse.
|
|
544
|
+
- **Mejor para:** Textos pesados o portales globales donde prime la velocidad y reducir el gasto del paquete o (bundle size).
|
|
416
545
|
|
|
417
546
|
**Ejemplo de código transformado:**
|
|
418
547
|
|
|
419
548
|
```tsx
|
|
420
|
-
//
|
|
549
|
+
// Tu código fuente
|
|
421
550
|
const content = useIntlayer("my-key");
|
|
422
551
|
|
|
423
|
-
//
|
|
552
|
+
// Ilustración de código dinámico procesado
|
|
424
553
|
const content = useDictionaryAsync({
|
|
425
554
|
en: () =>
|
|
426
555
|
import(".intlayer/dynamic_dictionary/my-key/en.json").then(
|
|
427
556
|
(mod) => mod.default
|
|
428
557
|
),
|
|
429
|
-
|
|
430
|
-
import(".intlayer/dynamic_dictionary/my-key/
|
|
558
|
+
es: () =>
|
|
559
|
+
import(".intlayer/dynamic_dictionary/my-key/es.json").then(
|
|
431
560
|
(mod) => mod.default
|
|
432
561
|
),
|
|
433
562
|
});
|
|
434
563
|
```
|
|
435
564
|
|
|
436
|
-
> Al usar `importMode: 'dynamic'`, si
|
|
565
|
+
> Al usar `importMode: 'dynamic'`, debes tener en cuenta que, si hay 100 componentes distintos llamando a `useIntlayer` en una pantalla, el navegador hará 100 descargas diminutas por separado. Trata de limitar dichas peticiones, creando, por ejemplo, archivos de diccionario que abarquen más de un átomo o grupo y unifica su llamado por vista. Varios archivos de contenido pueden tener a su vez la misma clave dictada fusionándose automáticamente.
|
|
437
566
|
|
|
438
567
|
### 3. Modo Fetch
|
|
439
568
|
|
|
440
|
-
|
|
569
|
+
Trabaja de un modo afín al Dinámico, con la disyuntiva de tratar de consultar su modelo hacia la API remota de "Intlayer Live Sync". Confiando de primera mano sobre este y recayendo en la importación dinámica en el fallo de este.
|
|
570
|
+
|
|
571
|
+
**Ejemplo de código transformado:**
|
|
572
|
+
|
|
573
|
+
```tsx
|
|
574
|
+
// Tu código fuente
|
|
575
|
+
const content = useIntlayer("my-key");
|
|
576
|
+
|
|
577
|
+
// Código Fetch procesado de modo ilustrativo
|
|
578
|
+
const content = useDictionaryAsync({
|
|
579
|
+
en: () =>
|
|
580
|
+
fetch("https://intlayer.my-domain.com/dictionary/my-key/en").then((res) =>
|
|
581
|
+
res.json()
|
|
582
|
+
),
|
|
583
|
+
es: () =>
|
|
584
|
+
fetch("https://intlayer.my-domain.com/dictionary/my-key/es").then((res) =>
|
|
585
|
+
res.json()
|
|
586
|
+
),
|
|
587
|
+
});
|
|
588
|
+
```
|
|
441
589
|
|
|
442
|
-
>
|
|
590
|
+
> Aprende más desde la guía del CMS: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_CMS.md)
|
|
443
591
|
|
|
444
|
-
>
|
|
592
|
+
> Recordamos que con el modo "Fetch", el código original prevalecerá y sus elementos no se purgarán ni formarán parte de una minificación preestablecida.
|
|
445
593
|
|
|
446
594
|
## Resumen: Estático vs Dinámico
|
|
447
595
|
|
|
448
|
-
| Característica
|
|
449
|
-
|
|
|
450
|
-
| **Tamaño del
|
|
451
|
-
| **Carga
|
|
452
|
-
| **
|
|
453
|
-
| **Tree Shaking**
|
|
454
|
-
| **Mejor
|
|
596
|
+
| Característica | Modo Estático | Modo Dinámico |
|
|
597
|
+
| :-------------------------- | :------------------------------------------ | :-------------------------------------------- |
|
|
598
|
+
| **Tamaño JS del paquete** | Alto (Integra todos los locales existentes) | Pequeño (Baja solo su modelo correspondiente) |
|
|
599
|
+
| **Carga Inicial** | Instantánea | Ligera demora o espera |
|
|
600
|
+
| **Llamadas de red (Fetch)** | 0 adicionales | 1 por key del diccionario |
|
|
601
|
+
| **Tree Shaking** | Presente desde el componente | Desde el componente + Local |
|
|
602
|
+
| **Mejor uso para:** | Elementos visuales, Apps ligeras | Enormes bloques de texto, Múltiples regiones |
|
package/docs/es/configuration.md
CHANGED
|
@@ -681,16 +681,16 @@ routing: {
|
|
|
681
681
|
|
|
682
682
|
Cuando se utiliza el almacenamiento mediante galletas (cookies), se pueden configurar atributos adicionales:
|
|
683
683
|
|
|
684
|
-
| Campo | Tipo | Descripción
|
|
685
|
-
| ---------- | ----------------------------------------------------- |
|
|
686
|
-
| `name` | `string` | Nombre de la galleta (cookie). Predeterminado: `'INTLAYER_LOCALE'`
|
|
687
|
-
| `domain` | `string` | Dominio de la galleta. Predeterminado: `undefined`
|
|
688
|
-
| `path` | `string` | Ruta de la galleta. Predeterminado: `undefined`
|
|
689
|
-
| `secure` | `boolean` | Requiere HTTPS. Predeterminado: `undefined`
|
|
690
|
-
| `httpOnly` | `boolean` | Bandera HTTP-only. Predeterminado: `undefined`
|
|
691
|
-
| `sameSite` | `'strict'` | <br/> `'lax'` | <br/> `'none'` | Política de SameSite.
|
|
692
|
-
| `expires` | `Date` | <br/> `number`
|
|
693
|
-
| `maxAge` | `number` | Tiempo de vida en segundos desde la creación. Tiene precedencia sobre `expires`. Predeterminado: `undefined`
|
|
684
|
+
| Campo | Tipo | Descripción |
|
|
685
|
+
| ---------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
686
|
+
| `name` | `string` | Nombre de la galleta (cookie). Predeterminado: `'INTLAYER_LOCALE'` |
|
|
687
|
+
| `domain` | `string` | Dominio de la galleta. Predeterminado: `undefined` |
|
|
688
|
+
| `path` | `string` | Ruta de la galleta. Predeterminado: `undefined` |
|
|
689
|
+
| `secure` | `boolean` | Requiere HTTPS. Predeterminado: `undefined` |
|
|
690
|
+
| `httpOnly` | `boolean` | Bandera HTTP-only. Predeterminado: `undefined` |
|
|
691
|
+
| `sameSite` | `'strict'` | <br/> `'lax'` | <br/> `'none'` | Política de SameSite. |
|
|
692
|
+
| `expires` | `Date` | <br/> `number` | <br/> `string` | Un `number` indica días desde la creación; una `Date` (o cadena de fecha ISO) es una fecha de expiración absoluta. Predeterminado: `undefined` |
|
|
693
|
+
| `maxAge` | `number` | Tiempo de vida en segundos desde la creación. Tiene precedencia sobre `expires`. Predeterminado: `undefined` |
|
|
694
694
|
|
|
695
695
|
#### Atributos de Almacenamiento de Localidad (Locale Storage Attributes)
|
|
696
696
|
|