Imaginile încărcate din panou nu sunt optimizate deloc
Fișierele din frontend/public trec acum prin tools/image-optimizer: nimic peste
300 KB, latura lungă plafonată, un frate .webp lângă fiecare (#7 (closed)). Imaginile
încărcate din panoul de admin nu trec prin nimic — se scriu pe disc exact cum vin și
se servesc așa. Efectul practic: cea mai importantă imagine a magazinului, banner-ul
de pe prima pagină, este chiar un astfel de fișier și rămâne singurul loc unde un
vizitator poate primi o poză necomprimată. Un admin care încarcă mâine o fotografie
de 6 MB direct din telefon o pune pe prima pagină și nimic nu-l oprește.
Ce am găsit
Nimic nu redimensionează și nimic nu converteşte
backend/src/lib/uploads.ts:24-45: multer.diskStorage scrie fișierul cu un nume
randomUUID() și extensia dedusă din MIME. Nu există niciun pas de procesare —
sharp nu e nici măcar în dependențele backend-ului. ALLOWED_TYPES
(liniile 14-20) acceptă image/jpeg, image/png, image/webp, image/avif,
image/gif; ce intră, aia iese.
Fișierele de azi sunt în regulă, dar din întâmplare
Cele șase imagini de banner de pe producție, verificate direct:
270.123 b3856771-6b1b-43f4-86bf-376c2375b91a.jpg
249.675 92af077c-ce4c-46f8-b17d-807596f14312.jpg
184.236 785e400c-8f7e-4ee0-9376-67c70b012322.jpg
158.584 75456663-5b36-455a-b8da-da024d7af431.jpg
143.630 a841aa4c-33df-42de-86c5-48c49ea0d182.jpg
138.389 6def087a-381f-4f48-9518-78aab0658870.jpg
Toate image/jpeg, niciuna WebP, în total 1,14 MB. Sunt sub pragul de 300 KB pentru
că cine le-a pus le-a pregătit înainte, nu pentru că sistemul cere asta.
<picture> nu le poate ajuta
frontend/src/components/Picture.tsx oferă un frate .webp doar pentru căi locale,
și corect: un /uploads/… nu are frate, iar un <source> acceptat și negăsit
înseamnă imagine ruptă, nu una mai lentă. Atâta timp cât conversia se face doar la
build, imaginile din panou rămân în afara ei prin construcție. Singurul loc unde pot
fi convertite este momentul încărcării.
De făcut
-
Adaugă sharpîn backend și procesează fișierul în ruta de upload (backend/src/routes/admin/uploads.ts): plafonează latura lungă la 1600 px, re-encodează la aceleași praguri ca unealta de build (calitate coborâtă până sub 300 KB) și scrie și varianta.webpcu același nume. -
Fă Picturesă ofere fratele.webpși pentru/uploads/…, dar numai după ce scrierea perechii e garantată pentru orice fișier nou. -
Convertește o singură dată fișierele deja încărcate, cu un script pe modelul celor din backend/prisma/— idempotent, fără să atingă ce e deja în regulă. -
Limita de mărime la upload rămâne la #25 (closed); punctul ăsta e despre ce se întâmplă cu fișierul DUPĂ ce e acceptat.
Criteriu de acceptare
- Un fișier de 6 MB încărcat din panou ajunge pe disc sub 300 KB, cu latura lungă
cel mult 1600 px, și are perechea
.webpalături. - Toate imaginile
/uploads/existente pe producție au pereche.webpși sunt sub 300 KB. - Pe prima pagină, imaginea de banner e servită ca
image/webpunui browser modern.