10
105
Fork
You've already forked web
30

Choix techniques #336

Open
opened 2024年06月14日 11:48:04 +02:00 by laem · 4 comments
Owner
Copy link

Pas d'app mobile ?

Non, trop couteux en temps de dev & de gestion des stores. Beaucoup trop couteux. Or, le Web est puissant.

Voir ce ticket dédié à la question de l'app mobile.

SPA vs MPA / RSC vs 'use client'

Le projet est codé en NextJs.

À la base, futur.eco était en React + webpack basique. Mon seul besoin était de générer des meta pour les partages de lien. J'ai donc commencé un serveur en expressjs pour pré-rendre des meta à envoyer dans la page HTML. C'était pas trivial mais pas trop compliqué non plus, mais je me suis rendu compte que j'étais en train de réimplémenter Next :D.

Aujourd'hui, après 12 ans de travail sur des applis Web diverses, je fait un constat simple : les promesses de gain de SEO et de performance vendues par les défenseurs des MPA par rapport aux SPA ne sont pas vérifiées dans les faits.

Sur futur.eco comme sur nosgestesclimat.fr, la migration vers Next depuis un React sans serveur + l'option de prerender.io de base de Netlify *n'a pas donné d'augmentation de SEO à horizon que ce soit au bout d'une semaine, d'1 mois, de 6 mois, d'1 an ou d'un an. À l'inverse sur futur.eco, l'ajout d'un nouveau calculateur qui ciblait des mots clefs "coût d'un trajet en voiture" en plus de "calcul de CO2 ferry avion etc" a résulté en une explosion de SEO. De même, le trafic n'a pas non plus explosé sur ces deux produits.

Certains développeurs ont donc tendance à surestimer énormément le gain produit d'une MPA, et à sous-estimer les complexités de la gestion du combo server client et toutes ses réhydratations finalement pas si magiques.

Et si ça peut vous rassurer, si je devais lancer un nouveau blog interaction utilisateur, évidemment que je ferais du prérendu côté serveur ;) À chaque besoin sa techno.

Cela dit, ça n'empêche pas de vouloir augmenter la part de RSC dans l'architecture de Cartes. Mais ce n'est pas la priorité, loin de là ! Pour le SEO, avant tout ça, il faut des liens entrants, des partenariats, des intégrations en iframe, des pages de contenu, une page à propos, un blog plus fourni, de meilleurs meta de partage, de la génération côté serveur des fiches lieux, des dizaines d'autres contenus à inventer, et tout ça ne nécessite aucunement du RSC plutôt qu'un simple rendu côté serveur.

Ajoutons que d'autres frameworks sont très intéressants en 2024 : Deno Fresh, Hono jsx, etc. Mais pour Cartes, à ce stade, Next fait le boulot sans problème et avec beaucoup d'avantages :)

CSS

La gestion du CSS par Next app router n'est pas super. Je suis très attaché à styled-components, car c'est un framework CSS très proche du standard CSS, qui permet à la fois d'extraire des composants réutilisables, et de balancer du CSS personnalisé pour des composants uniques (très fréquents) via la balise css. Mais styled-components oblige à créer des îlots de use client même dans le layout haut niveau des pages, car React RSC ne supporte pas le context... Notons alors la librairie next-yak qui semble super prometteuse pour ça ! https://github.com/jantimon/next-yak/issues/77#event-12982863836.

MAJ : on est passés à Next-yak depuis longtemps et c'est génial. On écrit notre CSS qui marche en RSC comme en client, sans contrainte majeure.

Design

Sur cet ticket en réponse j'expose une partie de nos choix "radicaux" sur le design.

Typescript ou JS ?

Je suis largement favorable à Typescript, mais pas encore convaincu de l'intérêt de tout typer, notamment l'UI, en l'absence d'une équipe nombreuse de développeurs ni d'enjeux de prod graves. Surtout, dans la perspective actuelle d'expérimentations à tout va. Je suis plus un utilisateur opportuniste de typescript : mon usage principal aujourd'hui est d'améliorer les suggestions automatiques de l'environnement de dev. On est très très loin d'avoir une app qui compilerait avec l'option stricte typescript et ce n'est pas le but d'y arriver à moyen-terme. Mais plus de couverture des types, notamment au fur et à mesure de la convergence des fonctionnalités (par exemple, la gestion des images Wikimedia, Wikipedia, Wikidata, Panoramax dont certains bouts de codes sont actuellement séparés, bazar vs cathédrale), ça oui !

## Pas d'app mobile ? Non, trop couteux en temps de dev & de gestion des stores. *Beaucoup* trop couteux. Or, le Web est puissant. Voir [ce ticket dédié à la question de l'app mobile](https://github.com/laem/cartes/issues/606). ## SPA vs MPA / RSC vs 'use client' Le projet est codé en NextJs. À la base, futur.eco était en React + webpack basique. Mon seul besoin était de générer des meta pour les partages de lien. J'ai donc commencé un serveur en expressjs pour pré-rendre des meta à envoyer dans la page HTML. C'était pas trivial mais pas trop compliqué non plus, mais je me suis rendu compte que j'étais en train de réimplémenter Next :D. Aujourd'hui, après 12 ans de travail sur des applis Web diverses, je fait un constat simple : les promesses de gain de SEO et de performance vendues par les défenseurs des MPA par rapport aux SPA *ne sont pas vérifiées dans les faits*. Sur futur.eco comme sur nosgestesclimat.fr, la migration vers Next depuis un React sans serveur + l'option de prerender.io de base de Netlify *n'a pas donné d'augmentation de SEO à horizon que ce soit au bout d'une semaine, d'1 mois, de 6 mois, d'1 an ou d'un an. À l'inverse sur futur.eco, l'ajout d'un nouveau calculateur qui ciblait des mots clefs "coût d'un trajet en voiture" en plus de "calcul de CO2 ferry avion etc" a résulté en une *explosion* de SEO. De même, le trafic n'a pas non plus explosé sur ces deux produits. Certains développeurs ont donc tendance à surestimer énormément le gain produit d'une MPA, et à sous-estimer les complexités de la gestion du combo server client et toutes ses réhydratations finalement pas si magiques. Et si ça peut vous rassurer, si je devais lancer un nouveau blog interaction utilisateur, évidemment que je ferais du prérendu côté serveur ;) À chaque besoin sa techno. Cela dit, ça n'empêche pas de vouloir augmenter la part de RSC dans l'architecture de Cartes. Mais *ce n'est pas la priorité*, loin de là ! Pour le SEO, avant tout ça, il faut des liens entrants, des partenariats, des intégrations en iframe, des pages de contenu, une page à propos, un blog plus fourni, de meilleurs meta de partage, de la génération côté serveur des fiches lieux, des dizaines d'autres contenus à inventer, et tout ça ne nécessite aucunement du RSC plutôt qu'un simple rendu côté serveur. Ajoutons que d'autres frameworks sont très intéressants en 2024 : Deno Fresh, Hono jsx, etc. Mais pour Cartes, à ce stade, Next fait le boulot sans problème et avec beaucoup d'avantages :) ## CSS La gestion du CSS par Next app router n'est pas super. Je suis très attaché à styled-components, car c'est un framework CSS très proche du standard CSS, qui permet à la fois d'extraire des composants réutilisables, et de balancer du CSS personnalisé pour des composants uniques (très fréquents) via la balise `css`. Mais styled-components oblige à créer des îlots de *use client* même dans le layout haut niveau des pages, car React RSC ne supporte pas le *context*... Notons alors la librairie `next-yak` qui semble super prometteuse pour ça ! https://github.com/jantimon/next-yak/issues/77#event-12982863836. MAJ : on est passés à Next-yak depuis longtemps et c'est génial. On écrit notre CSS qui marche en RSC comme en client, sans contrainte majeure. ## Design Sur [cet ticket](https://codeberg.org/cartes/web/issues/2194) en réponse j'expose une partie de nos choix "radicaux" sur le design. ## Typescript ou JS ? Je suis largement favorable à Typescript, mais pas encore convaincu de l'intérêt de tout typer, notamment l'UI, en l'absence d'une équipe nombreuse de développeurs ni d'enjeux de prod *graves*. Surtout, dans la perspective actuelle d'expérimentations à tout va. Je suis plus un utilisateur opportuniste de typescript : mon usage principal aujourd'hui est d'améliorer les suggestions automatiques de l'environnement de dev. On est très très loin d'avoir une app qui compilerait avec l'option stricte typescript et ce n'est pas le but d'y arriver à moyen-terme. Mais plus de couverture des types, notamment au fur et à mesure de la convergence des fonctionnalités (par exemple, la gestion des images Wikimedia, Wikipedia, Wikidata, Panoramax dont certains bouts de codes sont actuellement séparés, bazar vs cathédrale), ça oui !
Member
Copy link

Coucou @laem ! Par rapport à Typescript, de ce que je comprends, on évite de type pour l'instant dans nos contributions, tant que le projet est très changeant. Par contre, plus le code devient "clean" et permanent (avec une convergence des fonctionalités), on pourra plus rajouter de types pour renforcer le tout. C'est bien ça ?

Coucou @laem ! Par rapport à Typescript, de ce que je comprends, on évite de type pour l'instant dans nos contributions, tant que le projet est très changeant. Par contre, plus le code devient "clean" et permanent (avec une convergence des fonctionalités), on pourra plus rajouter de types pour renforcer le tout. C'est bien ça ?
Author
Owner
Copy link

C'est bien ça ! Les structures de données clef, comme le state (qui représente départ, étape 1, étape 2..., destination) pourrait être typé par exemple. Je l'ai réécrit il y a quelques mois, il le sera peut-être à nouveau.

C'est bien ça ! Les structures de données clef, comme le *state* (qui représente départ, étape 1, étape 2..., destination) pourrait être typé par exemple. Je l'ai réécrit il y a quelques mois, il le sera peut-être à nouveau.
Author
Owner
Copy link

À titre d'exemple, j'ai typé le format des images qui sont affichées sur un lieu. Ça aide, car beaucoup de fonctions créent ce format qui doit être générique pour être traité dans PlaceImages.tsx

À titre d'exemple, j'ai typé le format des images qui sont affichées sur un lieu. Ça aide, car beaucoup de fonctions créent ce format qui doit être générique pour être traité dans PlaceImages.tsx

Je pense qu'il y aurait une grosse plus-value à typer l'objet 'feature' reçu de l'api car je me suis completement perdu dans le code où est-ce qu'il est utilisé...

Je pense qu'il y aurait une grosse plus-value à typer l'objet 'feature' reçu de l'api car je me suis completement perdu dans le code où est-ce qu'il est utilisé...
Sign in to join this conversation.
No Branch/Tag specified
master
abostats
SynchroM-master
gps
embeddings
lysios-patch-5
lysios-patch-4
lysios-patch-3
lysios-patch-2
lysios-patch-1
abo-serveur2
clim
zone-en-favori
categories_toujours_visibles
rechercher_ici_avant_resultats
test-2365
panoramax-contribution
add-categories-validations
gel-bug-prod
osm-note-2
broken
wikidata_booking
fuse7.3
lysios-patrimoine-3
gps2
atproto-fix-2
styles-secondaires-mais-maison
atproto-scopes
itineraire-printemps-2026
modal-sheet-5.6
nlnet-cost-climate-perf
pb-icones-religieux
couvoiture
etiennejr-patch-2
meteo-fainéante
logo-static-url
poc-page-vitrine
remove-compass
test-reproduce-1795
display-cycleway-lanes-2
poc-image
add-media-condition
mapterhorn
test-indoor-equal
outdoors-VS-indoorEqual
hiking-colors
fix-blog-typing
poc-next-international
fix-map-style-modal-not-closing
i18n
hide-odd-zoom-levels
filter_categories
resume_wikipedia
deplacement_bouttons
fix-1095
mobile_permettre_selection
position-carte-initiale
dégradé-icônes
better_wikipedia
affichage_donnees_wikidata
mobile-permettre-selection
avis-details
perf-seo
modal-sheet-5
plans-novembre
display-cycleway-lanes
fix-1227
fix-1234
etiennejr-patch-1
update-1240
fix-1236
fix-1131
photon-search-street
fix-1221
article-avis
net-haut-zoom
baies-moins-visibles
belles-fiches-lieu
fix-1157
bug-page-vie-privée
use-watername
fix-1176
carte-du-onde
fix-1166
page-news
tchou
add-icon-alias
vitesse
photon-opensearch
private-in-italic
bâtiments-3D
merge-categories
handle-private-highway
improve-findcategory
injection-pmtiles
fix-1128
check-icons
update-readme
category-rugby
bug-position-carte-vs-lieu
limites-vitesse
improve-find-category-from-tags-v2
integrer
document-osmfeature
translate-document
velo-fin-aout-25
velo-ete-2025
moins-de-maptiler
planet-pmtiles-tilemaker
fix-1048
panoramax-leger
plume
horaires-i18n
planet
maj-deps-juillet-2025
improve-find-category-from-tags
bug-encart
interactions-encart-mobile
clic-on-station
fix-1028
fix-1014
edit
add-big-rivers
add-shortbread-tiles
handle-deleted-osm-elements-v2
codeberg
improve-useEffect
immoloc
update-dashboard
analyze
terradraw
sombre2
calendar
poi-sprites-using-svg
style-sombre
sprites
annuaire
motis-gtfs-attributes
next-styled-components
dev
cool2
cool
panoramax-angle
env-static-urls
borders-only
panoramax2
intelligence
debug-iles
nouveau-serveur
france-protomaps
turbo
fouss/cartes-#338
blog2
legislatives
presentation
pas-de-geoloc-si-hash-different
protomaps
vaul
carte-trains
citiz
maj-paquets
icones
ui2
bblog
voyagevoyage
test-image-origine
bugimagefin
searchParams
voyage
avion
perf
studio
piscine
journée
année
journée-transition
score-dès-acceuil
fix-space-problem
rebase-5août
correspondance
règles-séparées
indeps-acre
demo
indeps
indeps-cachés
indication-temps-plein
indeps-refactor-simulations
indeps-vue-comparaison
indeps-inversion
barème-continu
indeps-démo
textes-branches-sécu
engine-enum
2019
transport
publicodes
as
infrance-nouvelle-landing
better-translation
co2
simplifATMP
controle-SMIC
webi18n
bug-avantages-en-nature
revert-352-infrance-navigation-v2
laem-patch-1
robots.txt
improve-perf
iframe-bugfix
quickfixes
lib
irsimple
hiringinfrance.com
dégradé
refstate
johan
zrr
logo-interactif
revert-216-improve-tracking
redesign2
zrr2
fixtrad
correction-salaire-brut
petit-state
alien-consolidate
translate-ui
npm
alien-brut-net
translatable
différent
ir18
fix-typo
add-tracking
fix-collect-missing
défauts-partout
fix-double-unfold-three
fix-double-unfold
versement-transport
blocker-questions
v3
v2.1
v2
v1
v0.6.4
v0.6.3
v0.6.2
v0.6.1
v0.6.0
0.7.0
v0.5.1
v0.5.0
v0.4.2
v0.4.1
v0.4.0
v0.3.3
v0.3.2
v0.3.1
v0.3
v0.2
v0.1-cdd-alpha
v0-démo-tag-nav
Labels
Clear labels
🎨 Design
À propos de l'interface et de l'UX
💡 Idée
Nouvelle feature à intégrer
question
Further information is requested
🌍 OSM
À propos de l'affichage et l'édition des éléments OSM
🌱 Amélioration
Amélioration/fix de l'existant
🐞 Bug
Something isn't working
📊 SEO
📋 Catégories
À propos des catégories de recherche et de l'annuaire
📖 Wiki
📝Avis
A propos de la fonction avis et de bluesky
📢 Oyez
📷 Photos
A propos des photos (sources, affichage)
🔍Recherche
A propos de la barre de recherche et de photon
🔥 Actuel
🔧 tech
🖌 Styles
Styles de la carte
🧝i18n
🧪 R&D
🚍 Transports
🚙 Voiture
🚨Prioritaire
Ticket à traiter rapidement
🚲Vélo
Cartes
climat
Communication
demo
Cette branche doit être déployée comme une démo
dependencies
Pull requests that update a dependency file
javascript
Pull requests that update javascript code
Pas urgent
Plein-air
Tuiles
Verso
Vieux
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cartes/web#336
Reference in a new issue
cartes/web
No description provided.
Delete branch "%!s()"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?