Le site public charge l'intégralité du corpus une seconde après l'ouverture de la page (loadAllHeatPoints), pour la heatmap et la recherche. Rien ne compressait dans la chaîne — ni Fastify, ni Traefik. Ce n'était donc pas un risque théorique mais la facture de chaque visiteur, à chaque visite. Mesuré sur 100 000 groupes avec des données réalistes, en-tête Accept-Encoding d'un vrai navigateur : 21,5 Mo deviennent 1,9 Mo. gzip est préféré à brotli, contre l'intuition : br sort 2,3 Mo là où gzip fait 1,9 Mo. La qualité brotli par défaut est réglée pour la vitesse, et sur ce JSON très répétitif elle perd sur les deux tableaux à la fois — taille ET CPU. Seuil à 1 Ko, en dessous duquel compresser coûte plus que ça ne rapporte. /api/clusters plafonnait par ailleurs sa réponse à 2000 groupes ou 1000 clusters sans le dire, ni côté API ni côté client : dans une zone dense, des groupes disparaissaient de la carte sans aucun signal. La réponse porte désormais `truncated` et `limit`, et l'interface affiche un avertissement invitant à zoomer. Clé de traduction ajoutée dans les 21 langues, la convention du fichier étant une couverture complète. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
20 lines
445 B
JSON
20 lines
445 B
JSON
{
|
|
"name": "bm-api",
|
|
"version": "0.0.1",
|
|
"type": "module",
|
|
"main": "src/server.js",
|
|
"scripts": {
|
|
"dev": "node src/server.js",
|
|
"start": "node src/server.js"
|
|
},
|
|
"dependencies": {
|
|
"@fastify/compress": "^7.0.3",
|
|
"@fastify/cookie": "^9.4.0",
|
|
"@fastify/helmet": "^11.1.1",
|
|
"@fastify/rate-limit": "^9.0.0",
|
|
"bcryptjs": "^2.4.3",
|
|
"fastify": "^4.28.1",
|
|
"jsonwebtoken": "^9.0.2",
|
|
"pg": "^8.12.0"
|
|
}
|
|
}
|