Pachetul de intrare duce toate cele trei limbi la fiecare încărcare
Fiecare vizitator descarcă și interpretează traducerile pentru toate cele trei limbi, deși vede una singură. Desprins din #21 (closed), unde a rămas nebifat: separarea lor nu e o simplă mutare de fișiere, ci schimbă ce se întâmplă înaintea primei vopsiri, deci merită judecată singură.
Ce am găsit
Pachetul de intrare, build de producție (frontend/dist/assets/index-*.js): 439.520 de octeți necomprimat, 139.300 cu gzip.
frontend/src/i18n.ts:4-6 importă static toate trei fișierele de traducere:
import en from './locales/en/common.json';
import ro from './locales/ro/common.json';
import ru from './locales/ru/common.json';
și le înregistrează pe toate în resources, de două ori: o dată pentru instanța magazinului (:39-43) și o dată pentru instanța separată a panoului (:82-86). Împreună, en 43.709 + ro 82.686 + ru 68.488 = 194.883 de octeți de JSON, din care aproximativ două treimi nu se folosesc niciodată la vizita respectivă.
Contează mai puțin ca trafic și mai mult ca timp de procesare: pe un telefon mediu, interpretarea a 439 KB de JavaScript ține firul principal ocupat înainte să se poată afișa ceva.
De ce nu a intrat în #21 (closed)
Un import dinamic per limbă mută traducerile în chunk-uri proprii, dar chunk-ul limbii curente se descoperă abia după ce rulează pachetul de intrare — adică un drum dus-întors în plus exact înaintea primei vopsiri, plătit de toți vizitatorii. Asta ar înrăutăți fix metrica pe care #21 (closed) o repară.
Ca să iasă în câștig, drumul acela trebuie anticipat: randarea din backend/src/services/render-page.ts știe limba din adresă (scrie deja <link rel="preload"> pentru imaginea bannerului, tot de acolo) și poate emite modulepreload pentru chunk-ul limbii respective. Pentru asta îi trebuie numele cu amprentă al fișierului, adică manifestul build-ului frontend, citit prin același mecanism cu care ia deja shell-ul și șirurile SEO (backend/src/services/app-shell.ts).
De făcut
-
Încarcă doar limba activă în instanța magazinului; fallbackLngsă rămână o limbă efectiv prezentă -
Instanța panoului are nevoie doar de ro(enșirunici nu au cheiaadmin) -
Emite modulepreloadpentru chunk-ul limbii paginii din randarea de pe server, ca să nu apară un drum nou înaintea primei vopsiri -
Verifică toate trei limbile în browser: comutarea limbii, o reîncărcare pe fiecare, și panoul
Criteriu de acceptare
Cel mai mare fișier din frontend/dist/assets sub 300 KB necomprimat; FCP-ul pe mobil măsurat pe producție nu e mai mare decât înainte de schimbare; magazinul și panoul arată la fel în toate trei limbile.