@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
package/docs/bn/configuration.md
CHANGED
|
@@ -672,16 +672,16 @@ routing: {
|
|
|
672
672
|
|
|
673
673
|
কুকিতে স্টোরেজ ব্যবহার করার সময় অতিরিক্ত বৈশিষ্ট্য সেট করা যেতে পারে:
|
|
674
674
|
|
|
675
|
-
| ফিল্ড | বর্ণনা
|
|
676
|
-
| ---------- |
|
|
677
|
-
| `name` | কুকির নাম। ডিফল্ট: `'INTLAYER_LOCALE'`
|
|
678
|
-
| `domain` | কুকি ডোমেইন। ডিফল্ট: `undefined`
|
|
679
|
-
| `path` | কুকি পাথ। ডিফল্ট: `undefined`
|
|
680
|
-
| `secure` | HTTPS প্রয়োজন। ডিফল্ট: `undefined`
|
|
681
|
-
| `httpOnly` | HTTP-only ফ্ল্যাগ। ডিফল্ট: `undefined`
|
|
682
|
-
| `sameSite` | SameSite পলিসি।
|
|
683
|
-
| `expires` |
|
|
684
|
-
| `maxAge` | তৈরি করার পর থেকে সেকেন্ডে জীবনকাল। এটি `expires` এর চেয়ে বেশি অগ্রাধিকার পায়। ডিফল্ট: `undefined`
|
|
675
|
+
| ফিল্ড | বর্ণনা | টাইপ |
|
|
676
|
+
| ---------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
|
|
677
|
+
| `name` | কুকির নাম। ডিফল্ট: `'INTLAYER_LOCALE'` | `string` |
|
|
678
|
+
| `domain` | কুকি ডোমেইন। ডিফল্ট: `undefined` | `string` |
|
|
679
|
+
| `path` | কুকি পাথ। ডিফল্ট: `undefined` | `string` |
|
|
680
|
+
| `secure` | HTTPS প্রয়োজন। ডিফল্ট: `undefined` | `boolean` |
|
|
681
|
+
| `httpOnly` | HTTP-only ফ্ল্যাগ। ডিফল্ট: `undefined` | `boolean` |
|
|
682
|
+
| `sameSite` | SameSite পলিসি। | `'strict'` | <br/> `'lax'` | <br/> `'none'` |
|
|
683
|
+
| `expires` | একটি `number` হলো তৈরি করার পর থেকে দিনের সংখ্যা; একটি `Date` (বা ISO তারিখ স্ট্রিং) হলো একটি পরম মেয়াদ শেষ। ডিফল্ট: `undefined` | `Date` | <br/> `number` | <br/> `string` |
|
|
684
|
+
| `maxAge` | তৈরি করার পর থেকে সেকেন্ডে জীবনকাল। এটি `expires` এর চেয়ে বেশি অগ্রাধিকার পায়। ডিফল্ট: `undefined` | `number` |
|
|
685
685
|
|
|
686
686
|
#### স্টোরেজ বৈশিষ্ট্য (Storage Attributes)
|
|
687
687
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
4
|
-
title: Optimalizace
|
|
5
|
-
description:
|
|
3
|
+
updatedAt: 2026-06-07
|
|
4
|
+
title: Optimalizace Velikosti Bundle & Výkonu i18n
|
|
5
|
+
description: Zmenšete velikost svého aplikačního bundlu optimalizací obsahu pro internacionalizaci (i18n). Zjistěte, jak v Intlayer využít tree shaking a líné načítání (lazy loading) pro slovníky.
|
|
6
6
|
keywords:
|
|
7
|
-
- Optimalizace
|
|
8
|
-
- Automatizace
|
|
9
|
-
- Dynamický
|
|
7
|
+
- Optimalizace Bundlu
|
|
8
|
+
- Automatizace Obsahu
|
|
9
|
+
- Dynamický Obsah
|
|
10
10
|
- Intlayer
|
|
11
11
|
- Next.js
|
|
12
12
|
- JavaScript
|
|
@@ -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: "Přidány `intlayerPurgeBabelPlugin` a `intlayerMinifyBabelPlugin` pro Babel/Webpack; vyjasnění fungování pipeline pluginů"
|
|
19
22
|
- version: 8.7.0
|
|
20
23
|
date: 2026-04-08
|
|
21
|
-
changes: "Přidány
|
|
24
|
+
changes: "Přidány možnosti `minify` a `purge` do konfigurace sestavení (build)"
|
|
22
25
|
---
|
|
23
26
|
|
|
24
|
-
# Optimalizace
|
|
27
|
+
# Optimalizace Velikosti Bundle & Výkonu i18n
|
|
25
28
|
|
|
26
|
-
Jednou z nejčastějších výzev u tradičních řešení
|
|
29
|
+
Jednou z nejčastějších výzev u tradičních i18n řešení spoléhajících na JSON soubory je správa velikosti obsahu. Pokud vývojáři ručně nerozdělují obsah do jmenných prostorů (namespaces), uživatelé často skončí stahováním překladů pro každou stránku a potenciálně pro každý jazyk, jen aby si prohlédli jednu jedinou stránku.
|
|
27
30
|
|
|
28
|
-
Například aplikace s 10 stránkami přeloženými do 10 jazyků může vést k tomu, že uživatel
|
|
31
|
+
Například aplikace s 10 stránkami přeloženými do 10 jazyků může vést k tomu, že si uživatel stáhne obsah v rozsahu 100 stránek, i když ve skutečnosti potřebuje pouze **jednu** (aktuální stránku v aktuálním jazyce). To vede k plýtvání šířkou pásma a delším časům načítání.
|
|
29
32
|
|
|
30
|
-
**Intlayer řeší tento problém
|
|
33
|
+
**Intlayer řeší tento problém pomocí optimalizace v čase sestavení (build-time).** Analyzuje váš kód, detekuje, které slovníky se skutečně používají u konkrétní komponenty, a vloží do vašeho bundlu pouze tento nezbytný obsah.
|
|
31
34
|
|
|
32
35
|
## Obsah
|
|
33
36
|
|
|
34
37
|
<TOC />
|
|
35
38
|
|
|
36
|
-
##
|
|
39
|
+
## Analyzujte svůj bundle
|
|
37
40
|
|
|
38
|
-
Analýza
|
|
41
|
+
Analýza bundlu je prvním krokem k odhalení „těžkých“ JSON souborů a příležitostí k rozdělení kódu (code-splitting). Tyto nástroje generují vizuální stromovou mapu kompilovaného kódu vaší aplikace, což vám umožňuje přesně vidět, které knihovny zabírají nejvíce místa.
|
|
39
42
|
|
|
40
43
|
<Tabs>
|
|
41
44
|
<Tab value="vite">
|
|
42
45
|
|
|
43
46
|
### Vite / Rollup
|
|
44
47
|
|
|
45
|
-
Vite využívá Rollup
|
|
48
|
+
Vite využívá Rollup na pozadí. Plugin `rollup-plugin-visualizer` vygeneruje interaktivní HTML soubor zobrazující velikost každého modulu ve vašem grafu.
|
|
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, // Automaticky
|
|
61
|
+
open: true, // Automaticky otevře report ve vašem prohlížeči
|
|
59
62
|
filename: "stats.html",
|
|
60
63
|
gzipSize: true,
|
|
61
64
|
brotliSize: true,
|
|
@@ -92,7 +95,7 @@ bun next experimental-analyze
|
|
|
92
95
|
|
|
93
96
|
### Next.js (Webpack)
|
|
94
97
|
|
|
95
|
-
Pokud
|
|
98
|
+
Pokud používáte výchozí Webpack bundler v Next.js, použijte oficiální bundle analyzer. Spustíte jej nastavením proměnné prostředí během sestavování.
|
|
96
99
|
|
|
97
100
|
```bash packageManager='npm'
|
|
98
101
|
npm install -D @next/bundle-analyzer
|
|
@@ -131,7 +134,7 @@ ANALYZE=true npm run build
|
|
|
131
134
|
|
|
132
135
|
### Standardní Webpack
|
|
133
136
|
|
|
134
|
-
Pro Create React App (ejected), Angular nebo vlastní
|
|
137
|
+
Pro Create React App (ejected), Angular nebo vlastní konfigurace Webpack použijte průmyslový standard `webpack-bundle-analyzer`.
|
|
135
138
|
|
|
136
139
|
```bash packageManager='npm'
|
|
137
140
|
npm install -D webpack-bundle-analyzer
|
|
@@ -168,27 +171,64 @@ export default {
|
|
|
168
171
|
|
|
169
172
|
## Jak to funguje
|
|
170
173
|
|
|
171
|
-
Intlayer
|
|
174
|
+
Intlayer používá **přístup na úrovni komponent (per-component)**. Na rozdíl od globálních JSON souborů se váš obsah definuje společně s komponentami nebo přímo v nich. Během procesu sestavování (build) Intlayer provede následující:
|
|
172
175
|
|
|
173
|
-
1.
|
|
174
|
-
2.
|
|
175
|
-
3.
|
|
176
|
+
1. **Analyzuje** váš kód, aby vyhledal volání `useIntlayer`.
|
|
177
|
+
2. **Sestaví** (Build) příslušný obsah ze slovníků.
|
|
178
|
+
3. **Nahradí** volání `useIntlayer` optimalizovaným kódem v závislosti na vaší konfiguraci.
|
|
176
179
|
|
|
177
|
-
|
|
180
|
+
Tím zajistí, že:
|
|
178
181
|
|
|
179
|
-
- Pokud komponenta není importována, její obsah
|
|
182
|
+
- Pokud komponenta není importována, její obsah se do bundlu nezahrne (Odstranění mrtvého kódu / Dead Code Elimination).
|
|
180
183
|
- Pokud je komponenta načítána líně (lazy-loaded), její obsah je také načítán líně.
|
|
181
184
|
|
|
182
|
-
##
|
|
185
|
+
## Referenční příručka k pluginům
|
|
186
|
+
|
|
187
|
+
Optimalizace sestavení pomocí Intlayer je rozdělena do několika samostatných pluginů, z nichž každý má jedinou zodpovědnost. Pochopení jejich funkcí zabrání zmatkům při jejich nastavování.
|
|
188
|
+
|
|
189
|
+
### Babel pluginy (`@intlayer/babel`)
|
|
190
|
+
|
|
191
|
+
Tyto pluginy se používají přímo v `babel.config.js` pro sestavení založená na Webpacku (Next.js s Babelem, CRA, vlastní Webpack atd.).
|
|
192
|
+
|
|
193
|
+
| Plugin | K čemu slouží |
|
|
194
|
+
| :---------------------------- | :--------------------------------------------------------------------------------------------------------------------------- |
|
|
195
|
+
| `intlayerExtractBabelPlugin` | Prohledá soubory `.content.ts` a zapíše zkompilované slovníky do složky `.intlayer/` |
|
|
196
|
+
| `intlayerOptimizeBabelPlugin` | Přepíše `useIntlayer('key')` na `useDictionary(hash)` a vloží odpovídající `import` slovníku |
|
|
197
|
+
| `intlayerPurgeBabelPlugin` | Prohledá všechny zdrojové soubory a odstraní **nepoužívaná pole obsahu** z kompilovaných slovníků `.intlayer/**/*.json` |
|
|
198
|
+
| `intlayerMinifyBabelPlugin` | **Přejmenuje klíče polí obsahu** na krátké abecední aliasy (např. `title` → `a`) jak v JSON souborech, tak ve zdrojovém kódu |
|
|
199
|
+
|
|
200
|
+
> **Záleží na pořadí pluginů.** Ve vašem `babel.config.js` musí pluginy pro purge a minify následovat **před** optimalizačním (optimize) pluginem. Krok optimalizace totiž nahrazuje volání `useIntlayer('key')` neprůhledným `useDictionary(hash)`, což odstraní informaci o klíči slovníku. Tuto informaci potřebují pluginy purge a minify k identifikaci použitých polí.
|
|
201
|
+
|
|
202
|
+
Každý Babel plugin má odpovídajícího pomocníka (options helper), který při načítání konfigurace jednou přečte váš soubor `intlayer.config.ts` a vrátí předem vyřešené hodnoty:
|
|
203
|
+
|
|
204
|
+
| Pomocník pro volby | Používá se s |
|
|
205
|
+
| :--------------------------- | :---------------------------- |
|
|
206
|
+
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
207
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
208
|
+
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
209
|
+
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
210
|
+
|
|
211
|
+
### Vite pluginy (`vite-intlayer`)
|
|
212
|
+
|
|
213
|
+
Uživatelé Vite **tyto pluginy nikdy nenastavují přímo**. Propojí se automaticky po volání `withIntlayer()` ve `vite.config.ts`. Příznaky (flags) `build.purge` a `build.minify` v konfiguraci `intlayer.config.ts` zajišťují odpovídající chování bez potřeby dodatečné registrace pluginů.
|
|
214
|
+
|
|
215
|
+
| Interní Vite plugin | Ekvivalentní chování |
|
|
216
|
+
| :------------------ | :----------------------------------------------------------------------------------------------------- |
|
|
217
|
+
| Usage analyzer | Stejné jako analytický průchod (analyse pass) `intlayerPurgeBabelPlugin` |
|
|
218
|
+
| Dictionary prune | Stejné jako zápis JSON pro `intlayerPurgeBabelPlugin` |
|
|
219
|
+
| Dictionary minify | Stejné jako zápis JSON pro `intlayerMinifyBabelPlugin` |
|
|
220
|
+
| Babel transform | Stejné jako přejmenování zdrojového kódu v `intlayerMinifyBabelPlugin` + `intlayerOptimizeBabelPlugin` |
|
|
221
|
+
|
|
222
|
+
## Nastavení podle platforem
|
|
183
223
|
|
|
184
224
|
<Tabs>
|
|
185
225
|
<Tab value="nextjs">
|
|
186
226
|
|
|
187
227
|
### Next.js
|
|
188
228
|
|
|
189
|
-
Next.js
|
|
229
|
+
Next.js využívá SWC pro sestavování, takže k průchodu pro optimalizaci (přepis importů) potřebuje plugin `@intlayer/swc`.
|
|
190
230
|
|
|
191
|
-
> Tento plugin
|
|
231
|
+
> Tento plugin se neinstaluje ve výchozím nastavení, jelikož SWC pluginy jsou pro Next.js zatím experimentální. V budoucnu se to může změnit.
|
|
192
232
|
|
|
193
233
|
```bash packageManager="npm"
|
|
194
234
|
npm install -D @intlayer/swc
|
|
@@ -206,21 +246,63 @@ pnpm add -D @intlayer/swc
|
|
|
206
246
|
bun add -d @intlayer/swc
|
|
207
247
|
```
|
|
208
248
|
|
|
209
|
-
Po instalaci Intlayer automaticky rozpozná a použije
|
|
249
|
+
Po instalaci plugin Intlayer automaticky rozpozná a použije.
|
|
250
|
+
|
|
251
|
+
Pro **purge a minify** (odstranění polí a jejich přejmenování) nainstalujte ještě `@intlayer/babel` a přidejte Babel pluginy. Ačkoliv Next.js pro transformaci používá SWC, stále vyhodnocuje `babel.config.js` kvůli konfiguraci pluginů. Tím pádem Babel pluginy poběží jako přípravný krok před 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
|
+
// Purge: odstraní nepoužívaná pole obsahu z .intlayer/**/*.json
|
|
269
|
+
[intlayerPurgeBabelPlugin, getPurgePluginOptions()],
|
|
270
|
+
// Minify: přejmenuje klíče polí v JSON + ve zdrojovém kódu
|
|
271
|
+
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
272
|
+
// Poznámka: intlayerOptimizeBabelPlugin zde NENÍ POTŘEBA, jelikož
|
|
273
|
+
// přepis useIntlayer → useDictionary řeší balíček @intlayer/swc.
|
|
274
|
+
],
|
|
275
|
+
};
|
|
276
|
+
```
|
|
210
277
|
|
|
211
278
|
</Tab>
|
|
212
279
|
<Tab value="vite">
|
|
213
280
|
|
|
214
281
|
### Vite
|
|
215
282
|
|
|
216
|
-
Vite využívá plugin `@intlayer/babel`, který je
|
|
283
|
+
Vite využívá plugin `@intlayer/babel`, který je zahrnut v závislostech u `vite-intlayer`. Kompletní pipeline optimalizace — přepis importů, purge a minify — je ve výchozím stavu aktivní a nevyžaduje žádnou další registraci pluginů.
|
|
284
|
+
|
|
285
|
+
Purge a minify zapnete nastavením odpovídajících příznaků v souboru `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, // odstraní nepoužívaná pole obsahu z bundlovaného JSONu
|
|
293
|
+
minify: true, // přejmenuje klíče polí obsahu na krátké aliasy
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
export default config;
|
|
298
|
+
```
|
|
217
299
|
|
|
218
300
|
</Tab>
|
|
219
301
|
<Tab value="webpack">
|
|
220
302
|
|
|
221
|
-
### Webpack
|
|
303
|
+
### Webpack (a Next.js s Babelem)
|
|
222
304
|
|
|
223
|
-
|
|
305
|
+
Nainstalujte `@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
|
+
Přidejte do `babel.config.js` všechny čtyři pluginy ve správném pořadí:
|
|
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: kompiluje .content.ts soubory → .intlayer/**/*.json
|
|
340
|
+
[intlayerExtractBabelPlugin, getExtractPluginOptions()],
|
|
341
|
+
|
|
342
|
+
// Purge: odstraní nepoužívaná pole z .intlayer/**/*.json
|
|
343
|
+
// (čte hodnotu příznaku build.purge v intlayer.config.ts)
|
|
344
|
+
[intlayerPurgeBabelPlugin, getPurgePluginOptions()],
|
|
345
|
+
|
|
346
|
+
// Minify: přejmenuje klíče polí v JSON + zdrojovém kódu
|
|
347
|
+
// (čte hodnotu příznaku build.minify v intlayer.config.ts)
|
|
348
|
+
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
349
|
+
|
|
350
|
+
// Optimize: přepíše useIntlayer('key') → useDictionary(hash)
|
|
351
|
+
// Musí být poslední, protože vymaže klíč slovníku.
|
|
352
|
+
[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()],
|
|
353
|
+
],
|
|
249
354
|
};
|
|
250
355
|
```
|
|
251
356
|
|
|
@@ -254,57 +359,62 @@ module.exports = {
|
|
|
254
359
|
|
|
255
360
|
## Konfigurace
|
|
256
361
|
|
|
257
|
-
Způsob
|
|
362
|
+
Způsob optimalizace bundlu přes Intlayer můžete řídit pomocí vlastnosti `build` ve svém souboru `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.CZECH],
|
|
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
|
-
* Indikuje, zda má build kontrolovat typy TypeScript
|
|
283
|
-
*/
|
|
284
|
-
checkTypes: false;
|
|
376
|
+
// Nahrazuje volání useIntlayer() přímo importy slovníků během sestavení.
|
|
377
|
+
// undefined = auto (aktivní v produkci), true = vždy, false = nikdy.
|
|
378
|
+
optimize: undefined,
|
|
379
|
+
|
|
380
|
+
// Přejmenuje klíče polí v kompilovaných slovnících na krátké abecední
|
|
381
|
+
// aliasy (např. title → a). Snižuje velikost JSONu; vyžaduje optimize.
|
|
382
|
+
minify: true,
|
|
383
|
+
|
|
384
|
+
// Odstraní pole obsahu, ke kterým ve zdrojovém kódu není žádný přístup.
|
|
385
|
+
// Vyžaduje optimize.
|
|
386
|
+
purge: true,
|
|
285
387
|
},
|
|
286
388
|
};
|
|
287
389
|
|
|
288
390
|
export default config;
|
|
289
391
|
```
|
|
290
392
|
|
|
291
|
-
>
|
|
393
|
+
> Ve většině případů se doporučuje ponechat výchozí hodnotu (`undefined`) u parametru `optimize`.
|
|
292
394
|
|
|
293
|
-
>
|
|
395
|
+
> Přehled všech možností naleznete v referenční příručce: [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/cs/configuration.md)
|
|
294
396
|
|
|
295
|
-
###
|
|
397
|
+
### Volby pro sestavení (Build Options)
|
|
296
398
|
|
|
297
|
-
|
|
399
|
+
| Vlastnost | Typ | Výchozí | Popis |
|
|
400
|
+
| :------------- | :--------------------- | :---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
401
|
+
| **`optimize`** | `boolean \| undefined` | `undefined` | Povolí průchod pro přepis importů. `undefined` = aktivní pouze v produkčním sestavení. `false` vypíná rovněž purge a minify. |
|
|
402
|
+
| **`minify`** | `boolean` | `false` | Přejmenuje klíče polí obsahu v kompilovaných JSON souborech na krátké abecední aliasy. Stejně tak přepíše odpovídající přístupy k vlastnostem ve zdrojovém kódu. Nefunguje, pokud je `optimize` nastaveno na `false`. |
|
|
403
|
+
| **`purge`** | `boolean` | `false` | Z kompilovaných JSON souborů odstraní obsahová pole, k nimž se ve zdrojovém kódu staticky nepřistupuje. Nefunguje, pokud je `optimize` nastaveno na `false`. |
|
|
298
404
|
|
|
299
|
-
|
|
300
|
-
| :------------- | :-------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
301
|
-
| **`optimize`** | `boolean` | `undefined` | Ovládá, zda je povolena optimalizace buildu. Pokud je `true`, Intlayer nahradí volání slovníku optimalizovanými injekcemi. Pokud je `false`, optimalizace je vypnuta. Ideálně nastaveno na `true` v produkci. |
|
|
302
|
-
| **`minify`** | `boolean` | `false` | Zda se mají minifikovat slovníky pro snížení velikosti bundle. |
|
|
303
|
-
| **`purge`** | `boolean` | `false` | Zda se mají odstranit nepoužívané klíče ve slovnících. |
|
|
405
|
+
### Minifikace (přejmenování klíčů)
|
|
304
406
|
|
|
305
|
-
|
|
407
|
+
Volba `build.minify` **neminifikuje** váš JavaScriptový bundle — to má na starosti váš bundler. Namísto toho zmenšuje velikost kompilovaných JSON slovníků tak, že nahradí všechny uživatelem definované klíče obsahových polí za krátké abecední aliasy:
|
|
306
408
|
|
|
307
|
-
|
|
409
|
+
```
|
|
410
|
+
// Před minifikací
|
|
411
|
+
{ "title": "Ahoj", "subtitle": "Světe" }
|
|
412
|
+
|
|
413
|
+
// Po minifikaci
|
|
414
|
+
{ "a": "Ahoj", "b": "Světe" }
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Stejné přejmenování proběhne i u všech přístupů k vlastnostem ve zdrojovém kódu, takže v kompilovaném výstupu se z `content.title` stane `content.a`. Chování aplikace v reálném čase se tím nijak nezmění.
|
|
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
|
+
> K minifikaci nedojde, pokud je `optimize` nastaveno na `false` nebo pokud `editor.enabled` odpovídá hodnotě `true` (vizuální editor totiž potřebuje znát původní názvy polí, aby umožnil jejich editaci).
|
|
432
|
+
|
|
433
|
+
> Stejně tak se minifikace ignoruje u slovníků načítaných přes `importMode: 'fetch'`, protože takové JSON soubory pocházejí z externího API pod svými původními názvy polí — přejmenování klíčů na straně klienta by rozbilo vazbu server-klient.
|
|
322
434
|
|
|
323
|
-
###
|
|
435
|
+
### Purge (odstranění nepoužitých polí)
|
|
324
436
|
|
|
325
|
-
|
|
437
|
+
Volba `build.purge` analyzuje, ke kterým obsahovým polím se ve zdrojovém kódu skutečně přistupuje, a odstraní všechna ostatní pole z kompilovaných JSON souborů.
|
|
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
|
+
**Příklad:** Pokud má slovník pět polí, ale použita jsou pouze dvě:
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
// Před provedením purge
|
|
455
|
+
{ "title": "…", "subtitle": "…", "cta": "…", "footer": "…", "badge": "…" }
|
|
456
|
+
|
|
457
|
+
// Po provedení purge (ve zdrojovém kódu je přístup pouze na title + subtitle)
|
|
458
|
+
{ "title": "…", "subtitle": "…" }
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
> K purge nedojde, jestliže je `optimize` nastaveno na `false` nebo jestliže je `editor.enabled` `true`.
|
|
462
|
+
|
|
463
|
+
> Z bezpečnostních důvodů k purge nedojde ani tehdy, pokud nelze správně rozebrat (parse) nějaký zdrojový soubor. Dále se vynechá v situaci, kdy je výsledek z volání `useIntlayer` uložen do proměnné a předán dál způsobem, který statický analyzátor neumí sledovat (např. spread operátorem do objektu, nebo předáním přes properties (props) bez použití destrukce). V těchto případech zůstává celý slovník zachován.
|
|
464
|
+
|
|
465
|
+
### Importovací režim (Import Mode)
|
|
340
466
|
|
|
341
|
-
|
|
467
|
+
V případě rozsáhlých aplikací zahrnujících mnoho stránek a jazyků se JSON soubory mohou stát velkou zátěží pro výslednou velikost vašeho bundlu. Intlayer vám prostřednictvím volby `importMode` dovoluje kontrolovat způsob, jakým se slovníky načítají.
|
|
342
468
|
|
|
343
|
-
|
|
469
|
+
### Globální definice
|
|
344
470
|
|
|
345
|
-
|
|
471
|
+
Importovací režim lze globálně definovat v souboru `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", // Výchozí hodnota je 'static'
|
|
353
479
|
},
|
|
354
480
|
};
|
|
355
481
|
|
|
356
482
|
export default config;
|
|
357
483
|
```
|
|
358
484
|
|
|
359
|
-
|
|
485
|
+
### Definice pro konkrétní slovník
|
|
486
|
+
|
|
487
|
+
Importovací režim můžete upravit nezávisle pro každý jednotlivý slovník v odpovídajícím souboru `.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", // Přepíše výchozí hodnotu
|
|
367
495
|
content: {
|
|
368
496
|
// ...
|
|
369
497
|
},
|
|
@@ -372,83 +500,103 @@ const appContent: Dictionary = {
|
|
|
372
500
|
export default appContent;
|
|
373
501
|
```
|
|
374
502
|
|
|
375
|
-
| Vlastnost | Typ | Výchozí | Popis
|
|
376
|
-
| :--------------- | :--------------------------------- | :--------- |
|
|
377
|
-
| **`importMode`** | `'static'`, `'dynamic'`, `'fetch'` | `'static'` | **Zastaralé**:
|
|
503
|
+
| Vlastnost | Typ | Výchozí | Popis |
|
|
504
|
+
| :--------------- | :--------------------------------- | :--------- | :------------------------------------------------------------------------------------------------------------------------- |
|
|
505
|
+
| **`importMode`** | `'static'`, `'dynamic'`, `'fetch'` | `'static'` | **Zastaralé**: Použijte raději `dictionary.importMode`. Určuje, jakým způsobem se načítají slovníky (více informací níže). |
|
|
378
506
|
|
|
379
|
-
Nastavení `importMode`
|
|
380
|
-
Můžete jej definovat globálně v souboru `intlayer.config.ts` pod objektem `dictionary`, nebo jej můžete přepsat pro konkrétní slovník v jeho souboru `.content.ts`.
|
|
507
|
+
Nastavení `importMode` ovlivňuje způsob, jakým je obsah slovníku vkládán do vaší komponenty. Lze je nakonfigurovat globálně přes vlastnost `dictionary` v `intlayer.config.ts`, anebo lokálně u konkrétního slovníku v jeho `.content.ts` souboru.
|
|
381
508
|
|
|
382
|
-
### 1. Statický režim (`default`)
|
|
509
|
+
### 1. Statický režim (Static Mode - `default`)
|
|
383
510
|
|
|
384
|
-
|
|
511
|
+
Při použití statického režimu Intlayer převede volání `useIntlayer` na `useDictionary` a obsah slovníku je vložen přímo do JavaScriptového bundlu.
|
|
385
512
|
|
|
386
|
-
- **
|
|
387
|
-
- **
|
|
388
|
-
- **
|
|
513
|
+
- **Výhody:** Okamžité vykreslování (synchronní krok), během hydratace nevznikají žádné další síťové požadavky.
|
|
514
|
+
- **Nevýhody:** Bundle obsahuje překlady pro **všechny** dostupné jazyky dané komponenty.
|
|
515
|
+
- **Vhodné pro:** Single Page Aplikace (SPA).
|
|
389
516
|
|
|
390
|
-
**
|
|
517
|
+
**Ukázka transformovaného kódu:**
|
|
391
518
|
|
|
392
519
|
```tsx
|
|
393
520
|
// Váš kód
|
|
394
521
|
const content = useIntlayer("my-key");
|
|
395
522
|
|
|
396
|
-
//
|
|
523
|
+
// Příklad optimalizovaného kódu po transformaci (Static)
|
|
524
|
+
// Toto je pouze ilustrativní příklad, skutečný kód se kvůli dalším optimalizacím liší
|
|
397
525
|
const content = useDictionary({
|
|
398
526
|
key: "my-key",
|
|
399
527
|
content: {
|
|
400
528
|
nodeType: "translation",
|
|
401
529
|
translation: {
|
|
402
530
|
en: "My title",
|
|
403
|
-
|
|
531
|
+
cs: "Můj nadpis",
|
|
404
532
|
},
|
|
405
533
|
},
|
|
406
534
|
});
|
|
407
535
|
```
|
|
408
536
|
|
|
409
|
-
### 2. Dynamický režim
|
|
537
|
+
### 2. Dynamický režim (Dynamic Mode)
|
|
410
538
|
|
|
411
|
-
V dynamickém režimu Intlayer nahradí `useIntlayer`
|
|
539
|
+
V dynamickém režimu Intlayer nahradí `useIntlayer` voláním `useDictionaryAsync`. Využije přitom mechanismu `import()` (podobné použití jako React Suspense) k asynchronnímu (lazy) stažení pouze těch JSON souborů, které odpovídají aktuálnímu jazyku.
|
|
412
540
|
|
|
413
|
-
- **
|
|
414
|
-
- **
|
|
415
|
-
- **
|
|
541
|
+
- **Výhody:** **Tree shaking na úrovni jazyků (locale).** Pokud si uživatel otevře anglickou verzi, stáhne si _pouze_ anglický slovník. Český slovník se nikdy nenačte.
|
|
542
|
+
- **Nevýhody:** Během hydratace dojde k jednomu síťovému požadavku na danou komponentu (asset fetch).
|
|
543
|
+
- **Vhodné pro:** Velké textové bloky, dlouhé články nebo multijazyčné aplikace, u nichž je nezbytně nutné omezit velikost bundlu na absolutní minimum.
|
|
416
544
|
|
|
417
|
-
**
|
|
545
|
+
**Ukázka transformovaného kódu:**
|
|
418
546
|
|
|
419
547
|
```tsx
|
|
420
548
|
// Váš kód
|
|
421
549
|
const content = useIntlayer("my-key");
|
|
422
550
|
|
|
423
|
-
//
|
|
551
|
+
// Příklad optimalizovaného kódu po transformaci (Dynamic)
|
|
552
|
+
// Toto je pouze ilustrativní příklad, skutečný kód se kvůli dalším optimalizacím liší
|
|
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
|
+
cs: () =>
|
|
559
|
+
import(".intlayer/dynamic_dictionary/my-key/cs.json").then(
|
|
431
560
|
(mod) => mod.default
|
|
432
561
|
),
|
|
433
562
|
});
|
|
434
563
|
```
|
|
435
564
|
|
|
436
|
-
> Při použití `importMode: 'dynamic'
|
|
565
|
+
> Při použití `importMode: 'dynamic'` pamatujte, že pokud na jedné stránce máte např. 100 komponent volajících `useIntlayer`, prohlížeč vyvolá hned 100 oddělených stahování. Abyste předešli takovému zahlcení (tzv. "waterfall"), pokuste se seskupit obsah do méně souborů `.content` (např. jeden slovník pro celou sekci), namísto abyste dělali samostatný slovník pro úplně každou malou součástku na stránce. Stejně tak platí, že si můžete připravit i více `.content` souborů majících stejný klíč – Intlayer je sám sloučí do jedné velké struktury (jediného slovníku).
|
|
566
|
+
|
|
567
|
+
### 3. Fetch režim (Fetch Mode)
|
|
437
568
|
|
|
438
|
-
|
|
569
|
+
Z pohledu chování jde o něco velice podobného dynamickému režimu, avšak nejdříve se vždy zkusí stáhnout slovníky přímo z Intlayer Live Sync API. Jestliže API spojení selže, nebo jestliže příslušný obsah není označen k živé aktualizaci (live updates), vrátí se aplikace automaticky ke stažení přes dynamický import.
|
|
439
570
|
|
|
440
|
-
|
|
571
|
+
**Ukázka transformovaného kódu:**
|
|
572
|
+
|
|
573
|
+
```tsx
|
|
574
|
+
// Váš kód
|
|
575
|
+
const content = useIntlayer("my-key");
|
|
576
|
+
|
|
577
|
+
// Příklad optimalizovaného kódu (Fetch)
|
|
578
|
+
const content = useDictionaryAsync({
|
|
579
|
+
en: () =>
|
|
580
|
+
fetch("https://intlayer.my-domain.com/dictionary/my-key/en").then((res) =>
|
|
581
|
+
res.json()
|
|
582
|
+
),
|
|
583
|
+
cs: () =>
|
|
584
|
+
fetch("https://intlayer.my-domain.com/dictionary/my-key/cs").then((res) =>
|
|
585
|
+
res.json()
|
|
586
|
+
),
|
|
587
|
+
});
|
|
588
|
+
```
|
|
441
589
|
|
|
442
|
-
>
|
|
590
|
+
> Další informace hledejte přímo v dokumentaci k CMS: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/cs/intlayer_CMS.md)
|
|
443
591
|
|
|
444
|
-
>
|
|
592
|
+
> Při zapnutém Fetch režimu neprobíhá žádný purge (čištění) ani minifikace, jelikož JSON poskytuje samotné externí API pod jeho původními názvy atributů.
|
|
445
593
|
|
|
446
594
|
## Shrnutí: Statický vs Dynamický
|
|
447
595
|
|
|
448
|
-
|
|
|
449
|
-
| :--------------------- | :--------------------------------------------- |
|
|
450
|
-
| **Velikost JS
|
|
451
|
-
| **
|
|
452
|
-
| **Síťové požadavky** | 0
|
|
453
|
-
| **Tree Shaking** |
|
|
454
|
-
| **Nejlepší
|
|
596
|
+
| Vlastnost | Statický režim (Static Mode) | Dynamický režim (Dynamic Mode) |
|
|
597
|
+
| :--------------------- | :--------------------------------------------- | :------------------------------------------ |
|
|
598
|
+
| **Velikost JS Bundlu** | Větší (Zahrnuje všechny jazyky pro komponentu) | Nejmenší (Obsahuje pouze kód, žádný obsah) |
|
|
599
|
+
| **Při načtení** | Okamžitě (Obsah je rovnou součástí bundlu) | Mírná zpoždění (Sťahuje dodatečné JSON) |
|
|
600
|
+
| **Síťové požadavky** | 0 požadavků navíc | 1 požadavek pro každý klíč slovníku |
|
|
601
|
+
| **Tree Shaking** | Pouze na úrovni jednotlivých komponent | Na úrovni komponent i na úrovni jazyka |
|
|
602
|
+
| **Nejlepší scénář** | Uživatelské prvky UI, jednodušší malé aplikace | Rozsáhlé textové strany a vícejazyčné celky |
|