📘 Frontend, javascript et React

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 :

  1. L’utilisateur effectue une action sur l’interface (par exemple, remplir un formulaire).
  2. Le frontend envoie une requĂȘte HTTP Ă  une API du backend (par exemple, une requĂȘte POST pour enregistrer des donnĂ©es).
  3. Le backend traite la requĂȘte, effectue les vĂ©rifications nĂ©cessaires et stocke les informations en base de donnĂ©es.
  4. Une réponse est envoyée au frontend (succÚs, échec, données mises à jour
).
  5. 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.

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 :

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.

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>;
}
Pour aller plus loin :
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.

Pour aller plus loin :
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.

Pour aller plus loin :
Documentation officielle d'Axios
Pour aller plus loin :
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 et JavaScript) qui seront exĂ©cutĂ©s directement dans le navigateur.

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/.

Pour aller plus loin :
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.

Pour aller plus loin :
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

Le javascript est un language interprété comme python, il faut également veiller a contrÎler et organiser le code proprement.

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

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 .