Architecture frontend / backend

Lorsqu’on dĂ©veloppe une application, on organise gĂ©nĂ©ralement le code en plusieurs parties distinctes pour le rendre plus clair et plus facile Ă maintenir. Deux architectures courantes sont :
- Lâarchitecture MVC (ModĂšle-Vue-ContrĂŽleur), souvent utilisĂ©e dans les applications monolithiques, oĂč le code est structurĂ© en trois couches :
- ModÚle : gÚre les données et leur stockage
- Vue : affiche les informations Ă l’utilisateur
- ContrĂŽleur : fait le lien entre les deux, en traitant les actions de l’utilisateur
C’est notamment le cas pour les applications pour lesquelles on utilise du Server Side Rendering
- Lâarchitecture frontend / backend, qui repose sur une sĂ©paration plus nette entre lâinterface utilisateur et la logique mĂ©tier. Câest cette approche que lâon retrouve dans la plupart des applications web modernes.
Dans une architecture frontend / backend, lâapplication est divisĂ©e en deux grandes parties :
- Le frontend : c’est la partie visible avec laquelle lâutilisateur interagit. Il comprend lâinterface graphique (boutons, formulaires, animations, graphiquesâŠ) et gĂšre l’affichage des donnĂ©es. Son rĂŽle est de rendre l’expĂ©rience utilisateur fluide et intuitive.
- Le backend : c’est la partie cachĂ©e qui gĂšre la logique mĂ©tier et le stockage des donnĂ©es. Il reçoit les requĂȘtes du frontend, effectue les traitements nĂ©cessaires (calculs, validation, enregistrement en base de donnĂ©es) et renvoie les rĂ©sultats.
Dans les applications modernes, ces deux parties communiquent grùce à des API, qui définissent comment le frontend peut récupérer et envoyer des informations au backend.

Comment fonctionnent frontend et backend ensemble ?
Dans une application typique, le frontend et le backend interagissent de la maniĂšre suivante :
- Lâutilisateur effectue une action sur lâinterface (par exemple, remplir un formulaire).
- Le frontend envoie une requĂȘte HTTP Ă une API du backend (par exemple, une requĂȘte POST pour enregistrer des donnĂ©es).
- Le backend traite la requĂȘte, effectue les vĂ©rifications nĂ©cessaires et stocke les informations en base de donnĂ©es.
- Une rĂ©ponse est envoyĂ©e au frontend (succĂšs, Ă©chec, donnĂ©es mises Ă jourâŠ).
- Le frontend met Ă jour lâaffichage en fonction de la rĂ©ponse reçue.
Ce schĂ©ma repose souvent sur des opĂ©rations CRUD (CrĂ©er, Lire, Mettre Ă jour, Supprimer), qui permettent au frontend d’interagir avec la base de donnĂ©es via le backend.
Votre rĂŽle en tant que futurs statisticiens
Dans un projet, les équipes se répartissent généralement les tùches :
- Les dĂ©veloppeurs frontend conçoivent et optimisent l’interface utilisateur.
- Les dĂ©veloppeurs backend s’occupent des traitements de donnĂ©es et de la mise en place des API.
En tant que statisticiens, vous serez souvent amenés à travailler sur le backend, en manipulant les données.
The BFF Pattern (Backend for Frontend): An Introduction
Introduction Ă React
Frameworks frontend
Pour faciliter le dĂ©veloppement, on utilise des frameworks, qui sont des ensembles d’outils et de bonnes pratiques permettant de structurer le code et de gagner du temps.
- CÎté frontend, des frameworks comme React.js, Angular ou Vue.js permettent de créer des interfaces interactives et dynamiques.
- CĂŽtĂ© backend, des frameworks comme Spring Boot (Java) ou FastAPI (Python) facilitent la gestion des requĂȘtes, des bases de donnĂ©es et de la logique mĂ©tier.

React est une bibliothÚque JavaScript open-source développée par Facebook. Elle est utilisée pour créer des interfaces utilisateur dynamiques et performantes. De nombreuses applications populaires comme Facebook, Messenger et Instagram reposent en grande partie sur cette technologie.
Il peut ĂȘtre difficile d’apprendre React en un seul cours, mais si cela vous intĂ©resse, il existe de nombreux tutoriels simples et accessibles :
Tutoriel OpenClassrooms : "Débutez avec React"
Tutoriel React : "Introduction Ă React"
Le DOM et le Virtual DOM
Lorsqu’un navigateur charge une page web, il construit une reprĂ©sentation sous forme dâarbre appelĂ©e DOM (Document Object Model) Ă partir du HTML. Ce DOM est manipulable par l’utilisation du Javascript (C’est le cas par exemple pour les outils de dĂ©veloppement des navigateurs, notamment l’onglet “Elements” dans les Developer Tools.)
React ne modifie pas directement ce DOM du navigateur. Ă la place, il créée et utilise un DOM virtuel (Virtual DOM), qui est une copie optimisĂ©e du DOM rĂ©el. Lorsque l’interface change, React compare le Virtual DOM avec l’ancien Ă©tat, dĂ©tecte les modifications nĂ©cessaires et met Ă jour uniquement les parties concernĂ©es du DOM rĂ©el. Cela permet d’amĂ©liorer considĂ©rablement les performances.
Différence entre DOM et Virtual DOM, un article
Le principe des composants
L’idĂ©e centrale de React est de construire une application Ă partir de composants. Un composant est un bloc rĂ©utilisable qui regroupe tout ce dont il a besoin :
- La structure (HTML)
- Le style (CSS)
- Le comportement (JavaScript)

Les composants suivent un cycle de vie composĂ© de trois Ă©tapes : Mounting (ajout au DOM), Updating (mise Ă jour) et Unmounting (suppression du DOM). Leur comportement peut ĂȘtre modifiĂ© Ă chaque Ă©tape grĂące aux hooks.
Un composant fonctionnel est simplement une fonction JavaScript qui retourne un élément React :
function MyComponent() {
return <div>Hello ENSAI đ</div>;
}
Ces composants :
- Encapsulent tout leur fonctionnement : structure, styles et comportement
- Sont rĂ©utilisables : on peut les utiliser plusieurs fois dans une mĂȘme application
- Peuvent ĂȘtre imbriquĂ©s les uns dans les autres pour construire une interface complĂšte
React permet donc de découper une interface en petits composants réutilisables et de les assembler pour construire des applications performantes.
React utilise le langage JSX, qui est une extension de JavaScript permettant d’intĂ©grer une syntaxe similaire Ă HTML directement dans le code JavaScript.
Caractéristiques du JSX :
- Langage Ă balises : Comme le HTML, le JSX se compose de balises.
- Majuscule pour les composants : Pour que React reconnaisse un Ă©lĂ©ment comme un composant, il est essentiel de commencer son nom par une majuscule. Sinon, React considĂ©rera qu’il s’agit d’une balise HTML standard.
- Encapsulation des composants : Lorsque vous utilisez plusieurs composants, ils doivent ĂȘtre enveloppĂ©s dans un seul composant parent.
Voici comment structurer plusieurs composants enfants Ă l’intĂ©rieur d’un composant parent :
function Parent() {
return (
<div>
<Enfant />
<Enfant />
<Enfant />
</div>
);
}
function Enfant() {
return <div>Je suis un enfant !</div>;
}
Ajouter du style Ă notre composant
Pour styliser notre composant, il suffit d’utiliser l’attribut className
et d’indiquer le nom du sĂ©lecteur CSS correspondant.
Par exemple, si je souhaite que le texte “Hello ENSAI đ” soit en rouge, je peux procĂ©der comme suit :
Fichier nommé Titre.css
.helloensai {
color: red;
}
Fichier contenant votre composant
import './Titre.css';
function MyComponent() {
return <div className="helloensai">Hello ENSAI đ</div>;
}
Démarrer avec CSS
Le langage React est largement utilisĂ©, et grĂące à ça, il y a plein de bibliothĂšques de composants React prĂȘtes Ă l’emploi. Elles permettent d’avoir un design harmonieux et vous font gagner un temps fou, car vous n’avez pas besoin de redĂ©finir chaque composant de base. En plus, elles proposent des options pour rendre votre application accessible Ă tous et vous donnent la possibilitĂ© de personnaliser les Ă©lĂ©ments selon vos besoins.
Ă l’INSEE, on utilise surtout la bibliothĂšque Material UI et le Design systĂšme de l’Ă©tat - DSFR, mais il y a aussi d’autres choix comme Bootstrap ou Ant Design.
Liste des composants Material UI
Un hook React
Les Hooks sont des fonctions qui permettent de « se brancher » sur la gestion de l’Ă©tat local et du cycle de vie de React depuis des composants fonctionnels. React propose plusieurs Hooks prĂ©dĂ©finis, comme useState
ou useEffect
. Mais vous pouvez aussi créer vos propres Hooks pour réutiliser un comportement avec état dans différents composants.
Le hook d’Ă©tat : useState
Imaginons que vous souhaitez que l’interaction avec l’utilisateur change le comportement de votre composant. Par exemple, si vous cliquez sur un bouton pour ouvrir la description, cela affichera la description de votre PokĂ©mon. Inversement, si vous cliquez sur un bouton pour fermer la description, celle-ci sera masquĂ©e.
Pour cela, vous devez dĂ©finir un hook d’Ă©tat : ce hook permet d’enregistrer l’Ă©tat de votre composant. Voici comment procĂ©der dans votre composant :
import { useState } from "react";
function Pokemon() {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<h1>Dracaufeu</h1>
{isOpen ? (
<p>
Dracaufeu (anglais : Charizard ; japonais : ăȘă¶ăŒăăł Lizardon) est un PokĂ©mon de type Feu et Vol de la premiĂšre gĂ©nĂ©ration. C'est la mascotte des jeux PokĂ©mon Rouge et PokĂ©mon Rouge Feu.
</p>
) : null}
<button onClick={() => setIsOpen(!isOpen)}>
{isOpen ? 'Fermer la description' : 'Ouvrir la description'}
</button>
</div>
);
}
Cependant, la description et le nom du Pokémon sont écrits en dur. Pour réutiliser notre composant, nous allons utiliser les props.
Transmission Parent / Enfant : Props
Nous allons réécrire le composant comme suit :
import { useState } from "react";
function Pokemon({ nom, description }) {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<h1>{nom}</h1>
{isOpen ? (
<p>{description}</p>
) : null}
<button onClick={() => setIsOpen(!isOpen)}>
{isOpen ? 'Fermer la description' : 'Ouvrir la description'}
</button>
</div>
);
}
Ensuite, dans un composant parent, nous ferons ceci :
import { useState } from "react";
const pokemonListJson = [
{
nom: "Dracaufeu",
description:
"Dracaufeu (anglais : Charizard ; japonais : ăȘă¶ăŒăăł Lizardon) est un PokĂ©mon de type Feu et Vol de la premiĂšre gĂ©nĂ©ration. C'est la mascotte des jeux PokĂ©mon Rouge et PokĂ©mon Rouge Feu.",
},
{
nom: "SalamĂšche",
description:
"SalamĂšche (anglais: Charmander ; japonais: ăăă«ăČ Hitokage) est un PokĂ©mon de type Feu de la premiĂšre gĂ©nĂ©ration. C'est l'un des PokĂ©mon de dĂ©part de la rĂ©gion de Kanto.",
},
];
function PokemonList() {
return (
<div>
<h1>Liste des Pokémon</h1>
{pokemonListJson.map((pokemon, index) => (
<Pokemon key={index} nom={pokemon.nom} description={pokemon.description} />
))}
</div>
);
}
Dans notre composant PokemonList
, nous affichons tous les Pokémon présents dans la liste pokemonListJson
. Bien sĂ»r, l’objectif est d’afficher tous les PokĂ©mon que nous recevrons dans un appel Ă l’API, mais nous aborderons cela plus tard.
Les props (properties) sont des paramÚtres que tu passes à un composant pour lui fournir des données dynamiques. Elles permettent de rendre les composants réutilisables et configurables. Les props sont passées comme des attributs HTML à un composant dans son coposant parent.
Si nous voulons utiliser l’Ă©tat d’un composant dans un autre, nous appliquerons la mĂ©thode consistant Ă dĂ©finir l’Ă©tat dans le premier composant parent commun aux deux composants. Nous descendrons ensuite l’Ă©tat et la mĂ©thode de changement jusqu’aux composants qui en ont besoin.
Le hook de synchronisation: useEffect
Le hook useEffect
est utilisĂ© pour effectuer des effets de bord dans les composants fonctionnels de React. Ce hook vous permet d’exĂ©cuter du code aprĂšs que le composant a Ă©tĂ© montĂ© ou mis Ă jour, et mĂȘme de nettoyer les effets lorsque le composant est dĂ©montĂ©.
Voici un exemple simple d’utilisation du hook useEffect
. Imaginons que nous voulons rĂ©cupĂ©rer des donnĂ©es d’une API lorsque le composant est montĂ©.
import React, { useState, useEffect } from "react";
import axios from "axios";
function PokemonList() {
const [pokemons, setPokemons] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchPokemons = async () => {
try {
const response = await axios.get("https://api.example.com/pokemons");
setPokemons(response.data);
} catch (error) {
// On récupÚre le code d'état et le message d'erreur
const errorMessage = error.response
? `Erreur ${error.response.status}: ${error.response.data.message || "Erreur inconnue"}`
: "Erreur de réseau";
setError(errorMessage);
} finally {
setLoading(false);
}
};
fetchPokemons();
}, []); // Le tableau vide signifie que l'effet ne s'exécute qu'une fois, lors du premier rendu.
if (loading) {
return <p>Chargement des Pokémon...</p>; // Affichage pendant le chargement
}
if (error) {
return <p>{error}</p>; // Affichage du message d'erreur
}
return (
<div>
<h1>Liste des Pokémon</h1>
<ul>
{pokemons.map((pokemon) => (
<li key={pokemon.id}>{pokemon.nom}</li>
))}
</ul>
</div>
);
}
La mĂ©thode fetchPokemons() est une fonction asynchrone qui rĂ©cupĂšre la liste des PokĂ©mon depuis une API en utilisant Axios. Elle utilise un bloc try-catch pour gĂ©rer les erreurs de requĂȘte. Si la requĂȘte rĂ©ussit, elle met Ă jour l’Ă©tat pokemons avec les donnĂ©es rĂ©cupĂ©rĂ©es. En cas d’erreur, elle dĂ©finit un message d’erreur dans l’Ă©tat error. Enfin, elle met Ă jour l’Ă©tat loading Ă false dans tous les cas, indiquant que le chargement est terminĂ©. Cette mĂ©thode est appelĂ©e lors du premier rendu du composant PokemonList.
Client HTTP : Axios
Axios est Ă JavaScript ce que requests
est Ă Python. Il s’agit d’un client HTTP, comme expliquĂ© dans le cours đ API webservices et HTTP, FastAPI..
C’est une bibliothĂšque asynchrone, parmi d’autres comme fetch
. Cependant, Axios est souvent préféré à fetch
en raison de sa gestion automatique des requĂȘtes et des rĂ©ponses, de la possibilitĂ© d’annuler des requĂȘtes, et de sa simplicitĂ© d’utilisation pour la configuration des en-tĂȘtes et des paramĂštres.
Documentation officielle d'Axios
Comment utiliser Axios avec React
Remarque: Les principes de conception logicielle s’appliquent toujours en javascript, il vous faudra externaliser et centraliser la configuration des urls
Par exemple, pour une application utilisant VITEJS
dans votre fichier .env, vous pourrez ajoutez la ligne suivante :
Nous nous intéresserons a ViteJS dans une partie suivante
VITE_API_URL=https://api.example.com
Les variables d’environnement doivent commencer par VITE_
pour ĂȘtre exposĂ©es Ă votre code client.
Exemple d'implémentation
Dans un fichier api.js
:
import axios from 'axios';
const apiUrl = import.meta.env.VITE_API_URL;
export default axios.create({
baseURL: apiUrl
});
Dans le fichier oĂč vous utilisez Axios, il vous suffira d’ajouter l’import suivant :
import API from './api';
Ensuite, remplacez la ligne :
const response = await axios.get("https://api.example.com/pokemons");
par :
const response = await API.get("pokemons");
Cela simplifie vos appels API et rend votre code plus lisible.
Créer votre application React

Maintenant que vous avez découvert les concepts fondamentaux de ReactJS, voyons comment mettre en place votre premiÚre application React.
Utilisation dâun outil de build : Vite.js
Dans un projet React, on ne code pas directement en JavaScript “brut”, car on utilise des fonctionnalitĂ©s modernes comme le JSX et les modules ES. Pour cela, il est essentiel dâavoir un outil de dĂ©veloppement qui facilite la crĂ©ation et lâexĂ©cution du projet.
Un tel outil doit permettre de :
- Lancer un serveur local pour voir les modifications en temps réel pendant le développement.
- Transformer et optimiser le code pour quâil soit compatible avec tous les navigateurs.
- Gérer les imports de fichiers (CSS, images, etc.).
- AccĂ©lĂ©rer le chargement des modules et amĂ©liorer lâexpĂ©rience des dĂ©veloppeurs avec le rechargement automatique.
PlutĂŽt que de tout configurer manuellement, les dĂ©veloppeurs utilisent des outils packagĂ©s qui simplifient la gestion des dĂ©pendances et optimisent le rendu de lâapplication. Parmi eux, Vite.js est particuliĂšrement apprĂ©ciĂ© pour sa rapiditĂ© et sa simplicitĂ©. Il est dâailleurs largement utilisĂ© Ă lâInsee. D’autres alternatives existent, comme Create React App
ou Next.js
.
Exécution du code JavaScript avec Node.js
JavaScript sâexĂ©cute normalement dans un navigateur. Cependant, pour dĂ©velopper des applications modernes, il est nĂ©cessaire dâavoir un environnement capable dâexĂ©cuter JavaScript en dehors du navigateur : Node.js.
Node.js repose sur le moteur V8 de Google Chrome et permet d’exĂ©cuter du code JavaScript directement sur votre machine, comme un langage de programmation classique.
Pourquoi a-t-on besoin de Node.js ?
- Il permet de lancer un serveur de dĂ©veloppement pour exĂ©cuter lâapplication en local (Vite en a besoin pour fonctionner).
- Il facilite lâinstallation et la gestion des bibliothĂšques via npm (Node Package Manager).
En production, un serveur statique est gĂ©nĂ©ralement utilisĂ© pour hĂ©berger lâapplication. Il sert uniquement les fichiers gĂ©nĂ©rĂ©s (
HTML
,CSS
etJavaScript
) qui seront exécutés directement dans le navigateur.
Une documentation sur les moteurs de scripts javascript
Gestion des dépendances avec npm
Comme pip
pour Python, npm (Node Package Manager) est le gestionnaire de paquets de Node.js. Il permet dâinstaller, gĂ©rer et partager des modules JavaScript utilisĂ©s dans votre projet.
Installation de Node.js et NPM
Sur une distribution Linux (Debian/Ubuntu) :
sudo apt uninstall node npm
sudo apt install curl && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
source ~/.bashrc
nvm install v22
node -v
npm -v
Installation de Vite.js
Préambule, utilisation de npm :
La commande npm install
va installer toutes les dépendances nécessaires à ton projet. Il est important de noter que, lorsque tu versionnes ton projet avec Git, tu dois absolument ajouter ce dossier dans fichier .gitignore
pour Ă©viter d’envoyer les fichiers inutiles sur ton dĂ©pĂŽt :
node_modules
La syntaxe est :
npm install <package>
ProcĂ©dure d’installation d’un projet Vite.js
Pour installer Vite.js, il suffit de lancer cette commande dans le terminal :
npm install -g create-vite
Ensuite, pour démarrer un projet avec Vite.js, vous pouvez suivre ces étapes :
npm create vite@latest mon-projet
cd mon-projet
npm install
Pour lancer l’application localement aprĂšs l’installation, utilise cette commande :
npm run dev
Ton application sera accessible Ă l’adresse http://localhost:5173/
, et elle se rechargera automatiquement Ă chaque modification.
Si tu veux tester ton application en mode production, tu peux lancer les commandes suivantes :
npm run build
npm run preview
Ton application sera alors accessible Ă l’adresse http://localhost:5173/
.
Documentation Officiel de Vite
Détails des fichiers et dossiers générés par Vite.js

index.html : Câest le fichier HTML de base qui est chargĂ© dans le navigateur. Il contient gĂ©nĂ©ralement les liens vers les fichiers JavaScript et CSS de ton projet.
package.json : Il contient toutes les informations importantes sur ton projet, comme les dĂ©pendances (voir semantic-versionning), les scripts pour dĂ©marrer et construire ton application, etc. C’est aussi lĂ oĂč tu ajoutes des bibliothĂšques supplĂ©mentaires.
package-lock.json : Il contient toutes les informations sur les librairies utilisĂ©es lors d’une installation, permet de sanctuariser un ensemble de versions de package correspondant a la demande et qui permet de faire fonctionner l’application.
README.md : Un fichier pour expliquer ton projet, comment lâutiliser et quelles sont ses fonctionnalitĂ©s.
src/ : Ce dossier contient tout le code source de ton application. Câest lĂ que tu vas crĂ©er tes composants, ajouter tes styles, et gĂ©rer toute la logique de ton application.
main.jsx : Le point dâentrĂ©e de ton application. Il va initialiser ton application et y monter le composant principal dans le DOM.
App.jsx : Le composant principal qui définit la structure de ton interface utilisateur.
public/ : Ce dossier contient les fichiers statiques accessibles directement via lâURL de ton application.
vite.config.js : Ce fichier te permet de personnaliser la configuration de Vite pour ton projet. Tu peux y ajouter des plugins ou définir des options de build.
node_modules/ : Ce dossier contient toutes les dĂ©pendances installĂ©es. Il est automatiquement gĂ©nĂ©rĂ© par npm et ne doit pas ĂȘtre modifiĂ© manuellement.
Organiser les composants dans ton projet
Si tu veux ajouter des composants Ă ton projet, tu peux les organiser dans le dossier src/component/
. Par exemple, ton projet pourrait ressembler Ă ceci :
mon-projet/
.
.
.
âââ src/
â âââ component/
â â âââ MonComposant1.jsx
â â âââ MonComposant2.jsx
â âââ styles/
â â âââ MonComposant1.css
â â âââ MonComposant2.css
â âââ main.jsx
â âââ App.jsx
.
.
.
Cela te permet de bien structurer ton projet au fur et Ă mesure que tu ajoutes des composants et des styles.
Variables et modes Env
Utiliser des composants déjà constitués : Material.ui

Material UI est une bibliothĂšque de composants dĂ©jĂ conçus. Ils permettent de fournir un ensemble dĂ©jĂ construit d’Ă©lĂ©ments d’affichage qui contiennent dĂ©jĂ des Ă©lĂ©ments de style, d’accessibilitĂ©, de customisation.
Cette bibliothÚque permet également de configurer un theme global au projet, ce qui centralise la gestion du style dans votre projet plutÎt que de la déléguer a chaque sous composant. Vous pouvez également créer vos propres composants en utilisant des composants fils déjà trÚs développés, les composants MUI.
Si vous souhaitez utiliser Material UI dans votre projet, vous pouvez l’ajouter :
npm install @mui/material @emotion/react @emotion/styled
Cela va mettre Ă jour votre fichier package.json
pour inclure les nouvelles dépendances.
Linter, Formatter : ESLint
Prettier

Linter
Nous vous prĂ©conisons d’utiliser le linter ESlint. Il s’agit d’un Linter pour le dĂ©veloppement JS.
Il se configure a l’aide d’un fichier de configuration .eslintrc
.
Dans une application vite.js:
npm install vite-plugin-eslint --save-dev
Une fois installĂ©, il s’applique sur le projet cĂŽtĂ© serveur.
Pour les contrĂŽles en ligne de commande, et via CI/CD
:
npx eslint
Documentation de mise en place eslint sur projet vite
Formatter
Nous vous prĂ©conisons d’utiliser le formatter Prettier. Il s’agit d’un Formatter pour le dĂ©veloppement JS.
Il s’installe via npm :
npm install --save-dev --save-exact prettier
Une fois installĂ©, vous pouvez configurer votre vscode pour l’utiliser via l’extension Prettier
.
Pour les contrĂŽles en ligne de commande, et via CI/CD
:
npx prettier .
Tutoriel de mise en place sur vscode et installation