@intlayer/docs 9.2.0 → 9.3.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/blog/ar/index.md +1 -1
- package/blog/de/index.md +1 -1
- package/blog/en/index.md +1 -1
- package/blog/en-GB/index.md +1 -1
- package/blog/es/index.md +1 -1
- package/blog/fr/index.md +1 -1
- package/blog/hi/index.md +1 -1
- package/blog/id/index.md +1 -1
- package/blog/it/index.md +1 -1
- package/blog/ja/index.md +1 -1
- package/blog/ko/index.md +1 -1
- package/blog/pl/index.md +1 -1
- package/blog/pt/index.md +1 -1
- package/blog/ru/index.md +1 -1
- package/blog/uk/index.md +1 -1
- package/blog/vi/index.md +1 -1
- package/blog/zh/index.md +1 -1
- package/dist/cjs/common.cjs +24 -1
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +31 -4
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +31 -4
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +31 -4
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +31 -4
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/common.mjs +24 -1
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +31 -4
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +31 -4
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +31 -4
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +31 -4
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +58 -25
- package/docs/ar/live-sync.md +4 -0
- package/docs/bn/bundle_optimization.md +58 -25
- package/docs/cs/bundle_optimization.md +58 -25
- package/docs/de/bundle_optimization.md +58 -25
- package/docs/de/live-sync.md +4 -0
- package/docs/en/bundle_optimization.md +51 -23
- package/docs/en/live-sync.md +4 -0
- package/docs/en-GB/bundle_optimization.md +58 -25
- package/docs/en-GB/live-sync.md +4 -0
- package/docs/es/bundle_optimization.md +58 -25
- package/docs/es/live-sync.md +4 -0
- package/docs/fr/bundle_optimization.md +58 -25
- package/docs/fr/live-sync.md +4 -0
- package/docs/hi/bundle_optimization.md +58 -25
- package/docs/hi/live-sync.md +4 -0
- package/docs/id/bundle_optimization.md +58 -25
- package/docs/id/live-sync.md +4 -0
- package/docs/it/bundle_optimization.md +58 -25
- package/docs/it/live-sync.md +4 -0
- package/docs/ja/bundle_optimization.md +58 -25
- package/docs/ja/live-sync.md +4 -0
- package/docs/ko/bundle_optimization.md +58 -25
- package/docs/ko/live-sync.md +4 -0
- package/docs/nl/bundle_optimization.md +58 -25
- package/docs/pl/bundle_optimization.md +58 -25
- package/docs/pl/live-sync.md +4 -0
- package/docs/pt/bundle_optimization.md +58 -24
- package/docs/pt/live-sync.md +4 -0
- package/docs/ru/bundle_optimization.md +58 -25
- package/docs/ru/live-sync.md +4 -0
- package/docs/tr/bundle_optimization.md +58 -25
- package/docs/tr/live-sync.md +4 -0
- package/docs/uk/bundle_optimization.md +58 -25
- package/docs/uk/live-sync.md +4 -0
- package/docs/ur/bundle_optimization.md +58 -25
- package/docs/vi/bundle_optimization.md +58 -25
- package/docs/vi/live-sync.md +4 -0
- package/docs/zh/bundle_optimization.md +58 -25
- package/docs/zh/live-sync.md +4 -0
- package/docs/zh-TW/bundle_optimization.md +58 -25
- package/package.json +7 -7
- package/src/common.ts +39 -2
- package/src/generated/blog.entry.ts +39 -7
- package/src/generated/docs.entry.ts +39 -7
- package/src/generated/frequentQuestions.entry.ts +39 -7
- package/src/generated/legal.entry.ts +39 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-09
|
|
4
4
|
title: i18n بنڈل سائز اور کارکردگی کی آپٹیمائزیشن
|
|
5
5
|
description: انٹرنیشنلائزیشن (i18n) مواد کو آپٹیمائز کرکے اپنی ایپلیکیشن کے بنڈل سائز کو کم کریں۔ جانیں کہ Intlayer کے ساتھ ڈکشنریوں کے لیے ٹری شیکنگ (tree shaking) اور لیزی لوڈنگ (lazy loading) کا استعمال کیسے کریں۔
|
|
6
6
|
keywords:
|
|
@@ -16,6 +16,12 @@ slugs:
|
|
|
16
16
|
- concept
|
|
17
17
|
- bundle-optimization
|
|
18
18
|
history:
|
|
19
|
+
- version: 9.2.1
|
|
20
|
+
date: 2026-08-09
|
|
21
|
+
changes: "`purge` اور `minify` اب `@intlayer/swc` کے ذریعے Next.js پر کام کرتے ہیں — `babel.config.js` کی ضرورت نہیں"
|
|
22
|
+
- version: 8.12.0
|
|
23
|
+
date: 2026-06-24
|
|
24
|
+
changes: "حوالہ جاتی جدولوں میں Babel پلگ اِنز کو مطلوبہ پائپ لائن ترتیب (extract → purge → minify → optimize) میں درج کرنا"
|
|
19
25
|
- version: 8.12.0
|
|
20
26
|
date: 2026-06-07
|
|
21
27
|
changes: "Babel/Webpack کے لیے `intlayerPurgeBabelPlugin` اور `intlayerMinifyBabelPlugin` شامل کیا گیا؛ پلگ ان پائپ لائن کو واضح کیا گیا"
|
|
@@ -191,12 +197,14 @@ Intlayer کا بلڈ آپٹیمائزیشن کئی الگ الگ پلگ انز
|
|
|
191
197
|
|
|
192
198
|
یہ براہ راست Webpack پر مبنی سیٹ اپس کے لیے `babel.config.js` میں استعمال ہوتے ہیں (جیسے Babel کے ساتھ Next.js، CRA، کسٹم Webpack وغیرہ)۔
|
|
193
199
|
|
|
200
|
+
نیچے دیا گیا جدول انہیں مطلوبہ پائپ لائن ترتیب میں درج کرتا ہے (وہی ترتیب جس میں انہیں `babel.config.js` میں آنا چاہیے):
|
|
201
|
+
|
|
194
202
|
| پلگ ان | یہ کیا کرتا ہے |
|
|
195
203
|
| :---------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
196
204
|
| `intlayerExtractBabelPlugin` | `.content.ts` فائلوں کو اسکین کرتا ہے اور مرتب کی گئی (compiled) ڈکشنریوں کو `.intlayer/` میں لکھتا ہے |
|
|
197
|
-
| `intlayerOptimizeBabelPlugin` | `useIntlayer('key')` کو `useDictionary(hash)` میں بدل دیتا ہے اور متعلقہ ڈکشنری کا `import` شامل (inject) کرتا ہے |
|
|
198
205
|
| `intlayerPurgeBabelPlugin` | تمام سورس (source) فائلوں کو اسکین کرتا ہے، مرتب شدہ `.intlayer/**/*.json` ڈکشنری فائلوں سے **غیر استعمال شدہ مواد (unused content fields)** کو ہٹا دیتا ہے |
|
|
199
206
|
| `intlayerMinifyBabelPlugin` | JSON فائلوں اور سورس کوڈ دونوں میں **مواد کی فیلڈ کیز (keys) کا نام بدل کر** چھوٹے حروف تہجی (alias) رکھ دیتا ہے (جیسے `title` → `a`) |
|
|
207
|
+
| `intlayerOptimizeBabelPlugin` | `useIntlayer('key')` کو `useDictionary(hash)` میں بدل دیتا ہے اور متعلقہ ڈکشنری کا `import` شامل (inject) کرتا ہے |
|
|
200
208
|
|
|
201
209
|
> **پلگ ان کی ترتیب اہم ہے۔** آپ کے `babel.config.js` میں purge اور minify کے پلگ انز کا optimize پلگ ان سے **پہلے** ہونا لازمی ہے۔ optimize مرحلہ (pass) `useIntlayer('key')` کو ایک مبہم `useDictionary(hash)` کال سے بدل دیتا ہے، جس سے ڈکشنری کی (key) کی وہ معلومات مٹ جاتی ہے جس کی purge اور minify مراحل کو ضرورت ہوتی ہے تاکہ وہ جان سکیں کہ کون سی فیلڈز استعمال ہو رہی ہیں۔
|
|
202
210
|
|
|
@@ -205,9 +213,9 @@ Intlayer کا بلڈ آپٹیمائزیشن کئی الگ الگ پلگ انز
|
|
|
205
213
|
| آپشنز ہیلپر (Options helper) | کس کے ساتھ استعمال ہوتا ہے |
|
|
206
214
|
| :--------------------------- | :---------------------------- |
|
|
207
215
|
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
208
|
-
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
209
216
|
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
210
217
|
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
218
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
211
219
|
|
|
212
220
|
### Vite پلگ انز (`vite-intlayer`)
|
|
213
221
|
|
|
@@ -220,6 +228,20 @@ Vite کے صارفین **انہیں کبھی بھی براہ راست کنفیگ
|
|
|
220
228
|
| Dictionary minify | بالکل `intlayerMinifyBabelPlugin` کے JSON رائٹ مرحلے کی طرح |
|
|
221
229
|
| Babel transform | بالکل `intlayerMinifyBabelPlugin` کے سورس کوڈ کے رینیم اور `intlayerOptimizeBabelPlugin` کی طرح |
|
|
222
230
|
|
|
231
|
+
### SWC پلگ اِن (`@intlayer/swc`)
|
|
232
|
+
|
|
233
|
+
Next.js استعمال کرنے والے بھی **انہیں کبھی براہِ راست ترتیب نہیں دیتے**۔ **v9.2.1** سے، `next.config.ts` میں `withIntlayer()` صرف `build.purge` اور `build.minify` فلیگز کی بنیاد پر مکمل پائپ لائن چلاتا ہے — purge، minify اور import کی دوبارہ تحریر۔
|
|
234
|
+
|
|
235
|
+
کام دو حصوں میں بٹا ہوا ہے، کیونکہ SWC کا Wasm پلگ اِن ایک وقت میں ایک ہی فائل کو تبدیل کرتا ہے اور اسے فائل سسٹم تک رسائی نہیں ہوتی:
|
|
236
|
+
|
|
237
|
+
| مرحلہ | کہاں چلتا ہے | کیا کرتا ہے |
|
|
238
|
+
| :-------------------------------------------- | :----------------------------- | :--------------------------------------------------------------------------------------------------------- |
|
|
239
|
+
| استعمال کا تجزیہ + JSON purge/minify | Node، `withIntlayer()` کے اندر | ہر کمپوننٹ سورس فائل پڑھتا ہے، `.intlayer/**/*.json` دوبارہ لکھتا ہے، اور نام بدلنے کی جدولیں تیار کرتا ہے |
|
|
240
|
+
| سورس کی دوبارہ تحریر (`content.title` ← `.a`) | `@intlayer/swc` (Wasm) | نام بدلنے کی جدولیں آپ کے کوڈ میں متعلقہ پراپرٹی رسائیوں پر لاگو کرتا ہے |
|
|
241
|
+
| Import کی دوبارہ تحریر (`useIntlayer` ← dict) | `@intlayer/swc` (Wasm) | `intlayerOptimizeBabelPlugin` کی طرح |
|
|
242
|
+
|
|
243
|
+
یہ طے کرنا کہ _کون سے_ فیلڈز غیر استعمال شدہ ہیں اور ہر ایک کو _کون سا_ مختصر نام ملے گا، اس کے لیے فائلوں کے درمیان حالت اور فائل I/O درکار ہے، اس لیے وہ نصف حصہ Node میں چلتا ہے؛ SWC پلگ اِن کو صرف نتیجہ خیز جدولیں ملتی ہیں۔
|
|
244
|
+
|
|
223
245
|
## پلیٹ فارم کے لحاظ سے سیٹ اپ
|
|
224
246
|
|
|
225
247
|
<Tabs>
|
|
@@ -227,10 +249,12 @@ Vite کے صارفین **انہیں کبھی بھی براہ راست کنفیگ
|
|
|
227
249
|
|
|
228
250
|
### Next.js
|
|
229
251
|
|
|
230
|
-
Next.js کو
|
|
252
|
+
Next.js کو `@intlayer/swc` پلگ اِن درکار ہے، کیونکہ Next.js بلڈ کے لیے SWC استعمال کرتا ہے۔ **v9.2.1** سے یہ اکیلا پیکیج پوری پائپ لائن کا احاطہ کرتا ہے — آپٹیمائز (import کی دوبارہ تحریر)، purge اور minify۔
|
|
231
253
|
|
|
232
254
|
> یہ پلگ ان بائی ڈیفالٹ انسٹال نہیں ہوتا کیونکہ SWC کے پلگ انز Next.js کے لیے اب بھی تجرباتی مراحل میں ہیں۔ یہ مستقبل میں بدل سکتا ہے۔
|
|
233
255
|
|
|
256
|
+
> **Next.js 16.1.0 کم از کم ورژن ہے۔** یہ SWC کے آگے کی جانب ہم آہنگ Wasm پلگ اِن ABI پر بنایا گیا پہلا ریلیز ہے؛ اس سے پرانے ریلیز پلگ اِن کو مسترد کر دیتے ہیں۔ `withIntlayer` آپ کے پروجیکٹ کا Next.js ورژن پڑھتا ہے اور 16.1.0 سے نیچے پلگ اِن رجسٹر ہی نہیں کرتا — وہ بلڈز پھر بھی کامیاب ہوتے ہیں، بس بنڈل آپٹیمائزیشن کے بغیر چلتے ہیں۔
|
|
257
|
+
|
|
234
258
|
<Tabs>
|
|
235
259
|
<Tab value="npm">
|
|
236
260
|
|
|
@@ -265,33 +289,40 @@ intlayer-swc-plugin = "*"
|
|
|
265
289
|
|
|
266
290
|
انسٹال ہونے کے بعد، Intlayer خود بخود پلگ ان کو شناخت کر کے اس کا استعمال شروع کر دے گا۔
|
|
267
291
|
|
|
268
|
-
**
|
|
292
|
+
**Purge اور minify** مراحل (فیلڈ ہٹانا اور فیلڈ کا نام بدلنا) کے لیے کسی اضافی پیکیج یا `babel.config.js` کی ضرورت نہیں۔ اپنی کنفیگ کو `withIntlayer` سے لپیٹیں اور `intlayer.config.ts` میں فلیگز آن کریں:
|
|
269
293
|
|
|
270
|
-
```
|
|
271
|
-
|
|
294
|
+
```typescript fileName="next.config.ts"
|
|
295
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
296
|
+
import type { NextConfig } from "next";
|
|
297
|
+
|
|
298
|
+
const nextConfig: NextConfig = {/* آپ کی کنفیگ */};
|
|
299
|
+
|
|
300
|
+
export default withIntlayer(nextConfig);
|
|
272
301
|
```
|
|
273
302
|
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
intlayerPurgeBabelPlugin,
|
|
277
|
-
intlayerMinifyBabelPlugin,
|
|
278
|
-
getPurgePluginOptions,
|
|
279
|
-
getMinifyPluginOptions,
|
|
280
|
-
} = require("@intlayer/babel");
|
|
303
|
+
```typescript fileName="intlayer.config.ts"
|
|
304
|
+
import type { IntlayerConfig } from "intlayer";
|
|
281
305
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
//
|
|
286
|
-
|
|
287
|
-
// Minify: JSON اور سورس کوڈ میں مواد کی فیلڈ کیز کا نام بدلیں
|
|
288
|
-
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
289
|
-
// نوٹ: intlayerOptimizeBabelPlugin کی یہاں ضرورت نہیں ہے کیونکہ
|
|
290
|
-
// @intlayer/swc اسے useIntlayer → useDictionary ری رائٹ کو سنبھالتا ہے۔
|
|
291
|
-
],
|
|
306
|
+
const config: IntlayerConfig = {
|
|
307
|
+
build: {
|
|
308
|
+
purge: true, // بنڈل کیے گئے JSON سے غیر استعمال شدہ مواد کے فیلڈز ہٹاتا ہے
|
|
309
|
+
minify: true, // مواد کے فیلڈ کیز کو مختصر ناموں میں بدلتا ہے
|
|
310
|
+
},
|
|
292
311
|
};
|
|
312
|
+
|
|
313
|
+
export default config;
|
|
293
314
|
```
|
|
294
315
|
|
|
316
|
+
`next build` کے دوران، `withIntlayer` آپ کے سورسز کا تجزیہ کرتا ہے، مرتب شدہ ڈکشنریز دوبارہ لکھتا ہے، اور نتیجے میں بننے والی فیلڈ نام بدلنے کی جدولیں `@intlayer/swc` کو دیتا ہے، جو آپ کے کوڈ میں متعلقہ پراپرٹی رسائیوں کو اپ ڈیٹ کرتا ہے۔
|
|
317
|
+
|
|
318
|
+
> `withIntlayerSync` نہیں بلکہ غیر ہم وقت (async) `withIntlayer` استعمال کریں۔ ہم وقت نسخہ تجزیے کی پائپ لائن نہیں چلاتا، اس لیے اس کے ساتھ purge اور minify کا کوئی اثر نہیں ہوتا۔
|
|
319
|
+
|
|
320
|
+
> Purge اور minify صرف `next build` پر چلتے ہیں — آپٹیمائز پائپ لائن `next dev` کے دوران بند رہتی ہے۔
|
|
321
|
+
|
|
322
|
+
> جب کمپیٹ اڈاپٹر کالرز ترتیب دیے گئے ہوں تب بھی یہ غیر فعال ہو جاتے ہیں (`swcExtraCallers`، جنہیں `@intlayer/next-intl` یا `@intlayer/react-i18next` جیسے کمپیٹ پیکیجز مقرر کرتے ہیں): وہ کال سائٹس استعمال کے تجزیہ کار کو نظر نہیں آتیں، اس لیے purge ایسے فیلڈز ہٹا دیتا جو کوڈ اب بھی پڑھتا ہے۔ Import کی دوبارہ تحریر فعال رہتی ہے۔
|
|
323
|
+
|
|
324
|
+
**پرانے ورژنز (9.2.1 سے پہلے)** میں `@intlayer/babel` اور ایک ایسی `babel.config.js` درکار تھی جو `intlayerPurgeBabelPlugin` اور `intlayerMinifyBabelPlugin` کا اعلان کرے۔ اب اس فائل کی ضرورت نہیں اور اسے حذف کیا جا سکتا ہے۔
|
|
325
|
+
|
|
295
326
|
</Tab>
|
|
296
327
|
<Tab value="vite">
|
|
297
328
|
|
|
@@ -447,6 +478,8 @@ export default config;
|
|
|
447
478
|
|
|
448
479
|
> منی فیکیشن کو چھوڑ (skipped) دیا جاتا ہے جب `optimize` کی ویلیو `false` ہو، یا جب `editor.enabled` کی ویلیو `true` ہو (ویژول ایڈیٹر کو ایڈیٹنگ کی اجازت دینے کے لیے اصل فیلڈ کے ناموں کی ضرورت ہوتی ہے)۔
|
|
449
480
|
|
|
481
|
+
> Next.js پر، minification تب بھی چھوڑ دی جاتی ہے جب `@intlayer/swc` نصب نہ ہو یا لوڈ نہ ہو سکے (16.1.0 سے نیچے کا Next.js)۔ سورس میں رسائیوں کو دوبارہ لکھنے والا نصف حصہ یہی پلگ اِن ہے، اس لیے اس کے بغیر ڈکشنریز کے نام بدلنے سے آپ کا کوڈ ایسے فیلڈ نام پڑھتا رہ جائے گا جو اب موجود نہیں۔
|
|
482
|
+
|
|
450
483
|
> منی فیکیشن ان ڈکشنریوں کے لیے بھی نظرانداز کی جاتی ہے جنہیں `importMode: 'fetch'` کے ذریعے لوڈ کیا گیا ہو کیونکہ ان کا JSON ریموٹ API سے اصل فیلڈ ناموں کے ساتھ پیش کیا جاتا ہے — کلائنٹ سائیڈ کیز کا نام بدلنے سے سرور/کلائنٹ کا کنٹریکٹ (contract) ٹوٹ جائے گا۔
|
|
451
484
|
|
|
452
485
|
### پرجنگ (غیر استعمال شدہ فیلڈز کو ہٹانا)
|
|
@@ -475,7 +508,7 @@ export default config;
|
|
|
475
508
|
{ "title": "…", "subtitle": "…" }
|
|
476
509
|
```
|
|
477
510
|
|
|
478
|
-
> جب `optimize` کی ویلیو `false` ہو یا جب `editor.enabled` کی ویلیو `true` ہو تو پرجنگ (Purging) چھوڑ (skipped) دی جاتی ہے۔
|
|
511
|
+
> جب `optimize` کی ویلیو `false` ہو یا جب `editor.enabled` کی ویلیو `true` ہو تو پرجنگ (Purging) چھوڑ (skipped) دی جاتی ہے۔ Next.js پر یہ تب بھی چھوڑ دیا جاتا ہے جب `@intlayer/swc` دستیاب نہ ہو، اور جب کمپیٹ اڈاپٹر کالرز ترتیب دیے گئے ہوں۔
|
|
479
512
|
|
|
480
513
|
> پرجنگ کو حفاظتی تدابیر (conservatively) کے طور پر ان حالات میں بھی چھوڑ دیا جاتا ہے جب کوئی سورس فائل پارس (parse) نہیں ہو پاتی، یا جب `useIntlayer` کا نتیجہ کسی ویری ایبل کو تفویض (assign) کر دیا جائے اور پھر ان طریقوں سے آگے بڑھایا جائے جن کا اسٹیٹک اینالائزر کھوج نہیں لگا سکتا (جیسے اسپریڈ کو کسی آبجیکٹ میں ڈالنا، ڈسٹرکچر کیے بغیر پروپ کے طور پر بھیجنا)۔ ان صورتوں میں، مکمل ڈکشنری محفوظ رکھی جاتی ہے۔
|
|
481
514
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-09
|
|
4
4
|
title: Tối ưu hóa dung lượng Bundle & Hiệu suất i18n
|
|
5
5
|
description: Giảm dung lượng bundle của ứng dụng bằng cách tối ưu hóa nội dung quốc tế hóa (i18n). Tìm hiểu cách tận dụng tree shaking và tải 지연 (lazy loading) cho các từ điển với Intlayer.
|
|
6
6
|
keywords:
|
|
@@ -16,6 +16,12 @@ slugs:
|
|
|
16
16
|
- concept
|
|
17
17
|
- bundle-optimization
|
|
18
18
|
history:
|
|
19
|
+
- version: 9.2.1
|
|
20
|
+
date: 2026-08-09
|
|
21
|
+
changes: "`purge` và `minify` giờ đã hoạt động trên Next.js thông qua `@intlayer/swc` — không cần `babel.config.js`"
|
|
22
|
+
- version: 8.12.0
|
|
23
|
+
date: 2026-06-24
|
|
24
|
+
changes: "Liệt kê các plugin Babel theo đúng thứ tự pipeline (extract → purge → minify → optimize) trong các bảng tham chiếu"
|
|
19
25
|
- version: 8.12.0
|
|
20
26
|
date: 2026-06-07
|
|
21
27
|
changes: "Thêm `intlayerPurgeBabelPlugin` và `intlayerMinifyBabelPlugin` cho Babel/Webpack; làm rõ quá trình thực thi của các plugin"
|
|
@@ -191,12 +197,14 @@ Trình tối ưu hóa build của Intlayer được chia làm nhiều plugin ri
|
|
|
191
197
|
|
|
192
198
|
Những plugin này được khai báo trực tiếp vào `babel.config.js` ở các dự án phụ thuộc cấu hình Webpack (như Next.js dùng Babel, CRA, hoặc Webpack tùy chỉnh v.v.).
|
|
193
199
|
|
|
200
|
+
Bảng dưới đây liệt kê chúng theo đúng thứ tự pipeline (cùng thứ tự mà chúng phải xuất hiện trong `babel.config.js`):
|
|
201
|
+
|
|
194
202
|
| Plugin | Công dụng |
|
|
195
203
|
| :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
196
204
|
| `intlayerExtractBabelPlugin` | Quét các file `.content.ts` và ghi nội dung từ điển đã biên dịch thành định dạng chuẩn vào thư mục `.intlayer/` |
|
|
197
|
-
| `intlayerOptimizeBabelPlugin` | Viết lại `useIntlayer('key')` thành `useDictionary(hash)` và tự động inject thư viện `import` để nạp từ điển khớp tương ứng |
|
|
198
205
|
| `intlayerPurgeBabelPlugin` | Quét toàn bộ mã nguồn, thực hiện loại bỏ (remove) **các trường nội dung không được sử dụng** ở file từ điển JSON tại `.intlayer/**/*.json` |
|
|
199
206
|
| `intlayerMinifyBabelPlugin` | **Rút ngắn tên (rename) khóa (keys) của nội dung** thành ký tự ngắn rút gọn (vd: `title` đổi thành `a`) ở JSON cũng như bên trong Source Code |
|
|
207
|
+
| `intlayerOptimizeBabelPlugin` | Viết lại `useIntlayer('key')` thành `useDictionary(hash)` và tự động inject thư viện `import` để nạp từ điển khớp tương ứng |
|
|
200
208
|
|
|
201
209
|
> **Thứ tự sắp xếp của plugin là rất quan trọng.** Trong `babel.config.js` của bạn, các plugin purge và minify phải được đặt **trước** plugin optimize. Bước optimize thay thế `useIntlayer('key')` bằng một hàm gọi không minh bạch `useDictionary(hash)`, điều này có khả năng làm mất thông tin dictionary-key gốc - vốn là thông tin cần thiết để purge và minify có thể định danh các trường thuộc tính đang được ứng dụng.
|
|
202
210
|
|
|
@@ -205,9 +213,9 @@ Mỗi plugin Babel sẽ đi kèm một helper option để đọc trực tiếp
|
|
|
205
213
|
| Options helper | Dùng cùng với |
|
|
206
214
|
| :--------------------------- | :---------------------------- |
|
|
207
215
|
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
208
|
-
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
209
216
|
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
210
217
|
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
218
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
211
219
|
|
|
212
220
|
### Các plugin của Vite (`vite-intlayer`)
|
|
213
221
|
|
|
@@ -220,6 +228,20 @@ Những người dùng Vite **không bao giờ phải cấu hình cái này mộ
|
|
|
220
228
|
| Dictionary minify | Tương tự quy trình cắt giảm và rút ngắn độ dài JSON của `intlayerMinifyBabelPlugin` qua JSON |
|
|
221
229
|
| Babel transform | Tương tự quá trình viết lại tên khóa (key rename) bên nguồn code của `intlayerMinifyBabelPlugin` + thay phiên mã của `intlayerOptimizeBabelPlugin` |
|
|
222
230
|
|
|
231
|
+
### Plugin SWC (`@intlayer/swc`)
|
|
232
|
+
|
|
233
|
+
Người dùng Next.js cũng **không bao giờ cấu hình những thứ này trực tiếp**. Từ **v9.2.1**, `withIntlayer()` trong `next.config.ts` chạy toàn bộ pipeline — purge, minify và viết lại import — chỉ dựa trên hai cờ `build.purge` và `build.minify`.
|
|
234
|
+
|
|
235
|
+
Công việc được chia làm hai, vì một plugin Wasm của SWC chỉ biến đổi một tệp tại một thời điểm và không có quyền truy cập hệ thống tệp:
|
|
236
|
+
|
|
237
|
+
| Lượt xử lý | Chạy ở đâu | Làm gì |
|
|
238
|
+
| :----------------------------------------- | :------------------------------- | :--------------------------------------------------------------------------------------- |
|
|
239
|
+
| Phân tích sử dụng + purge/minify JSON | Node, bên trong `withIntlayer()` | Đọc mọi tệp nguồn của component, viết lại `.intlayer/**/*.json`, tạo ra các bảng đổi tên |
|
|
240
|
+
| Viết lại mã nguồn (`content.title` → `.a`) | `@intlayer/swc` (Wasm) | Áp dụng các bảng đổi tên cho những truy cập thuộc tính tương ứng trong mã của bạn |
|
|
241
|
+
| Viết lại import (`useIntlayer` → dict) | `@intlayer/swc` (Wasm) | Giống `intlayerOptimizeBabelPlugin` |
|
|
242
|
+
|
|
243
|
+
Việc xác định _những_ trường nào không được dùng và mỗi trường nhận _bí danh_ nào đòi hỏi trạng thái xuyên tệp và I/O tệp, nên nửa đó chạy trong Node; plugin SWC chỉ nhận các bảng kết quả.
|
|
244
|
+
|
|
223
245
|
## Tùy chỉnh thiết lập dựa vào Platform (nền tảng)
|
|
224
246
|
|
|
225
247
|
<Tabs>
|
|
@@ -227,10 +249,12 @@ Những người dùng Vite **không bao giờ phải cấu hình cái này mộ
|
|
|
227
249
|
|
|
228
250
|
### Next.js
|
|
229
251
|
|
|
230
|
-
Next.js
|
|
252
|
+
Next.js cần plugin `@intlayer/swc`, vì Next.js dùng SWC để build. Từ **v9.2.1**, chỉ một gói này đã bao trọn toàn bộ pipeline — tối ưu hóa (viết lại import), purge và minify.
|
|
231
253
|
|
|
232
254
|
> Plugin này không cài đặt theo mặc định bởi vì nền tảng hỗ trợ (API SWC Plugins) trên Next.js vẫn còn là một thử nghiệm. Do đó sẽ có thay đổi khi nó được cập nhật.
|
|
233
255
|
|
|
256
|
+
> **Next.js 16.1.0 là phiên bản tối thiểu.** Đây là bản phát hành đầu tiên được xây dựng trên ABI plugin Wasm tương thích tiến của SWC; các bản trước đó từ chối plugin. `withIntlayer` đọc phiên bản Next.js của dự án và đơn giản là không đăng ký plugin nếu thấp hơn 16.1.0 — các build đó vẫn thành công, chỉ là chạy mà không có tối ưu hóa bundle.
|
|
257
|
+
|
|
234
258
|
<Tabs>
|
|
235
259
|
<Tab value="npm">
|
|
236
260
|
|
|
@@ -265,33 +289,40 @@ intlayer-swc-plugin = "*"
|
|
|
265
289
|
|
|
266
290
|
Sau khi hoàn tất, Intlayer có thể tìm kiếm và ứng dụng tự động nó cho phần compile hệ thống.
|
|
267
291
|
|
|
268
|
-
|
|
292
|
+
Các lượt **purge và minify** (xóa trường và đổi tên trường) không cần gói bổ sung nào cũng không cần `babel.config.js`. Hãy bọc cấu hình của bạn bằng `withIntlayer` và bật các cờ trong `intlayer.config.ts`:
|
|
269
293
|
|
|
270
|
-
```
|
|
271
|
-
|
|
294
|
+
```typescript fileName="next.config.ts"
|
|
295
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
296
|
+
import type { NextConfig } from "next";
|
|
297
|
+
|
|
298
|
+
const nextConfig: NextConfig = {/* cấu hình của bạn */};
|
|
299
|
+
|
|
300
|
+
export default withIntlayer(nextConfig);
|
|
272
301
|
```
|
|
273
302
|
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
intlayerPurgeBabelPlugin,
|
|
277
|
-
intlayerMinifyBabelPlugin,
|
|
278
|
-
getPurgePluginOptions,
|
|
279
|
-
getMinifyPluginOptions,
|
|
280
|
-
} = require("@intlayer/babel");
|
|
303
|
+
```typescript fileName="intlayer.config.ts"
|
|
304
|
+
import type { IntlayerConfig } from "intlayer";
|
|
281
305
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
// Minify: rút gọn và rút ngắn tên cho các JSON + sửa lệnh ở trên source code
|
|
288
|
-
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
289
|
-
// Lưu ý: Không cần đến khai báo `intlayerOptimizeBabelPlugin` ở đây vì
|
|
290
|
-
// @intlayer/swc đã tiếp quản tiến trình biến đổi useIntlayer → useDictionary.
|
|
291
|
-
],
|
|
306
|
+
const config: IntlayerConfig = {
|
|
307
|
+
build: {
|
|
308
|
+
purge: true, // xóa các trường nội dung không dùng khỏi JSON được đóng gói
|
|
309
|
+
minify: true, // đổi tên khóa trường nội dung thành bí danh ngắn
|
|
310
|
+
},
|
|
292
311
|
};
|
|
312
|
+
|
|
313
|
+
export default config;
|
|
293
314
|
```
|
|
294
315
|
|
|
316
|
+
Trong quá trình `next build`, `withIntlayer` phân tích mã nguồn, viết lại các từ điển đã biên dịch và chuyển các bảng đổi tên trường thu được cho `@intlayer/swc`, plugin này cập nhật những truy cập thuộc tính tương ứng trong mã của bạn.
|
|
317
|
+
|
|
318
|
+
> Hãy dùng `withIntlayer` bất đồng bộ, không phải `withIntlayerSync`. Biến thể đồng bộ không chạy pipeline phân tích, nên purge và minify không có tác dụng với nó.
|
|
319
|
+
|
|
320
|
+
> Purge và minify chỉ chạy khi `next build` — pipeline tối ưu hóa tắt trong lúc `next dev`.
|
|
321
|
+
|
|
322
|
+
> Chúng cũng bị tắt khi có cấu hình các lời gọi từ bộ chuyển đổi tương thích (`swcExtraCallers`, do các gói tương thích như `@intlayer/next-intl` hay `@intlayer/react-i18next` thiết lập): những điểm gọi đó vô hình với bộ phân tích sử dụng, nên purge sẽ xóa mất các trường mà mã vẫn đang đọc. Việc viết lại import vẫn hoạt động.
|
|
323
|
+
|
|
324
|
+
**Các phiên bản trước (trước 9.2.1)** yêu cầu `@intlayer/babel` và một tệp `babel.config.js` khai báo `intlayerPurgeBabelPlugin` và `intlayerMinifyBabelPlugin`. Tệp đó không còn cần thiết và có thể xóa.
|
|
325
|
+
|
|
295
326
|
</Tab>
|
|
296
327
|
<Tab value="vite">
|
|
297
328
|
|
|
@@ -447,6 +478,8 @@ export default config;
|
|
|
447
478
|
|
|
448
479
|
> Lưu ý: Sự can thiệp minify sẽ ngừng thực hiện nếu cờ `optimize` được kích ở mức `false` hoặc lúc bộ hiển thị bằng editor đang dùng tham số `editor.enabled` = `true` (do phía editor thiết kế cần đọc đúng định dạng khai báo nguồn nội dung ban đầu từ file config).
|
|
449
480
|
|
|
481
|
+
> Trên Next.js, minify cũng bị bỏ qua khi `@intlayer/swc` không được cài đặt hoặc không thể tải (Next.js dưới 16.1.0). Plugin chính là nửa viết lại các truy cập trong mã nguồn, nên đổi tên từ điển mà thiếu nó sẽ khiến mã của bạn đọc những tên trường không còn tồn tại.
|
|
482
|
+
|
|
450
483
|
> Sự can thiệp bằng minify đồng thời mất kiểm soát khi tải từ các lệnh gọi JSON ngoại lai của server api khác thông qua thông số gán thiết lập mặc định qua file nguồn `importMode: 'fetch'` — điều này giải quyết và chống phá hỏng liên lạc bằng json của đầu ra máy chủ do nếu app tại máy tính người xài thay danh định gốc trên code sẽ đứt đường tiếp nhận dữ liệu phía cloud.
|
|
451
484
|
|
|
452
485
|
### Hệ chức năng gạt bỏ rác Purging (xóa trắng các khóa thuộc tính trống hoặc dư)
|
|
@@ -475,7 +508,7 @@ export default config;
|
|
|
475
508
|
{ "title": "…", "subtitle": "…" }
|
|
476
509
|
```
|
|
477
510
|
|
|
478
|
-
> Hãy cân nhắc bởi Purge cũng chẳng khác gì minify, hệ sẽ phớt lờ thao tác nếu như thông số thuộc `optimize` để là `false` hay công cụ trình hỗ trợ `editor.enabled` đang mở (true).
|
|
511
|
+
> Hãy cân nhắc bởi Purge cũng chẳng khác gì minify, hệ sẽ phớt lờ thao tác nếu như thông số thuộc `optimize` để là `false` hay công cụ trình hỗ trợ `editor.enabled` đang mở (true). Trên Next.js, nó còn bị bỏ qua khi `@intlayer/swc` không khả dụng và khi có cấu hình các lời gọi từ bộ chuyển đổi tương thích.
|
|
479
512
|
|
|
480
513
|
> Ngoài ra chức năng của hệ cũng bảo lưu quy trình rủi ro và buộc dừng tiến trình purge (như khi không parse được code nguồn để phân tích), hoặc lệnh trả biến ở bộ thu nhận `useIntlayer` xài như thông số ẩn hoặc bị mã hóa ngầm lúc khai báo truyền tin nên analyzer bot mất dấu để định hướng hành tung của nội dung nguồn (một trường hợp cụ thể đó là kiểu trải dữ liệu `spread` cho vô Object bự xài nhưng quên không destructure rõ ràng tham số lúc dùng trong prop). Tại ranh giới bất an kiểu này hệ tự ép lấy sạch sành sanh cho yên tâm trọn gói JSON mà khỏi sợ cắt lố làm mất dữ liệu oan.
|
|
481
514
|
|
package/docs/vi/live-sync.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-09
|
|
4
4
|
title: 优化 i18n 打包体积与性能
|
|
5
5
|
description: 通过优化国际化(i18n)内容来减小应用程序包的大小。了解如何利用 Intlayer 实现字典的 tree shaking 和延迟加载(lazy loading)。
|
|
6
6
|
keywords:
|
|
@@ -16,6 +16,12 @@ slugs:
|
|
|
16
16
|
- concept
|
|
17
17
|
- bundle-optimization
|
|
18
18
|
history:
|
|
19
|
+
- version: 9.2.1
|
|
20
|
+
date: 2026-08-09
|
|
21
|
+
changes: "`purge` 和 `minify` 现在可通过 `@intlayer/swc` 在 Next.js 上工作 — 无需 `babel.config.js`"
|
|
22
|
+
- version: 8.12.0
|
|
23
|
+
date: 2026-06-24
|
|
24
|
+
changes: "在参考表中按所需的流水线顺序列出 Babel 插件(extract → purge → minify → optimize)"
|
|
19
25
|
- version: 8.12.0
|
|
20
26
|
date: 2026-06-07
|
|
21
27
|
changes: "为 Babel/Webpack 引入了 `intlayerPurgeBabelPlugin` 和 `intlayerMinifyBabelPlugin`,明确了插件管线"
|
|
@@ -191,12 +197,14 @@ Intlayer 的构建优化被划分为若干个职责单一的插件。了解它
|
|
|
191
197
|
|
|
192
198
|
这些被直接运用在基于 Webpack 设置的 `babel.config.js` 当中(比如使用了 Babel 的 Next.js、CRA,或是自定义的 Webpack 等)。
|
|
193
199
|
|
|
200
|
+
下表按所需的流水线顺序列出它们(与它们必须在 `babel.config.js` 中出现的顺序相同):
|
|
201
|
+
|
|
194
202
|
| 插件 | 功能说明 |
|
|
195
203
|
| :---------------------------- | :--------------------------------------------------------------------------------------------------- |
|
|
196
204
|
| `intlayerExtractBabelPlugin` | 扫描 `.content.ts` 文件并把编译好的字典写入 `.intlayer/` |
|
|
197
|
-
| `intlayerOptimizeBabelPlugin` | 将 `useIntlayer('key')` 重写为 `useDictionary(hash)` 并注入匹配对应字典的 `import` 语句 |
|
|
198
205
|
| `intlayerPurgeBabelPlugin` | 扫描所有源代码文件,从已编译的 `.intlayer/**/*.json` 字典文件中删除**未被使用的内容字段** |
|
|
199
206
|
| `intlayerMinifyBabelPlugin` | **重命名内容字段的键(keys)** 为简短的字母别名(例如 `title` 变成 `a`),作用范围包括 JSON 与源代码 |
|
|
207
|
+
| `intlayerOptimizeBabelPlugin` | 将 `useIntlayer('key')` 重写为 `useDictionary(hash)` 并注入匹配对应字典的 `import` 语句 |
|
|
200
208
|
|
|
201
209
|
> **插件的执行顺序很重要。** 在你的 `babel.config.js` 里,purge 和 minify 的插件必须放置在 optimize 插件**之前**。优化步骤(optimize)会把 `useIntlayer('key')` 替换为模糊的 `useDictionary(hash)`,此举抹除了能够让 purge 和 minify 识别哪些字段被使用过的字典 key 信息。
|
|
202
210
|
|
|
@@ -205,9 +213,9 @@ Intlayer 的构建优化被划分为若干个职责单一的插件。了解它
|
|
|
205
213
|
| 选项助手 | 配套插件 |
|
|
206
214
|
| :--------------------------- | :---------------------------- |
|
|
207
215
|
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
208
|
-
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
209
216
|
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
210
217
|
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
218
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
211
219
|
|
|
212
220
|
### Vite 插件 (`vite-intlayer`)
|
|
213
221
|
|
|
@@ -220,6 +228,20 @@ Vite 用户**不需要直接对它们进行配置**。当你在 `vite.config.ts`
|
|
|
220
228
|
| Dictionary minify | 等同于 `intlayerMinifyBabelPlugin` 的 JSON 写入步骤 |
|
|
221
229
|
| Babel transform | 等同于 `intlayerMinifyBabelPlugin` 的代码重命名步骤 + `intlayerOptimizeBabelPlugin` |
|
|
222
230
|
|
|
231
|
+
### SWC 插件(`@intlayer/swc`)
|
|
232
|
+
|
|
233
|
+
Next.js 用户同样**从不直接配置这些**。自 **v9.2.1** 起,`next.config.ts` 中的 `withIntlayer()` 仅凭 `build.purge` 和 `build.minify` 两个标志就会运行完整流水线 —— 清除、压缩和导入重写。
|
|
234
|
+
|
|
235
|
+
工作被分成两部分,因为 SWC Wasm 插件一次只转换一个文件,且无法访问文件系统:
|
|
236
|
+
|
|
237
|
+
| 阶段 | 运行位置 | 作用 |
|
|
238
|
+
| :--------------------------------- | :----------------------------- | :----------------------------------------------------------- |
|
|
239
|
+
| 使用分析 + JSON 清除/压缩 | Node,位于 `withIntlayer()` 内 | 读取每个组件源文件,重写 `.intlayer/**/*.json`,生成重命名表 |
|
|
240
|
+
| 源码重写(`content.title` → `.a`) | `@intlayer/swc`(Wasm) | 将重命名表应用到你代码中对应的属性访问 |
|
|
241
|
+
| 导入重写(`useIntlayer` → dict) | `@intlayer/swc`(Wasm) | 与 `intlayerOptimizeBabelPlugin` 相同 |
|
|
242
|
+
|
|
243
|
+
判断_哪些_字段未被使用以及每个字段获得_什么_别名,需要跨文件状态和文件 I/O,因此这一半在 Node 中运行;SWC 插件只接收生成的表。
|
|
244
|
+
|
|
223
245
|
## 各平台配置指南
|
|
224
246
|
|
|
225
247
|
<Tabs>
|
|
@@ -227,10 +249,12 @@ Vite 用户**不需要直接对它们进行配置**。当你在 `vite.config.ts`
|
|
|
227
249
|
|
|
228
250
|
### Next.js
|
|
229
251
|
|
|
230
|
-
Next.js
|
|
252
|
+
Next.js 需要 `@intlayer/swc` 插件,因为 Next.js 使用 SWC 进行构建。自 **v9.2.1** 起,这一个包即可覆盖整条流水线 —— 优化(导入重写)、清除和压缩。
|
|
231
253
|
|
|
232
254
|
> 该插件并未默认安装,因为 SWC 插件在 Next.js 当中目前仍处于实验阶段。未来这部分有可能会发生改变。
|
|
233
255
|
|
|
256
|
+
> **Next.js 16.1.0 是最低版本。** 它是首个基于 SWC 向前兼容 Wasm 插件 ABI 构建的版本;更早的版本会拒绝该插件。`withIntlayer` 会读取你项目的 Next.js 版本,低于 16.1.0 时干脆不注册该插件 —— 这些构建仍会成功,只是在没有打包优化的情况下运行。
|
|
257
|
+
|
|
234
258
|
<Tabs>
|
|
235
259
|
<Tab value="npm">
|
|
236
260
|
|
|
@@ -265,33 +289,40 @@ intlayer-swc-plugin = "*"
|
|
|
265
289
|
|
|
266
290
|
安装完毕后,Intlayer 将会自动侦测并使用该插件。
|
|
267
291
|
|
|
268
|
-
|
|
292
|
+
**清除和压缩**阶段(字段移除与字段重命名)不需要额外的包,也不需要 `babel.config.js`。用 `withIntlayer` 包裹你的配置,并在 `intlayer.config.ts` 中开启相应标志:
|
|
269
293
|
|
|
270
|
-
```
|
|
271
|
-
|
|
294
|
+
```typescript fileName="next.config.ts"
|
|
295
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
296
|
+
import type { NextConfig } from "next";
|
|
297
|
+
|
|
298
|
+
const nextConfig: NextConfig = {/* 你的配置 */};
|
|
299
|
+
|
|
300
|
+
export default withIntlayer(nextConfig);
|
|
272
301
|
```
|
|
273
302
|
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
intlayerPurgeBabelPlugin,
|
|
277
|
-
intlayerMinifyBabelPlugin,
|
|
278
|
-
getPurgePluginOptions,
|
|
279
|
-
getMinifyPluginOptions,
|
|
280
|
-
} = require("@intlayer/babel");
|
|
303
|
+
```typescript fileName="intlayer.config.ts"
|
|
304
|
+
import type { IntlayerConfig } from "intlayer";
|
|
281
305
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
// Minify: 对 JSON 以及源代码里的内容字段的键(keys)进行重命名
|
|
288
|
-
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
289
|
-
// 注意: 在这里不需要使用 intlayerOptimizeBabelPlugin,因为
|
|
290
|
-
// @intlayer/swc 已经处理了 useIntlayer → useDictionary 的重写过程。
|
|
291
|
-
],
|
|
306
|
+
const config: IntlayerConfig = {
|
|
307
|
+
build: {
|
|
308
|
+
purge: true, // 从打包的 JSON 中移除未使用的内容字段
|
|
309
|
+
minify: true, // 将内容字段键重命名为简短别名
|
|
310
|
+
},
|
|
292
311
|
};
|
|
312
|
+
|
|
313
|
+
export default config;
|
|
293
314
|
```
|
|
294
315
|
|
|
316
|
+
在 `next build` 期间,`withIntlayer` 会分析你的源码、重写已编译的字典,并将生成的字段重命名表传给 `@intlayer/swc`,由它更新你代码中对应的属性访问。
|
|
317
|
+
|
|
318
|
+
> 请使用异步的 `withIntlayer`,而不是 `withIntlayerSync`。同步版本不会运行分析流水线,因此清除和压缩对它没有效果。
|
|
319
|
+
|
|
320
|
+
> 清除和压缩仅在 `next build` 时运行 —— 优化流水线在 `next dev` 期间是关闭的。
|
|
321
|
+
|
|
322
|
+
> 当配置了兼容适配器调用方时它们也会被禁用(`swcExtraCallers`,由 `@intlayer/next-intl`、`@intlayer/react-i18next` 等兼容包设置):这些调用点对使用分析器不可见,因此清除会移除代码仍在读取的字段。导入重写仍保持启用。
|
|
323
|
+
|
|
324
|
+
**更早的版本(9.2.1 之前)** 需要 `@intlayer/babel` 以及一个声明 `intlayerPurgeBabelPlugin` 和 `intlayerMinifyBabelPlugin` 的 `babel.config.js`。该文件不再需要,可以删除。
|
|
325
|
+
|
|
295
326
|
</Tab>
|
|
296
327
|
<Tab value="vite">
|
|
297
328
|
|
|
@@ -447,6 +478,8 @@ export default config;
|
|
|
447
478
|
|
|
448
479
|
> 如果在 `optimize` 被设为 `false`、又或是启用了可视化编辑器也就是当 `editor.enabled` 设定为了 `true` 时(由于编辑器需要保留字段名称以便做后续处理),重命名这个操作都将会被跳过。
|
|
449
480
|
|
|
481
|
+
> 在 Next.js 上,当 `@intlayer/swc` 未安装或无法加载时(Next.js 低于 16.1.0),压缩同样会被跳过。重写源码访问的正是这个插件,因此在没有它的情况下重命名字典,会让你的代码读取已不存在的字段名。
|
|
482
|
+
|
|
450
483
|
> 同理,如果是利用了 `importMode: 'fetch'` 来载入字段时此过程同样不适用。因为它们的内容会以原始命名由后端 API 所提供,对客户端内容随意重命名会破坏客户端与服务端的匹配契约。
|
|
451
484
|
|
|
452
485
|
### 字段清除 / Purging (去掉未被引用的字段内容)
|
|
@@ -475,7 +508,7 @@ export default config;
|
|
|
475
508
|
{ "title": "…", "subtitle": "…" }
|
|
476
509
|
```
|
|
477
510
|
|
|
478
|
-
> 与前边提到的类似,当 `optimize` 是 `false` 或是开启了可视化编辑器(`editor.enabled` 取值 `true`) 时,它会选择跳过对数据的清除操作。
|
|
511
|
+
> 与前边提到的类似,当 `optimize` 是 `false` 或是开启了可视化编辑器(`editor.enabled` 取值 `true`) 时,它会选择跳过对数据的清除操作。 在 Next.js 上,当 `@intlayer/swc` 不可用以及配置了兼容适配器调用方时,还会被额外跳过。
|
|
479
512
|
|
|
480
513
|
> 当检测到某份代码因为异常无法顺利解析、又或者当把由 `useIntlayer` 输出的值以静态解析器难以预测分析的模式在不同组件中来回丢(比如被打包成对象传入等而未被进行解构)的时候,它同样会跳过,以此保守地保留整部字典的全部信息,避免意外发生。
|
|
481
514
|
|