@intlayer/docs 7.3.0 → 7.3.1
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/generated/docs.entry.cjs +19 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +19 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +180 -0
- package/docs/ar/vs_code_extension.md +4 -0
- package/docs/de/bundle_optimization.md +190 -0
- package/docs/de/how_works_intlayer.md +1 -1
- package/docs/de/vs_code_extension.md +4 -0
- package/docs/en/bundle_optimization.md +180 -0
- package/docs/en/configuration.md +5 -2
- package/docs/en/how_works_intlayer.md +1 -1
- package/docs/en/vs_code_extension.md +7 -0
- package/docs/en-GB/bundle_optimization.md +180 -0
- package/docs/en-GB/how_works_intlayer.md +1 -1
- package/docs/en-GB/vs_code_extension.md +4 -0
- package/docs/es/bundle_optimization.md +190 -0
- package/docs/es/how_works_intlayer.md +1 -1
- package/docs/es/vs_code_extension.md +4 -0
- package/docs/fr/bundle_optimization.md +180 -0
- package/docs/fr/how_works_intlayer.md +1 -1
- package/docs/fr/vs_code_extension.md +4 -0
- package/docs/hi/bundle_optimization.md +180 -0
- package/docs/hi/vs_code_extension.md +4 -0
- package/docs/id/bundle_optimization.md +180 -0
- package/docs/id/how_works_intlayer.md +1 -1
- package/docs/id/vs_code_extension.md +4 -0
- package/docs/it/bundle_optimization.md +180 -0
- package/docs/it/how_works_intlayer.md +1 -1
- package/docs/it/vs_code_extension.md +4 -0
- package/docs/ja/bundle_optimization.md +180 -0
- package/docs/ja/vs_code_extension.md +4 -0
- package/docs/ko/bundle_optimization.md +180 -0
- package/docs/ko/vs_code_extension.md +4 -0
- package/docs/pl/bundle_optimization.md +180 -0
- package/docs/pl/how_works_intlayer.md +1 -1
- package/docs/pl/vs_code_extension.md +4 -0
- package/docs/pt/bundle_optimization.md +180 -0
- package/docs/pt/how_works_intlayer.md +1 -1
- package/docs/pt/vs_code_extension.md +4 -0
- package/docs/ru/bundle_optimization.md +180 -0
- package/docs/ru/vs_code_extension.md +4 -0
- package/docs/tr/bundle_optimization.md +180 -0
- package/docs/tr/how_works_intlayer.md +1 -1
- package/docs/tr/vs_code_extension.md +4 -0
- package/docs/vi/bundle_optimization.md +180 -0
- package/docs/vi/vs_code_extension.md +4 -0
- package/docs/zh/bundle_optimization.md +180 -0
- package/docs/zh/vs_code_extension.md +4 -0
- package/package.json +6 -6
- package/src/generated/docs.entry.ts +19 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-11-25
|
|
3
|
+
updatedAt: 2025-11-25
|
|
4
|
+
title: Otimizando o Tamanho e Desempenho do Bundle i18n
|
|
5
|
+
description: Reduza o tamanho do bundle da aplicação otimizando o conteúdo de internacionalização (i18n). Aprenda a aproveitar tree shaking e lazy loading para dicionários com Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Otimização de Bundle
|
|
8
|
+
- Automação de Conteúdo
|
|
9
|
+
- Conteúdo Dinâmico
|
|
10
|
+
- Intlayer
|
|
11
|
+
- Next.js
|
|
12
|
+
- JavaScript
|
|
13
|
+
- React
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- concept
|
|
17
|
+
- bundle-optimization
|
|
18
|
+
history:
|
|
19
|
+
- version: 6.0.0
|
|
20
|
+
date: 2025-11-25
|
|
21
|
+
changes: Histórico inicial
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Otimizando o Tamanho e Desempenho do Bundle i18n
|
|
25
|
+
|
|
26
|
+
Um dos desafios mais comuns com soluções tradicionais de i18n que dependem de arquivos JSON é gerenciar o tamanho do conteúdo. Se os desenvolvedores não separarem manualmente o conteúdo em namespaces, os usuários frequentemente acabam baixando traduções para todas as páginas e potencialmente para todos os idiomas apenas para visualizar uma única página.
|
|
27
|
+
|
|
28
|
+
Por exemplo, uma aplicação com 10 páginas traduzidas em 10 idiomas pode resultar em um usuário baixando o conteúdo de 100 páginas, mesmo que ele precise de **apenas uma** (a página atual no idioma atual). Isso leva a desperdício de largura de banda e tempos de carregamento mais lentos.
|
|
29
|
+
|
|
30
|
+
> Para detectar isso, você pode usar analisadores de bundle como `rollup-plugin-visualizer` (vite), `@next/bundle-analyzer` (next.js) ou `webpack-bundle-analyzer` (React CRA / Angular / etc).
|
|
31
|
+
|
|
32
|
+
**Intlayer resolve esse problema por meio da otimização em tempo de build.** Ele analisa seu código para detectar quais dicionários são realmente usados por componente e reinjeta apenas o conteúdo necessário no seu bundle.
|
|
33
|
+
|
|
34
|
+
## Índice
|
|
35
|
+
|
|
36
|
+
<TOC />
|
|
37
|
+
|
|
38
|
+
## Como Funciona
|
|
39
|
+
|
|
40
|
+
Intlayer utiliza uma **abordagem por componente**. Diferente dos arquivos JSON globais, seu conteúdo é definido junto ou dentro dos seus componentes. Durante o processo de build, o Intlayer:
|
|
41
|
+
|
|
42
|
+
1. **Analisa** seu código para encontrar chamadas de `useIntlayer`.
|
|
43
|
+
2. **Constrói** o conteúdo do dicionário correspondente.
|
|
44
|
+
3. **Substitui** a chamada `useIntlayer` por código otimizado baseado na sua configuração.
|
|
45
|
+
|
|
46
|
+
Isso garante que:
|
|
47
|
+
|
|
48
|
+
- Se um componente não for importado, seu conteúdo não será incluído no bundle (Eliminação de Código Morto).
|
|
49
|
+
- Se um componente for carregado de forma lazy, seu conteúdo também será carregado de forma lazy.
|
|
50
|
+
|
|
51
|
+
## Configuração por Plataforma
|
|
52
|
+
|
|
53
|
+
### Next.js
|
|
54
|
+
|
|
55
|
+
Next.js requer o plugin `@intlayer/swc` para lidar com a transformação, pois o Next.js utiliza SWC para builds.
|
|
56
|
+
|
|
57
|
+
> Este plugin é instalado por padrão porque plugins SWC ainda são experimentais para Next.js. Isso pode mudar no futuro.
|
|
58
|
+
|
|
59
|
+
### Vite
|
|
60
|
+
|
|
61
|
+
O Vite utiliza o plugin `@intlayer/babel`, que está incluído como dependência do `vite-intlayer`. A otimização está habilitada por padrão.
|
|
62
|
+
|
|
63
|
+
### Webpack
|
|
64
|
+
|
|
65
|
+
Para habilitar a otimização do bundle com Intlayer no Webpack, você precisa instalar e configurar o plugin Babel (`@intlayer/babel`) ou SWC (`@intlayer/swc`) apropriado.
|
|
66
|
+
|
|
67
|
+
### Expo / Lynx
|
|
68
|
+
|
|
69
|
+
A otimização do bundle **ainda não está disponível** para esta plataforma. O suporte será adicionado em uma versão futura.
|
|
70
|
+
|
|
71
|
+
## Configuração
|
|
72
|
+
|
|
73
|
+
Você pode controlar como o Intlayer otimiza seu bundle através da propriedade `build` no seu arquivo `intlayer.config.ts`.
|
|
74
|
+
|
|
75
|
+
```typescript fileName="intlayer.config.ts"
|
|
76
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
77
|
+
|
|
78
|
+
const config: IntlayerConfig = {
|
|
79
|
+
internationalization: {
|
|
80
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
81
|
+
defaultLocale: Locales.ENGLISH,
|
|
82
|
+
},
|
|
83
|
+
build: {
|
|
84
|
+
optimize: true,
|
|
85
|
+
importMode: "static", // ou 'dynamic'
|
|
86
|
+
traversePattern: ["**/*.{js,ts,mjs,cjs,jsx,tsx}", "!**/node_modules/**"],
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export default config;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
> Manter a opção padrão para `optimize` é recomendado na maioria dos casos.
|
|
94
|
+
|
|
95
|
+
> Veja a documentação de configuração para mais detalhes: [Configuração](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/configuration.md)
|
|
96
|
+
|
|
97
|
+
### Opções de Build
|
|
98
|
+
|
|
99
|
+
As seguintes opções estão disponíveis no objeto de configuração `build`:
|
|
100
|
+
|
|
101
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
102
|
+
| :-------------------- | :------------------------------ | :------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
103
|
+
| **`optimize`** | `boolean` | `undefined` | Controla se a otimização da build está habilitada. Se `true`, o Intlayer substitui chamadas ao dicionário por injeções otimizadas. Se `false`, a otimização é desativada. Idealmente configurado como `true` em produção. |
|
|
104
|
+
| **`importMode`** | `'static' , 'dynamic' , 'live'` | `'static'` | Determina como os dicionários são carregados (veja detalhes abaixo). |
|
|
105
|
+
| **`traversePattern`** | `string[]` | `['**/*.{js,ts,jsx,tsx}', ...]` | Padrões glob que definem quais arquivos o Intlayer deve escanear para otimização. Use isso para excluir arquivos não relacionados e acelerar as builds. |
|
|
106
|
+
| **`outputFormat`** | `'esm', 'cjs'` | `'esm', 'cjs'` | Controla o formato de saída dos dicionários construídos. |
|
|
107
|
+
|
|
108
|
+
## Modos de Importação
|
|
109
|
+
|
|
110
|
+
A configuração `importMode` determina como o conteúdo do dicionário é injetado no seu componente.
|
|
111
|
+
|
|
112
|
+
### 1. Modo Estático (`default`)
|
|
113
|
+
|
|
114
|
+
No modo estático, o Intlayer substitui `useIntlayer` por `useDictionary` e injeta o dicionário diretamente no bundle JavaScript.
|
|
115
|
+
|
|
116
|
+
- **Prós:** Renderização instantânea (síncrona), zero requisições de rede adicionais durante a hidratação.
|
|
117
|
+
- **Contras:** O bundle inclui traduções para **todas** as línguas disponíveis para aquele componente específico.
|
|
118
|
+
- **Ideal para:** Aplicações Single Page (SPA).
|
|
119
|
+
|
|
120
|
+
**Exemplo de Código Transformado:**
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
// Seu código
|
|
124
|
+
const content = useIntlayer("my-key");
|
|
125
|
+
|
|
126
|
+
// Código otimizado (Estático)
|
|
127
|
+
const content = useDictionary({
|
|
128
|
+
key: "my-key",
|
|
129
|
+
content: {
|
|
130
|
+
nodeType: "translation",
|
|
131
|
+
translation: {
|
|
132
|
+
en: "My title",
|
|
133
|
+
fr: "Mon titre",
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 2. Modo Dinâmico
|
|
140
|
+
|
|
141
|
+
No modo dinâmico, o Intlayer substitui `useIntlayer` por `useDictionaryAsync`. Isso utiliza `import()` (mecanismo semelhante ao Suspense) para carregar preguiçosamente especificamente o JSON para o locale atual.
|
|
142
|
+
|
|
143
|
+
- **Prós:** **Tree shaking ao nível do locale.** Um usuário visualizando a versão em inglês irá _apenas_ baixar o dicionário em inglês. O dicionário em francês nunca é carregado.
|
|
144
|
+
- **Contras:** Dispara uma requisição de rede (busca de asset) por componente durante a hidratação.
|
|
145
|
+
- **Melhor para:** Blocos grandes de texto, artigos, ou aplicações que suportam muitas línguas onde o tamanho do bundle é crítico.
|
|
146
|
+
|
|
147
|
+
**Exemplo de Código Transformado:**
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
// Seu código
|
|
151
|
+
const content = useIntlayer("my-key");
|
|
152
|
+
|
|
153
|
+
// Código otimizado (Dinâmico)
|
|
154
|
+
const content = useDictionaryAsync({
|
|
155
|
+
en: () =>
|
|
156
|
+
import(".intlayer/dynamic_dictionary/en.json").then((mod) => mod.default),
|
|
157
|
+
fr: () =>
|
|
158
|
+
import(".intlayer/dynamic_dictionary/fr.json").then((mod) => mod.default),
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
> Ao usar `importMode: 'dynamic'`, se você tiver 100 componentes usando `useIntlayer` em uma única página, o navegador tentará fazer 100 requisições separadas. Para evitar essa "cascata" de requisições, agrupe o conteúdo em menos arquivos `.content` (por exemplo, um dicionário por seção da página) em vez de um por componente atômico.
|
|
163
|
+
|
|
164
|
+
> Atualmente, `importMode: 'dynamic'` não é totalmente suportado para Vue e Svelte. Recomenda-se usar `importMode: 'static'` para esses frameworks até atualizações futuras.
|
|
165
|
+
|
|
166
|
+
### 3. Modo Live
|
|
167
|
+
|
|
168
|
+
Comporta-se de forma semelhante ao modo Dinâmico, mas tenta buscar os dicionários da API Intlayer Live Sync primeiro. Se a chamada à API falhar ou o conteúdo não estiver marcado para atualizações ao vivo, ele recorre à importação dinâmica.
|
|
169
|
+
|
|
170
|
+
> Veja a documentação do CMS para mais detalhes: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_CMS.md)
|
|
171
|
+
|
|
172
|
+
## Resumo: Estático vs Dinâmico
|
|
173
|
+
|
|
174
|
+
| Recurso | Modo Estático | Modo Dinâmico |
|
|
175
|
+
| :----------------------- | :------------------------------------------------ | :---------------------------------------- |
|
|
176
|
+
| **Tamanho do Bundle JS** | Maior (inclui todos os idiomas para o componente) | Menor (apenas código, sem conteúdo) |
|
|
177
|
+
| **Carregamento Inicial** | Instantâneo (Conteúdo está no bundle) | Pequeno atraso (Busca JSON) |
|
|
178
|
+
| **Requisições de Rede** | 0 requisições extras | 1 requisição por dicionário |
|
|
179
|
+
| **Tree Shaking** | Nível de componente | Nível de componente + Nível de localidade |
|
|
180
|
+
| **Melhor Caso de Uso** | Componentes de UI, Aplicações pequenas | Páginas com muito texto, Muitos idiomas |
|
|
@@ -140,7 +140,7 @@ O pacote `vue-intlayer` é usado para interpretar os dicionários do Intlayer e
|
|
|
140
140
|
|
|
141
141
|
O pacote `nuxt-intlayer` é um módulo Nuxt para tornar os dicionários do Intlayer utilizáveis em aplicações Nuxt. Ele integra recursos essenciais para fazer o Intlayer funcionar em um ambiente Nuxt, como middleware de tradução, roteamento e a configuração do arquivo `nuxt.config.js`.
|
|
142
142
|
|
|
143
|
-
### svelte-intlayer
|
|
143
|
+
### svelte-intlayer
|
|
144
144
|
|
|
145
145
|
O pacote `svelte-intlayer` é usado para interpretar os dicionários do Intlayer e torná-los utilizáveis em aplicações Svelte.
|
|
146
146
|
|
|
@@ -42,6 +42,10 @@ Link da extensão: [https://marketplace.visualstudio.com/items?itemName=Intlayer
|
|
|
42
42
|
|
|
43
43
|
## Funcionalidades
|
|
44
44
|
|
|
45
|
+

|
|
46
|
+
|
|
47
|
+
- **Extrair Conteúdo** – Extraia conteúdo dos seus componentes React / Vue / Svelte
|
|
48
|
+
|
|
45
49
|

|
|
46
50
|
|
|
47
51
|
- **Navegação Instantânea** – Vá rapidamente para o arquivo de conteúdo correto ao clicar em uma chave `useIntlayer`.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-11-25
|
|
3
|
+
updatedAt: 2025-11-25
|
|
4
|
+
title: Оптимизация размера и производительности i18n-бандла
|
|
5
|
+
description: Сократите размер бандла приложения, оптимизируя контент интернационализации (i18n). Узнайте, как использовать tree shaking и ленивую загрузку словарей с Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Оптимизация бандла
|
|
8
|
+
- Автоматизация контента
|
|
9
|
+
- Динамический контент
|
|
10
|
+
- Intlayer
|
|
11
|
+
- Next.js
|
|
12
|
+
- JavaScript
|
|
13
|
+
- React
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- concept
|
|
17
|
+
- bundle-optimization
|
|
18
|
+
history:
|
|
19
|
+
- version: 6.0.0
|
|
20
|
+
date: 2025-11-25
|
|
21
|
+
changes: Инициализация истории
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Оптимизация размера и производительности i18n-бандла
|
|
25
|
+
|
|
26
|
+
Одна из самых распространённых проблем традиционных решений i18n, основанных на JSON-файлах, — это управление размером контента. Если разработчики не разделяют контент вручную по namespace, пользователи часто загружают переводы для каждой страницы и, возможно, для каждого языка, чтобы просмотреть всего одну страницу.
|
|
27
|
+
|
|
28
|
+
Например, приложение с 10 страницами, переведёнными на 10 языков, может привести к тому, что пользователь загрузит контент 100 страниц, хотя ему нужна только **одна** (текущая страница на текущем языке). Это приводит к излишнему расходу трафика и замедлению времени загрузки.
|
|
29
|
+
|
|
30
|
+
> Для обнаружения этой проблемы можно использовать анализаторы бандлов, такие как `rollup-plugin-visualizer` (vite), `@next/bundle-analyzer` (next.js) или `webpack-bundle-analyzer` (React CRA / Angular / и др.).
|
|
31
|
+
|
|
32
|
+
**Intlayer решает эту проблему за счёт оптимизации на этапе сборки.** Он анализирует ваш код, чтобы определить, какие словари действительно используются в каждом компоненте, и внедряет в бандл только необходимый контент.
|
|
33
|
+
|
|
34
|
+
## Содержание
|
|
35
|
+
|
|
36
|
+
<TOC />
|
|
37
|
+
|
|
38
|
+
## Как это работает
|
|
39
|
+
|
|
40
|
+
Intlayer использует **подход на уровне компонентов**. В отличие от глобальных JSON-файлов, ваш контент определяется рядом с компонентами или внутри них. Во время процесса сборки Intlayer:
|
|
41
|
+
|
|
42
|
+
1. **Анализирует** ваш код, чтобы найти вызовы `useIntlayer`.
|
|
43
|
+
2. **Формирует** соответствующий словарь с контентом.
|
|
44
|
+
3. **Заменяет** вызов `useIntlayer` на оптимизированный код в соответствии с вашей конфигурацией.
|
|
45
|
+
|
|
46
|
+
Это гарантирует, что:
|
|
47
|
+
|
|
48
|
+
- Если компонент не импортируется, его контент не включается в бандл (удаление неиспользуемого кода).
|
|
49
|
+
- Если компонент загружается лениво, его контент также загружается лениво.
|
|
50
|
+
|
|
51
|
+
## Настройка по платформам
|
|
52
|
+
|
|
53
|
+
### Next.js
|
|
54
|
+
|
|
55
|
+
Next.js требует плагин `@intlayer/swc` для обработки трансформации, так как Next.js использует SWC для сборки.
|
|
56
|
+
|
|
57
|
+
> Этот плагин установлен по умолчанию, поскольку плагины SWC для Next.js всё ещё находятся в экспериментальной стадии. В будущем это может измениться.
|
|
58
|
+
|
|
59
|
+
### Vite
|
|
60
|
+
|
|
61
|
+
Vite использует плагин `@intlayer/babel`, который включён как зависимость в `vite-intlayer`. Оптимизация включена по умолчанию.
|
|
62
|
+
|
|
63
|
+
### Webpack
|
|
64
|
+
|
|
65
|
+
Чтобы включить оптимизацию бандла с Intlayer в Webpack, необходимо установить и настроить соответствующий плагин Babel (`@intlayer/babel`) или SWC (`@intlayer/swc`).
|
|
66
|
+
|
|
67
|
+
### Expo / Lynx
|
|
68
|
+
|
|
69
|
+
Оптимизация бандла **пока недоступна** для этой платформы. Поддержка будет добавлена в будущих релизах.
|
|
70
|
+
|
|
71
|
+
## Конфигурация
|
|
72
|
+
|
|
73
|
+
Вы можете управлять тем, как Intlayer оптимизирует ваш бандл, через свойство `build` в вашем файле `intlayer.config.ts`.
|
|
74
|
+
|
|
75
|
+
```typescript fileName="intlayer.config.ts"
|
|
76
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
77
|
+
|
|
78
|
+
const config: IntlayerConfig = {
|
|
79
|
+
internationalization: {
|
|
80
|
+
locales: [Locales.ENGLISH, Locales.FRENCH], // локали
|
|
81
|
+
defaultLocale: Locales.ENGLISH, // локаль по умолчанию
|
|
82
|
+
},
|
|
83
|
+
build: {
|
|
84
|
+
optimize: true, // включить оптимизацию
|
|
85
|
+
importMode: "static", // или 'dynamic' - режим импорта
|
|
86
|
+
traversePattern: ["**/*.{js,ts,mjs,cjs,jsx,tsx}", "!**/node_modules/**"], // шаблоны обхода файлов
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export default config;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
> Рекомендуется сохранять значение по умолчанию для `optimize` в большинстве случаев.
|
|
94
|
+
|
|
95
|
+
> Подробнее о конфигурации смотрите в документации: [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md)
|
|
96
|
+
|
|
97
|
+
### Опции сборки
|
|
98
|
+
|
|
99
|
+
Следующие параметры доступны в объекте конфигурации `build`:
|
|
100
|
+
|
|
101
|
+
| Свойство | Тип | Значение по умолчанию | Описание |
|
|
102
|
+
| :-------------------- | :------------------------------ | :------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
103
|
+
| **`optimize`** | `boolean` | `undefined` | Управляет включением оптимизации сборки. Если `true`, Intlayer заменяет вызовы словарей на оптимизированные инъекции. Если `false`, оптимизация отключена. В идеале устанавливать `true` в продакшене. |
|
|
104
|
+
| **`importMode`** | `'static' , 'dynamic' , 'live'` | `'static'` | Определяет способ загрузки словарей (подробнее см. ниже). |
|
|
105
|
+
| **`traversePattern`** | `string[]` | `['**/*.{js,ts,jsx,tsx}', ...]` | Глобальные шаблоны, определяющие, какие файлы Intlayer должен сканировать для оптимизации. Используйте это, чтобы исключить несвязанные файлы и ускорить сборку. |
|
|
106
|
+
| **`outputFormat`** | `'esm', 'cjs'` | `'esm', 'cjs'` | Управляет форматом вывода собранных словарей. |
|
|
107
|
+
|
|
108
|
+
## Режимы импорта
|
|
109
|
+
|
|
110
|
+
Настройка `importMode` определяет, как содержимое словаря внедряется в ваш компонент.
|
|
111
|
+
|
|
112
|
+
### 1. Статический режим (`default`)
|
|
113
|
+
|
|
114
|
+
В статическом режиме Intlayer заменяет `useIntlayer` на `useDictionary` и внедряет словарь непосредственно в JavaScript-бандл.
|
|
115
|
+
|
|
116
|
+
- **Преимущества:** Мгновенный рендеринг (синхронный), отсутствие дополнительных сетевых запросов во время гидратации.
|
|
117
|
+
- **Недостатки:** Бандл включает переводы для **всех** доступных языков для данного компонента.
|
|
118
|
+
- **Лучше всего подходит для:** Одностраничных приложений (SPA).
|
|
119
|
+
|
|
120
|
+
**Пример преобразованного кода:**
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
// Ваш код
|
|
124
|
+
const content = useIntlayer("my-key");
|
|
125
|
+
|
|
126
|
+
// Оптимизированный код (Статический)
|
|
127
|
+
const content = useDictionary({
|
|
128
|
+
key: "my-key",
|
|
129
|
+
content: {
|
|
130
|
+
nodeType: "translation",
|
|
131
|
+
translation: {
|
|
132
|
+
en: "My title",
|
|
133
|
+
fr: "Mon titre",
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 2. Динамический режим
|
|
140
|
+
|
|
141
|
+
В динамическом режиме Intlayer заменяет `useIntlayer` на `useDictionaryAsync`. Это использует `import()` (механизм, похожий на Suspense) для ленивой загрузки JSON-файла конкретно для текущей локали.
|
|
142
|
+
|
|
143
|
+
- **Преимущества:** **Tree shaking на уровне локали.** Пользователь, просматривающий английскую версию, загрузит _только_ английский словарь. Французский словарь никогда не загружается.
|
|
144
|
+
- **Недостатки:** Во время гидратации для каждого компонента выполняется сетевой запрос (загрузка ассета).
|
|
145
|
+
- **Лучше всего подходит для:** Больших текстовых блоков, статей или приложений, поддерживающих множество языков, где критичен размер бандла.
|
|
146
|
+
|
|
147
|
+
**Пример преобразованного кода:**
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
// Ваш код
|
|
151
|
+
const content = useIntlayer("my-key");
|
|
152
|
+
|
|
153
|
+
// Оптимизированный код (Динамический)
|
|
154
|
+
const content = useDictionaryAsync({
|
|
155
|
+
en: () =>
|
|
156
|
+
import(".intlayer/dynamic_dictionary/en.json").then((mod) => mod.default),
|
|
157
|
+
fr: () =>
|
|
158
|
+
import(".intlayer/dynamic_dictionary/fr.json").then((mod) => mod.default),
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
> При использовании `importMode: 'dynamic'`, если на одной странице 100 компонентов используют `useIntlayer`, браузер попытается выполнить 100 отдельных запросов. Чтобы избежать такой "водопадной" загрузки, группируйте контент в меньшее количество файлов `.content` (например, один словарь на секцию страницы), а не по одному на каждый атомарный компонент.
|
|
163
|
+
|
|
164
|
+
> В настоящее время `importMode: 'dynamic'` не полностью поддерживается для Vue и Svelte. Рекомендуется использовать `importMode: 'static'` для этих фреймворков до выхода дальнейших обновлений.
|
|
165
|
+
|
|
166
|
+
### 3. Live Mode
|
|
167
|
+
|
|
168
|
+
Ведет себя аналогично динамическому режиму, но сначала пытается получить словари через Intlayer Live Sync API. Если вызов API не удался или контент не помечен для живых обновлений, происходит возврат к динамическому импорту.
|
|
169
|
+
|
|
170
|
+
> Подробнее смотрите в документации CMS: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_CMS.md)
|
|
171
|
+
|
|
172
|
+
## Сводка: Статический vs Динамический
|
|
173
|
+
|
|
174
|
+
| Особенность | Статический режим | Динамический режим |
|
|
175
|
+
| :--------------------- | :----------------------------------------- | :-------------------------------------------------- |
|
|
176
|
+
| **Размер JS-бандла** | Больше (включает все языки для компонента) | Самый маленький (только код, без контента) |
|
|
177
|
+
| **Начальная загрузка** | Мгновенно (контент включен в бандл) | Небольшая задержка (загрузка JSON) |
|
|
178
|
+
| **Сетевые запросы** | 0 дополнительных запросов | 1 запрос на каждый словарь |
|
|
179
|
+
| **Tree Shaking** | На уровне компонента | На уровне компонента + локали |
|
|
180
|
+
| **Лучшее применение** | UI-компоненты, небольшие приложения | Страницы с большим количеством текста, много языков |
|
|
@@ -42,6 +42,10 @@ history:
|
|
|
42
42
|
|
|
43
43
|
## Возможности
|
|
44
44
|
|
|
45
|
+

|
|
46
|
+
|
|
47
|
+
- **Извлечение контента** – Извлекайте контент из ваших компонентов React / Vue / Svelte
|
|
48
|
+
|
|
45
49
|

|
|
46
50
|
|
|
47
51
|
- **Мгновенная навигация** – Быстрый переход к нужному файлу контента при клике на ключ `useIntlayer`.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-11-25
|
|
3
|
+
updatedAt: 2025-11-25
|
|
4
|
+
title: i18n Paket Boyutu ve Performansını Optimize Etme
|
|
5
|
+
description: Uluslararasılaştırma (i18n) içeriğini optimize ederek uygulama paket boyutunu azaltın. Intlayer ile sözlüklerde tree shaking ve lazy loading nasıl kullanılır öğrenin.
|
|
6
|
+
keywords:
|
|
7
|
+
- Paket Optimizasyonu
|
|
8
|
+
- İçerik Otomasyonu
|
|
9
|
+
- Dinamik İçerik
|
|
10
|
+
- Intlayer
|
|
11
|
+
- Next.js
|
|
12
|
+
- JavaScript
|
|
13
|
+
- React
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- concept
|
|
17
|
+
- bundle-optimization
|
|
18
|
+
history:
|
|
19
|
+
- version: 6.0.0
|
|
20
|
+
date: 2025-11-25
|
|
21
|
+
changes: Başlangıç geçmişi
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# i18n Paket Boyutu ve Performansını Optimize Etme
|
|
25
|
+
|
|
26
|
+
JSON dosyalarına dayanan geleneksel i18n çözümlerinde en yaygın zorluklardan biri içerik boyutunu yönetmektir. Geliştiriciler içeriği manuel olarak namespace'lere ayırmazsa, kullanıcılar genellikle tek bir sayfayı görüntülemek için her sayfanın ve potansiyel olarak her dilin çevirilerini indirirler.
|
|
27
|
+
|
|
28
|
+
Örneğin, 10 sayfadan oluşan ve 10 dile çevrilmiş bir uygulamada, kullanıcı yalnızca **bir** sayfaya (mevcut dildeki mevcut sayfa) ihtiyaç duysa bile, 100 sayfanın içeriğini indirmek zorunda kalabilir. Bu durum, gereksiz bant genişliği kullanımına ve daha yavaş yükleme sürelerine yol açar.
|
|
29
|
+
|
|
30
|
+
> Bunu tespit etmek için `rollup-plugin-visualizer` (vite), `@next/bundle-analyzer` (next.js) veya `webpack-bundle-analyzer` (React CRA / Angular / vb.) gibi bundle analizörleri kullanabilirsiniz.
|
|
31
|
+
|
|
32
|
+
**Intlayer bu sorunu derleme zamanı optimizasyonu ile çözer.** Kodunuzu analiz ederek her bileşen için hangi sözlüklerin gerçekten kullanıldığını tespit eder ve yalnızca gerekli içeriği paketinizin içine yeniden enjekte eder.
|
|
33
|
+
|
|
34
|
+
## İçindekiler
|
|
35
|
+
|
|
36
|
+
<TOC />
|
|
37
|
+
|
|
38
|
+
## Nasıl Çalışır
|
|
39
|
+
|
|
40
|
+
Intlayer, **bileşen başına yaklaşım** kullanır. Küresel JSON dosyalarının aksine, içeriğiniz bileşenlerinizin yanında veya içinde tanımlanır. Derleme sürecinde Intlayer:
|
|
41
|
+
|
|
42
|
+
1. `useIntlayer` çağrılarını bulmak için kodunuzu **analiz eder**.
|
|
43
|
+
2. İlgili sözlük içeriğini **oluşturur**.
|
|
44
|
+
3. `useIntlayer` çağrısını yapılandırmanıza bağlı olarak optimize edilmiş kodla **değiştirir**.
|
|
45
|
+
|
|
46
|
+
Bu, şunları garanti eder:
|
|
47
|
+
|
|
48
|
+
- Bir bileşen içe aktarılmamışsa, içeriği pakete dahil edilmez (Ölü Kod Eliminasyonu).
|
|
49
|
+
- Bir bileşen tembel yükleniyorsa, içeriği de tembel yüklenir.
|
|
50
|
+
|
|
51
|
+
## Platforma Göre Kurulum
|
|
52
|
+
|
|
53
|
+
### Next.js
|
|
54
|
+
|
|
55
|
+
Next.js, dönüşümü yönetmek için `@intlayer/swc` eklentisini gerektirir, çünkü Next.js derlemeler için SWC kullanır.
|
|
56
|
+
|
|
57
|
+
> Bu eklenti varsayılan olarak yüklüdür çünkü SWC eklentileri Next.js için hâlâ deneysel durumdadır. Gelecekte değişebilir.
|
|
58
|
+
|
|
59
|
+
### Vite
|
|
60
|
+
|
|
61
|
+
Vite, `vite-intlayer` bağımlılığı olarak dahil edilen `@intlayer/babel` eklentisini kullanır. Optimizasyon varsayılan olarak etkinleştirilmiştir.
|
|
62
|
+
|
|
63
|
+
### Webpack
|
|
64
|
+
|
|
65
|
+
Webpack üzerinde Intlayer ile paket optimizasyonunu etkinleştirmek için uygun Babel (`@intlayer/babel`) veya SWC (`@intlayer/swc`) eklentisini yükleyip yapılandırmanız gerekir.
|
|
66
|
+
|
|
67
|
+
### Expo / Lynx
|
|
68
|
+
|
|
69
|
+
Bu platform için paket optimizasyonu **henüz mevcut değildir**. Destek gelecekteki bir sürümde eklenecektir.
|
|
70
|
+
|
|
71
|
+
## Yapılandırma
|
|
72
|
+
|
|
73
|
+
Intlayer'ın paket optimizasyonunu `intlayer.config.ts` dosyanızdaki `build` özelliği aracılığıyla kontrol edebilirsiniz.
|
|
74
|
+
|
|
75
|
+
```typescript fileName="intlayer.config.ts"
|
|
76
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
77
|
+
|
|
78
|
+
const config: IntlayerConfig = {
|
|
79
|
+
internationalization: {
|
|
80
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
81
|
+
defaultLocale: Locales.ENGLISH,
|
|
82
|
+
},
|
|
83
|
+
build: {
|
|
84
|
+
optimize: true,
|
|
85
|
+
importMode: "static", // veya 'dynamic'
|
|
86
|
+
traversePattern: ["**/*.{js,ts,mjs,cjs,jsx,tsx}", "!**/node_modules/**"],
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export default config;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
> `optimize` için varsayılan seçeneğin korunması çoğu durumda önerilir.
|
|
94
|
+
|
|
95
|
+
> Daha fazla detay için doküman yapılandırmasına bakınız: [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/tr/configuration.md)
|
|
96
|
+
|
|
97
|
+
### Build Seçenekleri
|
|
98
|
+
|
|
99
|
+
`build` yapılandırma nesnesi altında aşağıdaki seçenekler mevcuttur:
|
|
100
|
+
|
|
101
|
+
| Özellik | Tür | Varsayılan | Açıklama |
|
|
102
|
+
| :-------------------- | :------------------------------ | :------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
103
|
+
| **`optimize`** | `boolean` | `undefined` | Derleme optimizasyonunun etkin olup olmadığını kontrol eder. `true` ise, Intlayer sözlük çağrılarını optimize edilmiş enjeksiyonlarla değiştirir. `false` ise optimizasyon devre dışı bırakılır. Üretimde ideal olarak `true` olarak ayarlanmalıdır. |
|
|
104
|
+
| **`importMode`** | `'static' , 'dynamic' , 'live'` | `'static'` | Sözlüklerin nasıl yükleneceğini belirler (detaylar aşağıda). |
|
|
105
|
+
| **`traversePattern`** | `string[]` | `['**/*.{js,ts,jsx,tsx}', ...]` | Intlayer'ın optimizasyon için taraması gereken dosyaları tanımlayan glob desenleri. İlgisiz dosyaları hariç tutmak ve derlemeleri hızlandırmak için bunu kullanın. |
|
|
106
|
+
| **`outputFormat`** | `'esm', 'cjs'` | `'esm', 'cjs'` | Oluşturulan sözlüklerin çıktı formatını kontrol eder. |
|
|
107
|
+
|
|
108
|
+
## İçe Aktarım Modları
|
|
109
|
+
|
|
110
|
+
`importMode` ayarı, sözlük içeriğinin bileşeninize nasıl enjekte edileceğini belirler.
|
|
111
|
+
|
|
112
|
+
### 1. Statik Mod (`default`)
|
|
113
|
+
|
|
114
|
+
Statik modda, Intlayer `useIntlayer`'ı `useDictionary` ile değiştirir ve sözlüğü doğrudan JavaScript paketine enjekte eder.
|
|
115
|
+
|
|
116
|
+
- **Avantajlar:** Anında render (eşzamanlı), hydration sırasında ekstra ağ isteği yok.
|
|
117
|
+
- **Dezavantajlar:** Paket, o belirli bileşen için mevcut **tüm** dillerin çevirilerini içerir.
|
|
118
|
+
- **En uygun:** Tek Sayfa Uygulamaları (SPA).
|
|
119
|
+
|
|
120
|
+
**Dönüştürülmüş Kod Örneği:**
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
// Kodunuz
|
|
124
|
+
const content = useIntlayer("my-key");
|
|
125
|
+
|
|
126
|
+
// Optimize edilmiş kod (Statik)
|
|
127
|
+
const content = useDictionary({
|
|
128
|
+
key: "my-key",
|
|
129
|
+
content: {
|
|
130
|
+
nodeType: "translation",
|
|
131
|
+
translation: {
|
|
132
|
+
en: "My title",
|
|
133
|
+
fr: "Mon titre",
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 2. Dinamik Mod
|
|
140
|
+
|
|
141
|
+
Dinamik modda, Intlayer `useIntlayer`'ı `useDictionaryAsync` ile değiştirir. Bu, `import()` (Suspense benzeri mekanizma) kullanarak mevcut yerel ayar için JSON'u tembel yükler.
|
|
142
|
+
|
|
143
|
+
- **Avantajlar:** **Yerel düzeyde tree shaking.** İngilizce sürümü görüntüleyen bir kullanıcı sadece İngilizce sözlüğü indirir. Fransızca sözlük asla yüklenmez.
|
|
144
|
+
- **Dezavantajlar:** Hydration sırasında her bileşen için bir ağ isteği (varlık alma) tetikler.
|
|
145
|
+
- **En uygun:** Paket boyutunun kritik olduğu, çok sayıda dili destekleyen büyük metin blokları, makaleler veya uygulamalar için.
|
|
146
|
+
|
|
147
|
+
**Dönüştürülmüş Kod Örneği:**
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
// Kodunuz
|
|
151
|
+
const content = useIntlayer("my-key");
|
|
152
|
+
|
|
153
|
+
// Optimize edilmiş kod (Dinamik)
|
|
154
|
+
const content = useDictionaryAsync({
|
|
155
|
+
en: () =>
|
|
156
|
+
import(".intlayer/dynamic_dictionary/en.json").then((mod) => mod.default),
|
|
157
|
+
fr: () =>
|
|
158
|
+
import(".intlayer/dynamic_dictionary/fr.json").then((mod) => mod.default),
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
> `importMode: 'dynamic'` kullanıldığında, tek bir sayfada `useIntlayer` kullanan 100 bileşen varsa, tarayıcı 100 ayrı fetch denemesi yapacaktır. Bu istek "şelalesi"nden kaçınmak için içeriği daha az sayıda `.content` dosyasına (örneğin, sayfa bölümü başına bir sözlük) gruplayın, atom bileşen başına değil.
|
|
163
|
+
|
|
164
|
+
> Şu anda, `importMode: 'dynamic'` Vue ve Svelte için tam olarak desteklenmemektedir. Bu çerçeveler için ek güncellemelere kadar `importMode: 'static'` kullanılması önerilir.
|
|
165
|
+
|
|
166
|
+
### 3. Canlı Mod (Live Mode)
|
|
167
|
+
|
|
168
|
+
Dinamik moda benzer şekilde davranır ancak önce sözlükleri Intlayer Live Sync API'den getirmeye çalışır. Eğer API çağrısı başarısız olursa veya içerik canlı güncellemeler için işaretlenmemişse, dinamik import yöntemine geri döner.
|
|
169
|
+
|
|
170
|
+
> Daha fazla detay için CMS dokümantasyonuna bakınız: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/tr/intlayer_CMS.md)
|
|
171
|
+
|
|
172
|
+
## Özet: Statik vs Dinamik
|
|
173
|
+
|
|
174
|
+
| Özellik | Statik Mod | Dinamik Mod |
|
|
175
|
+
| :------------------ | :------------------------------------------- | :-------------------------------------- |
|
|
176
|
+
| **JS Paket Boyutu** | Daha büyük (bileşen için tüm dilleri içerir) | En küçük (sadece kod, içerik yok) |
|
|
177
|
+
| **İlk Yükleme** | Anında (İçerik pakette) | Hafif gecikme (JSON çeker) |
|
|
178
|
+
| **Ağ İstekleri** | Ekstra 0 istek | Her sözlük için 1 istek |
|
|
179
|
+
| **Tree Shaking** | Bileşen seviyesi | Bileşen seviyesi + Dil seviyesi |
|
|
180
|
+
| **En İyi Kullanım** | UI Bileşenleri, Küçük Uygulamalar | Çok metin içeren sayfalar, Çoklu Diller |
|
|
@@ -142,7 +142,7 @@ Intlayer, çeviri sürecinde belirli bir rolü olan birkaç paketten oluşur. İ
|
|
|
142
142
|
|
|
143
143
|
`nuxt-intlayer` paketi, Intlayer sözlüklerini Nuxt uygulamalarında kullanılabilir hale getirmek için bir Nuxt modülü olarak kullanılır. Çeviri ara yazılımı, yönlendirme veya `nuxt.config.js` dosyası konfigürasyonu gibi Intlayer'ı bir Nuxt ortamında çalışacak şekilde yapmak için gerekli özellikleri entegre eder.
|
|
144
144
|
|
|
145
|
-
### svelte-intlayer
|
|
145
|
+
### svelte-intlayer
|
|
146
146
|
|
|
147
147
|
`svelte-intlayer` paketi, Intlayer sözlüklerini yorumlamak ve Svelte uygulamalarında kullanılabilir hale getirmek için kullanılır.
|
|
148
148
|
|
|
@@ -42,6 +42,10 @@ Eklenti bağlantısı: [https://marketplace.visualstudio.com/items?itemName=Intl
|
|
|
42
42
|
|
|
43
43
|
## Özellikler
|
|
44
44
|
|
|
45
|
+

|
|
46
|
+
|
|
47
|
+
- **İçerik Çıkar** – React / Vue / Svelte bileşenlerinizden içerik çıkarın
|
|
48
|
+
|
|
45
49
|

|
|
46
50
|
|
|
47
51
|
- **Anında Gezinme** – `useIntlayer` anahtarına tıkladığınızda doğru içerik dosyasına hızlıca atlayın.
|