Đặt câu hỏi và nhận tóm tắt tài liệu bằng cách tham chiếu trang này và nhà cung cấp AI bạn chọn
Nội dung của trang này đã được dịch bằng AI.
Xem phiên bản mới nhất của nội dung gốc bằng tiếng AnhNếu bạn có ý tưởng để cải thiện tài liệu này, vui lòng đóng góp bằng cách gửi pull request trên GitHub.
Liên kết GitHub tới tài liệuSao chép Markdown của tài liệu vào bộ nhớ tạm
vue-i18n VS @intlayer/vue-i18n | API Giống Nhau, Bundle Khác
@intlayer/vue-i18n là một compat adapter: nó expose API của vue-i18n (createI18n, useI18n, t(), d(), n(), $t, v-t, i18n.global.locale...) và phục vụ nó từ các dictionaries được biên dịch bởi Intlayer. Các file .vue của bạn không thay đổi. Cái mà t("footer.github") được bind tới thì có.
Bài viết này đo lường việc thay thế đó trên cùng một ứng dụng Vite + Vue 3, được xây dựng một lần với vue-i18n và một lần với adapter. Các con số đến từ Benchmark Bloom. Để so sánh vue-i18n và Intlayer như các thư viện, hãy đọc vue-i18n vs Intlayer và benchmark vue-i18n vs Intlayer. Bài này nói về những gì adapter thay đổi khi bạn giữ các component của mình như cũ.
tl;dr: Trên cùng một ứng dụng Vite + Vue 3, thay thếvue-i18nbằng@intlayer/vue-i18nđã giảm JavaScript trên mỗi trang từ 134.9 KB xuống 47.0 KB gzip (ứng dụng không có i18n nặng 41.3 KB), runtime từ 24.3 KB xuống 7.9 KB, thành phần trung bình từ 196 KB xuống 8.4 KB, và rò rỉ chuỗi trang nước ngoài từ 90% xuống 0%, mà không chỉnh sửa bất kỳ tệp.vuenào.createI18n({ messages })tiếp tục hoạt động như một fallback; xóa các import JSON để có được những con số trên. Các khối SFC<i18n>vàsetLocaleMessage()runtime là hai tính năng không được chuyển đổi qua.
@intlayer/vue-i18n là gì
vue-i18n là một runtime. createI18n({ messages: { en, fr, ... } }) xây dựng một instance toàn cục chứa mọi message của mọi locale; useI18n() liên kết mỗi component với nó; t("footer.github") duyệt cây tại thời điểm render. Thiết kế đó là điều làm cho các khối SFC <i18n> và setLocaleMessage() trở nên có thể, và nó cũng là lý do tại sao đồ thị phụ thuộc của mọi component đều bao gồm toàn bộ cây.
@intlayer/vue-i18n giữ lại API và thay thế cây:
- Import aliasing.
vueI18nVitePlugin()từ@intlayer/vue-i18n/pluginbao bọcvite-intlayervà thêm mộtresolve.aliasđểvue-i18nđược phân giải thành@intlayer/vue-i18n. Không có import nào được đổi tên. - JSON as source of truth. Plugin
syncJSONđọc filelocales/{locale}.jsoncủa bạn vớiformat: "vue-i18n"(vì vậy interpolation{name},{0}list và plurals pipe"car | cars"được phân tích chính xác) và ghi lại các bản dịch khi CLI hoặc CMS cập nhật chúng. - Call-site binding. Bước tối ưu hóa Intlayer viết lại các call site
useI18n()để component nhận các dictionaries từ các key của nó, trong locale đang hoạt động, dưới dạng import mà bundler có thể truy vết và tách.
Sao chép mã vào clipboard
Sao chép mã vào clipboard
Thành phần không còn truy cập toàn bộ cây thông báo toàn cục. Nó chỉ truy cập footer. Đó là lý do tại sao cột kích thước thành phần dưới đây giảm từ 196 KB xuống 8 KB.
Những gì adapter giữ lại, bỏ qua và không thay thế
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
vue-i18n API | Với @intlayer/vue-i18n |
|---|---|
useI18n() → { t, d, n, te, tm, rt, locale, availableLocales } | ✅ Được giữ lại. t keys được gõ theo các từ điển của bạn |
t("key", { name }), t("key", [a, b]), t("key", count) | ✅ Được giữ lại. {name}, {0} và plurals phân tách bằng dấu gạch chéo được phân giải như trước |
d(date, "long"), n(value, "currency") | ✅ Được giữ lại. datetimeFormats / numberFormats từ createI18n() được sử dụng, được hỗ trợ bởi Intl gốc |
i18n.global.locale.value = "fr" | ✅ Được giữ lại. Một WritableComputedRef được hỗ trợ bởi client của Intlayer; phản ứng hoạt động như trước |
$t, $tc, $te, $tm, $rt, $d, $n, $i18n (Options API) | ✅ Được giữ lại. Được đăng ký trên app.config.globalProperties bởi app.use(i18n) |
v-t directive | ✅ Được giữ lại |
legacy: true | ✅ Được chấp nhận |
createI18n({ messages }) | ⚠️ messages được sử dụng như một fallback runtime với cảnh báo dev. Xóa các import JSON để giảm bundle |
setLocaleMessage(), mergeLocaleMessage() | ❌ Cảnh báo và không làm gì. Runtime message loading được thay thế bằng build-time dictionaries |
SFC <i18n> custom blocks | ❌ Không được đọc. Di chuyển các messages đó vào locale JSON (hoặc một .content.ts bên cạnh component) |
@nuxtjs/i18n | ⚠️ Adapter riêng biệt, xem tài liệu tương thích Nuxt |
Bài kiểm tra
Những gì đã được đo lường
Benchmark Bloom suite xây dựng cùng một ứng dụng Vite + Vue 3 với mỗi setup: 10 trang (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), 10 locales (en, fr, es, de, it, pt, zh, ja, ko, ru), các components và nội dung giống hệt nhau. Các trang được đo lường trong en và fr.
Cả hai đều được xây dựng trong cấu hình tĩnh, cấu hình mà hầu hết các dự án Vue sử dụng: đối với vue-i18n, mỗi locale JSON được import và truyền vào createI18n({ messages }); đối với adapter, các components giống nhau với vite.config.ts và intlayer.config.ts được thay đổi và import messages được loại bỏ. vue-intlayer native được bao gồm để tham khảo.
Đối với mỗi build, suite ghi lại:
- Kích thước thư viện: kích thước gzip (và minified) của một component rỗng chỉ import thư viện i18n.
- Page JS: gzip JavaScript được tải xuống trên mỗi trang, được lấy trung bình trên tất cả các trang và locale.
- Locale leak %: phần chia của các chuỗi được dịch trong JS được tải xuống thuộc về một locale mà người dùng không xem.
- Page leak %: phần chia của các chuỗi được dịch trong JS được tải xuống thuộc về một trang mà người dùng không ở trên.
- Component avg: kích thước gzip trung bình của mỗi component được biên dịch riêng lẻ.
- E2E reactivity: thời gian treo tường giữa lúc chọn một locale mới và
html[lang]cập nhật trong DOM (Playwright, 5 lần lặp). - Page load:
PerformanceNavigationTiming.duration.
Các con số dưới đây được lấy từ lần chạy ngày 2026-09-12 vớivue-i18n11.4.0 và@intlayer/vue-i18n9.5.1. Ứng dụng kiểm tra được thiết kế cố ý nhỏ (một vài chục chuỗi mỗi locale), do đó tỷ lệ phần trăm rò rỉ mô tả một mẫu: chúng tăng lên khi nội dung của bạn tăng lên trong khi chi phí runtime vẫn cố định.
Kết quả trên Vite + Vue 3
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
| Setup | Strategy | Lib size (gz) | Lib size (min) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E reactivity | Page load |
|---|---|---|---|---|---|---|---|---|---|
| base (no i18n) | - | 0.0 KB | 0.0 KB | 41.3 KB | 0.0% | - | 1.1 KB | 1.8 ms | 10.8 ms |
vue-i18n | static | 24.3 KB | 83.2 KB | 134.9 KB | 50.0% | 90.0% | 196.0 KB | 2.8 ms | 13.6 ms |
@intlayer/vue-i18n | static | 7.9 KB | 23.2 KB | 47.0 KB | 15.0% | 0.0% | 8.4 KB | 1.5 ms | 9.3 ms |
vue-intlayer (native) | static | 3.9 KB | 11.1 KB | 57.1 KB | 56.8% | 0.0% | 7.7 KB | 4.5 ms | 13.8 ms |
vue-intlayer (native) | dynamic | 3.9 KB | 11.1 KB | 59.8 KB | 50.0% | 0.0% | 6.5 KB | 4.0 ms | 15.8 ms |
Cột page-leak của ứng dụng cơ sở được để trống: không có thư viện i18n, quá trình fingerprinting nhặt các chuỗi hard-coded trong các chunk được chia sẻ và con số không có ý nghĩa.
Cách đọc nó
- 88 KB ít hơn trên mỗi trang, cùng các component.
vue-i18nđưa ứng dụng 41.3 KB lên 134.9 KB. Bản build adapter của cùng các component đạt 47.0 KB, vượt quá ứng dụng cơ sở 5.7 KB. Phần lớn sự khác biệt là 74.9 KB củasrc/localesmàcreateI18n({ messages })kéo vào từng trang và adapter không bao giờ bundle như một khối. - Runtime thu nhỏ 3x. Một component trống chỉ import
vue-i18ntốn 24.3 KB gzip / 83.2 KB minified:@intlify/core-base, message compiler và runtime. Adapter tốn 7.9 KB / 23.2 KB, phần lớn là Intlayer's core cộng vớivue-i18nAPI surface. - Components: nhỏ gọn 23x. Một component
useI18n()được compile riêng lẻ trung bình 196 KB, vìtđược bind với instance mà giữ mọi message của mọi locale. Với adapter, component tương tự trung bình 8.4 KB: nó chỉ load dictionary riêng của nó. - Rò rỉ.
vue-i18ngửi mỗi locale và chuỗi của mỗi trang trên mỗi trang: rò rỉ locale 50% (trên hai locale được fingerprint; với mười locale được bundled, lãng phí thực tế cao hơn), rò rỉ trang 90%. Adapter giảm rò rỉ trang xuống 0% vì mỗi component chỉ import các dictionaries của nó. Rò rỉ locale là 15% trong lần chạystaticnày;importMode: 'dynamic'là cài đặt loại bỏ nó, và cấu hình đó không phải là một phần của lần chạy Vue này. - Reactivity và page load. Chuyển đổi locale rẻ tiền cho cả hai (1.5-2.8 ms); hệ thống reactivity của Vue làm cho nó diễn ra một khi các message đã ở trong bộ nhớ. Page load giảm từ 13.6 ms xuống 9.3 ms, phù hợp với 88 KB JavaScript ít hơn để phân tích.
- Về các hàng gốc.
vue-intlayertrong lần chạy này đã đóng gói mọi locale ở chế độstaticvà đạt 57.1 KB với runtime 3.9 KB; các từ điển đồng bộ của adapter mang ít chuỗi locale ngoài hơn, do đó con số trên mỗi trang thấp hơn. Runtime gốc vẫn là nhẹ nhất trong ba cái, và mô hình.content.tscủa nó là nơi các khối<i18n>SFC tìm thấy tương đương của chúng.
Tại sao các số liệu thay đổi
Không có gì thay đổi trong src/components/, vì vậy những lợi ích đến từ những gì useI18n được ràng buộc với.
Với vue-i18n, binding là global instance. createI18n({ messages: { en, fr, ... } }) là một import chứa toàn bộ; mọi component gọi useI18n() đều có thể truy cập tất cả nó, vì vậy bundler không thể split dưới instance. Tối ưu hóa có nghĩa là bạn phải split en.json theo route, gọi setLocaleMessage() trong router guard, và giữ route-to-file map chính xác khi components di chuyển.
Sao chép mã vào clipboard
Với @intlayer/vue-i18n, binding là dictionary. syncJSON biến mỗi key cấp cao nhất của en.json thành một dictionary; bước optimize chuyển cho component những cái mà các key của nó đặt tên, như imports mà bundler theo dõi và chia tách per page.
Sao chép mã vào clipboard
Import messages trong i18n.ts là dòng duy nhất cần xóa. Đó là 88 KB.
Migration trong ba bước
Cài đặt
bashSao chép mãSao chép mã vào clipboard
Lệnh phát hiện
vue-i18n, cài đặtintlayer,vue-intlayer,@intlayer/vue-i18nvà@intlayer/sync-json-plugin, và điền sẵnintlayer.config.ts. Giữvue-i18nđược cài đặt: nó là một peer dependency và cung cấp các types.Trỏ Intlayer tới các tệp locale của bạn
intlayer.config.tsSao chép mãSao chép mã vào clipboard
locales/{locale}.jsonvẫn ở vị trí của nó. Mỗi khóa cấp cao nhất (footer,hero...) trở thành một dictionary.Thêm plugin và xóa import messages
vite.config.tsSao chép mãSao chép mã vào clipboard
src/i18n.tsSao chép mãSao chép mã vào clipboard
vueI18nVitePlugin()bao bọcvite-intlayer(theo dõi nội dung, biên dịch từ điển, bước tối ưu hóa) và tạo aliasvue-i18nthành adapter. Xóa importmessageslà cách loại bỏ 88 KB; giữ lại nó giữ cho ứng dụng hoạt động nhưng ship cả hai.
Những gì bạn có thể xóa sau đó
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
| File / pattern | Lý do |
|---|---|
import en from "./locales/en.json" và những cái khác tương tự | Chỉ được sử dụng làm fallback bởi adapter. Đây là nơi 88 KB đến từ |
setLocaleMessage() trong router guards | Không hoạt động. Quá trình loading per-route giờ đây là công việc của compiler |
@intlify/unplugin-vue-i18n | Không cần thiết: nó precompiles messages và SFC blocks mà adapter không đọc |
SFC <i18n> blocks | Không được đọc; di chuyển chúng sang locale JSON hoặc một .content.ts cho mỗi component |
Những gì bạn nhận được ngoài việc tiết kiệm bytes
- Typed keys.
t("footer.github")được gõ so với compiledfooterdictionary; một đường dẫn sai là lỗi TypeScript thay vì key được render dưới dạng text. npx intlayer testlàm cho CI thất bại nếu thiếu key trong bất kỳ locale nào.npx intlayer filldịch các key bị thiếu bằng provider key của bạn (OpenAI, Anthropic, Mistral, Gemini...) và ghi lại chúng vàolocales/{locale}.json.- Visual Editor và CMS hoạt động trên cùng JSON, vì vậy những người không phải developer có thể chỉnh sửa thông qua UI và các file sẽ được cập nhật.
- Di chuyển tăng dần đến
.content.ts. Bất kỳ component nào cũng có thể chuyển từuseI18n()sanguseIntlayer("footer")với một file content cùng vị trí. Các từ điển JSON và.content.tstồn tại cùng nhau và hợp nhất.
Những giới hạn cần biết trước khi bắt đầu
- Các khối SFC
<i18n>không được đọc. Nếu các tin nhắn của bạn nằm bên trong các component, chúng cần được di chuyển đến các file locale (hoặc đến.content.ts, đó là ý tưởng tương tự nhưng có kiểu dữ liệu). - Tải tin nhắn trong thời gian chạy không còn nữa.
setLocaleMessage()vàmergeLocaleMessage()cảnh báo và trả về. Các bản dịch được tìm nạp từ CMS trong thời gian chạy cần Intlayer's CMS hoặc các lệnhintlayer pull/push. messageslà một fallback, không miễn phí. Giữ lại các import JSON trongcreateI18n()sẽ giữ 75 KB trong bundle. Xóa chúng khiintlayer testvượt qua.- Adapter không phải là runtime gốc. 7.9 KB so với 3.9 KB cho
vue-intlayer. Khi mọi component đã chuyển sanguseIntlayer, hãy loại bỏ nó.
Khi nào sử dụng cái nào?
- Ở lại trên
vue-i18nnếu ứng dụng của bạn phụ thuộc vào các khối SFC<i18n>, vào các luồngsetLocaleMessage()runtime, hoặc nếu 90 KB cho mỗi trang không phải là mối quan tâm cho khán giả của bạn. - Sử dụng
@intlayer/vue-i18nnếu bạn đang dùngvue-i18nvà muốn giảm 88 KB, các component nhỏ hơn 23 lần, 0% page leakage, các key được gõ và kiểm tra CI mà không cần chỉnh sửa tệp.vue. Đây là điểm vào cho một codebasevue-i18nhiện có. - Đi native (
vue-intlayer) cho các dự án mới, hoặc khi adapter đã hoàn thành công việc của nó. Nó có runtime nhẹ nhất (3.9 KB) và mô hình.content.tscho từng component thay thế các khối<i18n>bằng nội dung được gõ.
Những so sánh liên quan
- vue-i18n vs Intlayer (tính năng và DX)
- vue-i18n vs Intlayer benchmark (các thư viện, cùng benchmark)
- next-intl vs @intlayer/next-intl (cùng chuỗi adapter)
- i18next vs @intlayer/i18next (cùng chuỗi adapter)
- Lingui vs @intlayer/lingui (cùng chuỗi adapter)
- Hướng dẫn di chuyển: vue-i18n to Intlayer
- Tài liệu tham khảo bộ chuyển đổi tương thích: vue-i18n, Nuxt i18n
Kết luận
@intlayer/vue-i18n thay đổi những gì useI18n() được liên kết đến: từ một instance toàn cục chứa mọi thông báo của mọi locale đến một dictionary được biên dịch cho component đó. Trên cùng một ứng dụng Vite + Vue 3 mà nhỏ hơn 88 KB trên mỗi trang, một runtime nhỏ hơn 3 lần, các component nhỏ hơn 23 lần và 0% page leakage, cho một tệp cấu hình, một dòng plugin và một import bị xóa. Các khối <i18n> SFC và tải thông báo runtime là hai điều mà nó không hỗ trợ, và runtime vue-intlayer native vẫn còn nhỏ hơn một nửa.
Tất cả dữ liệu thô, các ứng dụng thử nghiệm và các script đều có trong kho lưu trữ Benchmark Bloom. Chạy nó bằng chính bạn.
Tham khảo tài liệu 'Why Intlayer?' để biết thêm chi tiết.
Bình luận
Chưa có bình luận nào. Hãy là người đầu tiên chia sẻ suy nghĩ của bạn.
