Aller au contenu principal

Architecture de 1j1s-front

20 Avril 2023

Introduction​

Propulsé par NextJS, l'application est découpée de la sorte :

Architecture 1j1s-front

Technologies​

  • Langage : TypeScript
  • Framework : NextJS
  • Environnement serveur : NodeJS
  • Tests : Jest + React Testing library + Cypress
  • Style : CSS Modules + Sass
  • Package Manager : npm

ADR (Architectural Decision Record)​

Certains choix techniques sont expliqués l'ADR.

Génération des pages web​

Génération des pages web

L'application exploite les possibilités de NextJS pour optimiser les performances lors de la génération des pages web :

  • Des pages statiques (SSG), gĂ©nĂ©rĂ©es lors de l'Ă©tape de build de l'application pour quelques "pages de base" (accueil, pages de recherche, etc.)
  • Des pages statiques crĂ©Ă©es Ă  la demande et mises Ă  jour pĂ©riodiquement (ISR) pour les pages se basant sur un service externe prĂ©sentant des donnĂ©es froides (description d'offre, lien avec le CMS, etc.)
  • Des pages gĂ©nĂ©rĂ©es dynamiquement (SSR) quand celles-ci prĂ©sentent des donnĂ©es chaudes (pas de page rĂ©pondant Ă  ce critère)

Les pages de recherche sont mise à jour côté client (CSR) grâce à des requêtes HTTP entre le client et le BFF (back-for-front).

Structure​

Le code source est découpé en 4 parties :

src
├─── client
├─── pages
├─── server
└─── styles

Client​

Comprend tout fichier utile à l'affichage et la logique côté client.

client/
└─── components/
├── features/ : composants avec logique métier
├── head/ : composants pour mettre à jour les données dans la balise `head`
├── layouts/ : composants mutualisé pour la mise en page
└── ui/ : composants génériques en lien avec la charte graphique

Pages​

Point d'entrée des pages et chemins d'accès du site.

└─── pages/
├── {ma-page}/
│ ├── index.analytics.ts : données d'analytics à transmettre lors de l'interaction avec la page
│ ├── index.page.tsx : point d'entrée de la page
│ └── index.page.test.tsx : fichier de test de la page, avec React Testing Library
├── ...
└── api/ : ensemble des resources exposés
├── middlewares : middlewares partagés dans les ressources exposées
└── {resource}/ : resource exposée
├── index.controller.ts : point d'entrée de l'endpoint
└── index.controller.test.ts : fichier de test de la resource

Server​

Logique métier et interaction avec les services externes. Structure tendant vers la clean architecture. Le nom des dossiers est au pluriel alors que le nom des fichiers est au singulier.

└─── server/
├── {modules}/
│ ├── configuration/ : centralisation des dépendances pour le module et configuration éventuelle pour les clients http
│ ├── domain/ : types liés au module et interface du repository
│ ├── infra/
│ │ └── repositories/ : implémentation de l'interface du domain et typage des objets liés aux repositories
│ └── useCases/ : cas d'usage métier
└── ...

Le dossier configuration/ à la racine de server/ et de chaque module s'occupe d'initialiser, à l'aide d'une seule fonction, toutes les dépendances dans son scope respectif.

Styles​

Fichiers de styles partagés, ni lié à un seul composant ni à un layout ou page. Afin d'exploiter certaines facultés de Sass, les fichiers sont découpés comme suit dans les différents dossiers, le cas échéant :

  • _mixins.scss : mixin Sass
  • _placeholders : placeholders Sass
  • _styles : style
  • _variables : variables Sass Tous les fichiers utiles pour composer le style cĂ´tĂ© client, rĂ©partis dans les diffĂ©rents sous-dossiers de styles/, sont importĂ©s depuis le fichier _utilities/ Ă  la racine de styles/, pour que seul ce fichier soit ensuite importĂ©.
    On retrouve également _utilities-deprecated qui correspond a l'état de nos styles partagés avant la migration vers l'UI kit. Ce fichier n'est plus a utilisé.
└─── styles
├── components/ : styles partagés liés à des composants
├── media/ : tout ce qui est en rapport aux règles @media
├── reset/ : style pour reset le CSS des agents utilisateurs
├── theme/ : transposition du theme
├── typographie/ : tout ce qui concerne le texte
├── _utilities.scss : fichier important tout ce qui est utile pour la composition du style de l'application
├── _utilities-deprecated.scss : ancien fichier composant le style de l'application avant la migration vers l'UI kit. Ne plus l'utiliser.
└── main.css : règles de base communes à tout le site

Nomenclature des fichiers​

Les fichiers sont découpés selon leur destination et suffixés en conséquence :

  • *.test.tsx : test d'un composant reprenant le mĂŞme nom. Ex : Modal.tsx et Modal.test.tsx.
  • *.test.ts : test d'un fichier TypeScript reprenant le mĂŞme nom. Ex : apiAdresse.repository.ts et apiAdresse.repository.test.ts.
  • *.mock.ts : fonctions utilitaires pour stub / mock des services, fonctions, etc.
  • *.fixture.ts : donnĂ©es de test.
  • *.module.scss : style Sass, liĂ© Ă  un composant. Ex : Modal.tsx et Modal.module.scss.
  • *.page.tsx : point d'entrĂ©e et composant d'une page gĂ©nĂ©rĂ©e par NextJS. Le suffixe est important selon la configuration de l'application NextJS.
  • *.analytics.ts : configuration des donnĂ©es d'analytics liĂ©es Ă  la page.
  • *.controller.ts : point d'entrĂ©e d'une ressource exposĂ©e par le BFF. Le suffixe est important selon la configuration de l'application NextJS.
  • *.middleware.ts : middleware utilisĂ© dans un ou plusieurs contrĂ´leurs.
  • *.util.ts : fonctions utilitaires nĂ©cessaires dans le module courant.
  • *.repository.ts : dans un domaine, interface d'un repository. CĂ´tĂ© infra, implĂ©mentation de l'interface.
  • *.mapper
  • *.<interface>.service.ts : ImplĂ©mentation de l'interface <interface>. Ex : tarteAuCitron.cookies.service.ts est une implĂ©mentation de l'interface dans cookies.service.ts.