ts-intl
章節導覽:基準測試與效能

基準測試與效能

本基準測試參考了 paraglide-js benchmark 的測試架構,模擬現代多語言 Web 應用在首頁預先渲染並完成客戶端注水(Hydration)時,使用者端實際承載的全部國際化資源(HTML + 執行階段程式碼 + 語言包)的真實網路傳輸體積。

情境說明:在純靜態頁面(Zero-JS MPA)中,伺服端直接輸出翻譯好的 HTML,客戶端無需載入任何 i18n 程式碼;本測試針對的是具備客戶端注水、動態互動(如表單驗證、即時文案提示)與客戶端路由能力之現代全端應用,測量首頁達到可互動狀態所下載的靜態資源總開銷。

評估的程式庫與設定模式包含:

  • ts-intl(輕量執行階段):測試 default(全語言全量打包)與 locale-splitting(語言分塊隨需載入)兩種配置。
  • paraglide(編譯型方案):測試 default(編譯函式全語言打包)與 experimental-middleware-locale-splitting(路由中介軟體隨需拆包)兩種配置。
  • i18next(傳統執行階段):測試 default(全語言 JSON 打包)與 http-backend(客戶端非同步 fetch)兩種配置。

傳輸體積比較圖表

以下數據透過 Playwright 無頭 Chromium 造訪頁面,統計網路閒置(networkidle)前所有成功的 HTTP 靜態回應傳輸體積總和(Transfer Size):

首頁網路傳輸大小 (KB)

Playwright Headless Chromium · Real HTTP Transfer Size

paraglide中介軟體分割
-91%36.3 KB
ts-intl隨需分割
-86%57.8 KB
paraglide預設全量
-82%76.6 KB
i18nextHTTP 動態載入
-55%188.7 KB
ts-intl預設全量
-14%360.0 KB
i18next預設全量
Baseline420.4 KB

基準測試數據矩陣

測試基準負載:首頁渲染 100 條文案(20% 包含動態變數插值)。

情境一:規模化應用(10 種語言 · 命名空間共 500 詞條)

在此情境中,詞典總共包含 500 條詞條,頁面實際引用並渲染其中 100 條:

程式庫與打包模式 首頁傳輸體積 對比 i18next 預設 機制特點
paraglide (中介軟體拆包) 36.3 KB -91.4% 編譯為獨立 JS 函式,Tree-shaking 剔除未引用詞條,隨需分發
ts-intl (隨需拆包) 57.8 KB -86.2% 核心執行階段約 2 KB,僅載入目前語言 500 條詞條 JSON
paraglide (預設全量) 76.6 KB -81.8% Tree-shaking 剔除未引用詞條,但合併打包 10 種語言編譯產物
i18next (HTTP 動態載入) 188.7 KB -55.1% 客戶端非同步請求目前語言 JSON,附帶完整基礎執行時期
ts-intl (預設全量) 360.0 KB -14.4% 合併打包 10 種語言全部 500 條詞條 JSON
i18next (預設全量) 420.4 KB 基準線 (Baseline) 合併打包 10 種語言全部 500 條詞條 JSON 與完整執行時期程式庫

情境二:輕量入門(5 種語言 · 命名空間共 100 詞條)

在此情境中,詞典共包含 100 條詞條,頁面渲染全部 100 條:

程式庫與打包模式 首頁傳輸體積 對比 i18next 預設 機制特點
ts-intl (隨需拆包) 29.7 KB -83.8% 核心執行階段約 2 KB,僅載入目前語言 100 條詞條 JSON
paraglide (中介軟體拆包) 36.1 KB -80.3% 僅分發目前語言 100 條詞條編譯函式
paraglide (預設全量) 47.1 KB -74.3% 合併打包 5 種語言 100 條詞條編譯函式
ts-intl (預設全量) 56.9 KB -69.0% 合併打包 5 種語言 100 條詞條 JSON
i18next (HTTP 動態載入) 167.5 KB -8.6% 客戶端非同步請求目前語言 JSON,附帶完整基礎執行時期
i18next (預設全量) 183.3 KB 基準線 (Baseline) 合併打包 5 種語言 100 條詞條 JSON 與完整執行時期程式庫

技術架構與體積構成分析

1. 編譯型方案的 Tree-shaking 優勢與權衡

  • 優勢:paraglide 將每條翻譯訊息編譯為單獨匯出的 JavaScript 函式。在打包時,打包工具(如 Rollup / esbuild)能夠識別程式碼中未引用的函式並予以清除(Tree-shaking)。在情境一中,500 條詞條中未使用的 400 條未被打包進產出物,因此體積最小(36.3 KB)。
  • 權衡:需要專屬的建置步驟(編譯生成 TS/JS 原始碼),不支援動態遠端熱更新字典檔案。

2. 輕量執行階段方案的隨需拆包優勢

  • 無需程式碼生成:ts-intl 是純 TypeScript 執行時期程式庫,無需程式碼生成步驟,直接使用標準 TypeScript 物件或 JSON 檔案。
  • 語言數量線性無關:在 locale-splitting 模式下,利用打包工具的動態匯入(Dynamic import())特性,不同語言的詞典被自動分塊。客戶端僅下載目前啟用的語言分塊,因此當專案支援的語言數量由 5 種增加至 10+ 種時,單頁首頁網路傳輸體積基本保持恆定(約 30 KB ~ 57 KB)。
  • 零外部執行階段相依:ts-intl 核心執行階段壓縮後僅約 2 KB,底層直接利用瀏覽器標準的 Web Intl API 處理複數與數字日期格式,避免攜帶大型解析引擎。

3. 傳統執行時期的體積膨脹成因

  • i18next 自身包含豐富的配置系統、事件發送器、AST 解析器及自訂格式化工具,基礎執行程式庫體積較大。
  • 在常規配置下,開發者常透過靜態 import 將各語言資源整體匯入主進入點,導致所有語言詞典無論是否使用均被打包到客戶端主 chunk 中。

本地重現基準測試

基準測試套件原始碼位於 apps/benchmark。可透過以下步驟在本地執行重現:

# 1. 安裝測試所需的 Chromium(僅首次執行)
pnpm --filter @aaakul/ts-intl-benchmark prebench

# 2. 執行完整基準測試矩陣(自動完成 SSG 建置並透過 Playwright 取樣)
pnpm --filter @aaakul/ts-intl-benchmark bench

# 3. 啟動本機預覽伺服器(可在 http://localhost:3005 造訪視覺化結果)
pnpm --filter @aaakul/ts-intl-benchmark preview