Cours JavaScript et React · Module 1: Bases de React
Histoire et philosophie de React
Dans cette leçon2
Notre voyage avec React a commencé dans les bureaux de Facebook (aujourd'hui Meta) en 2011. Jordan Walke, un ingénieur travaillant pour l'entreprise, a créé une première version de React, inspirée par les aspects fonctionnels de la programmation et par les problèmes que rencontraient les développeurs lors de la construction d'interfaces utilisateur complexes.
Facebook a d'abord utilisé React en interne pour son fil d'actualité (News Feed), mais la véritable percée est survenue en 2013, lorsqu'ils ont décidé de publier la bibliothèque en tant que projet open source. C'est à ce moment que React a entamé son voyage vers les étoiles, devenant l'une des bibliothèques les plus populaires au monde pour la construction d'interfaces utilisateur.
La philosophie de React
La philosophie de React repose sur plusieurs concepts révolutionnaires :
Déclarativité - React te permet de décrire à quoi l'interface doit ressembler dans un état donné, plutôt que de spécifier impérativement comment la modifier. C'est comme la différence entre dire « dessine-moi une étoile à cinq branches » (de manière déclarative) et « trace une ligne à 72 degrés, puis à 144 degrés... » (de manière impérative).
Architecture à base de composants - Une application est construite à partir de composants indépendants et réutilisables, à l'image d'un vaisseau spatial composé de modules pouvant être fabriqués, testés et améliorés indépendamment. Chaque bouton, panneau et formulaire peut être un composant distinct qui se connecte aux autres pour former un tout cohérent.
Flux de données unidirectionnel - Les données circulent de haut en bas (du parent vers l'enfant), ce qui facilite la compréhension de la façon dont elles se déplacent dans l'application. Imagine une cascade : l'eau coule toujours du haut vers le bas, jamais en sens inverse. Cette prévisibilité rend les applications plus stables et plus faciles à déboguer.
« Penser à l'utilisateur » - React encourage la création d'interfaces intuitives et conviviales. C'est un changement fondamental par rapport aux approches antérieures, où la technologie dictait souvent l'expérience utilisateur.
Histoire du développement de React
React a connu une évolution fascinante depuis sa première version publique :
2013 : Première version
- Introduction du concept d'architecture par composants
- Implémentation du Virtual DOM
- Prise en charge initiale de JSX
2015 : React Native
- Extension de la philosophie de React aux applications mobiles
- La même syntaxe et des concepts similaires pour créer des applications mobiles natives
2016 : React 15
- Améliorations significatives des performances
- Meilleurs messages d'erreur et d'avertissement
2017 : React 16 (Fiber)
- Refonte complète de l'algorithme de réconciliation
- Introduction des fragments, des portails et de la gestion des erreurs
- Meilleure prise en charge du rendu asynchrone
2019 : React 16.8 (Hooks)
- Changement révolutionnaire dans la gestion de l'état et des effets de bord
- Possibilité d'utiliser l'état et d'autres fonctionnalités de React sans écrire de classes
- Simplification importante du code et de la logique
2020-2022 : React 17 et 18
- Nouvelle transformation JSX (React 17) - importer React dans les fichiers JSX n'est plus nécessaire
- Rendu concurrent et createRoot (React 18)
- Regroupement automatique des mises à jour (batching)
- Suspense aussi lors du rendu côté serveur
2024 : React 19
- Server Components et Actions stables
- Suppression d'API obsolètes, dont ReactDOM.render
Cette évolution montre à quel point React s'est développé de manière constante pour relever les défis du développement d'applications web modernes, en se concentrant toujours sur l'amélioration de l'expérience des développeurs comme des utilisateurs finaux.
Code de cette leçon : App.jsx
1import React from 'react';
2
3// Composant de chronologie pour présenter l'histoire de React
4function TimelineEvent({ year, title, description, isImportant }) {
5 return (
6 <div style={{
7 display: 'flex',
8 marginBottom: '20px',
9 alignItems: 'flex-start'
10 }}>
11 <div style={{
12 minWidth: '80px',
13 textAlign: 'right',
14 marginRight: '20px'
15 }}>
16 <div style={{
17 backgroundColor: isImportant ? '#ff5722' : '#2196f3',
18 color: 'white',
19 padding: '5px 10px',
20 borderRadius: '15px',
21 fontSize: '14px',
22 fontWeight: 'bold'
23 }}>
24 {year}
25 </div>
26 </div>
27 <div style={{
28 flex: 1,
29 padding: '15px',
30 backgroundColor: isImportant ? '#fff3e0' : '#e3f2fd',
31 borderRadius: '8px',
32 borderLeft: `4px solid ${isImportant ? '#ff5722' : '#2196f3'}`
33 }}>
34 <h3 style={{
35 margin: '0 0 10px 0',
36 color: isImportant ? '#e65100' : '#1565c0'
37 }}>
38 {title}
39 </h3>
40 <p style={{ margin: 0, lineHeight: '1.5' }}>
41 {description}
42 </p>
43 </div>
44 </div>
45 );
46}
47
48// Composant pour présenter la philosophie de React
49function PhilosophyCard({ icon, title, description }) {
50 return (
51 <div style={{
52 backgroundColor: '#f8f9fa',
53 border: '1px solid #dee2e6',
54 borderRadius: '8px',
55 padding: '20px',
56 textAlign: 'center',
57 transition: 'transform 0.2s',
58 cursor: 'pointer'
59 }}
60 onMouseEnter={(e) => e.target.style.transform = 'translateY(-5px)'}
61 onMouseLeave={(e) => e.target.style.transform = 'translateY(0)'}
62 >
63 <div style={{ fontSize: '48px', marginBottom: '15px' }}>{icon}</div>
64 <h3 style={{ color: '#343a40', marginBottom: '10px' }}>{title}</h3>
65 <p style={{ color: '#6c757d', lineHeight: '1.5' }}>{description}</p>
66 </div>
67 );
68}
69
70// Composant interactif démontrant la déclarativité
71function DeclarativeExample() {
72 const [isVisible, setIsVisible] = React.useState(true);
73 const [items, setItems] = React.useState(['Element 1', 'Element 2', 'Element 3']);
74
75 const addItem = () => {
76 const newItem = `Element ${items.length + 1}`;
77 setItems([...items, newItem]);
78 };
79
80 const removeItem = () => {
81 setItems(items.slice(0, -1));
82 };
83
84 return (
85 <div style={{
86 backgroundColor: '#e8f5e8',
87 padding: '20px',
88 borderRadius: '8px',
89 margin: '20px 0'
90 }}>
91 <h3 style={{ color: '#2e7d32' }}>Declarative React in Action</h3>
92
93 <div style={{ marginBottom: '20px' }}>
94 <button
95 onClick={() => setIsVisible(!isVisible)}
96 style={{
97 padding: '10px 15px',
98 margin: '5px',
99 backgroundColor: '#4caf50',
100 color: 'white',
101 border: 'none',
102 borderRadius: '4px',
103 cursor: 'pointer'
104 }}
105 >
106 {isVisible ? 'Masquer' : 'Afficher'} la liste
107 </button>
108
109 <button
110 onClick={addItem}
111 style={{
112 padding: '10px 15px',
113 margin: '5px',
114 backgroundColor: '#2196f3',
115 color: 'white',
116 border: 'none',
117 borderRadius: '4px',
118 cursor: 'pointer'
119 }}
120 >
121 Ajouter un élément
122 </button>
123
124 <button
125 onClick={removeItem}
126 disabled={items.length === 0}
127 style={{
128 padding: '10px 15px',
129 margin: '5px',
130 backgroundColor: items.length === 0 ? '#ccc' : '#f44336',
131 color: 'white',
132 border: 'none',
133 borderRadius: '4px',
134 cursor: items.length === 0 ? 'not-allowed' : 'pointer'
135 }}
136 >
137 Supprimer un élément
138 </button>
139 </div>
140
141 {isVisible && (
142 <ul style={{
143 backgroundColor: 'white',
144 padding: '15px',
145 borderRadius: '4px',
146 listStyle: 'none'
147 }}>
148 {items.map((item, index) => (
149 <li key={index} style={{
150 padding: '8px',
151 margin: '5px 0',
152 backgroundColor: '#f0f0f0',
153 borderRadius: '4px'
154 }}>
155 {item}
156 </li>
157 ))}
158 {items.length === 0 && (
159 <li style={{
160 padding: '20px',
161 textAlign: 'center',
162 color: '#666',
163 fontStyle: 'italic'
164 }}>
165 La liste est vide
166 </li>
167 )}
168 </ul>
169 )}
170
171 <p style={{
172 marginTop: '15px',
173 fontSize: '14px',
174 color: '#666',
175 fontStyle: 'italic'
176 }}>
177 Remarque comme nous décrivons l'UI de façon déclarative : « si isVisible vaut true, affiche la liste »
178 </p>
179 </div>
180 );
181}
182
183export default function App() {
184 return (
185 <div style={{
186 fontFamily: 'Arial, sans-serif',
187 maxWidth: '900px',
188 margin: '0 auto',
189 padding: '20px'
190 }}>
191 <header style={{
192 textAlign: 'center',
193 marginBottom: '40px',
194 padding: '30px',
195 background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
196 color: 'white',
197 borderRadius: '12px'
198 }}>
199 <h1 style={{ margin: '0 0 10px 0', fontSize: '2.5rem' }}>L'histoire de React</h1>
200 <p style={{ margin: 0, fontSize: '1.1rem', opacity: 0.9 }}>
201 Un voyage à travers l'évolution de la bibliothèque JavaScript la plus populaire
202 </p>
203 </header>
204
205 <section style={{ marginBottom: '40px' }}>
206 <h2 style={{ color: '#333', borderBottom: '2px solid #667eea', paddingBottom: '10px' }}>
207 Moments clés de l'histoire de React
208 </h2>
209
210 <TimelineEvent
211 year="2011"
212 title="Naissance de FaxJS"
213 description="Chez Facebook, Jordan Walke crée une première version de React (alors appelée FaxJS), inspirée de XHP - un système de composants PHP."
214 />
215
216 <TimelineEvent
217 year="2013"
218 title="React passe en open source !"
219 description="Facebook publie React en tant que projet open source. Tom Occhino et Jordan Walke le présentent à la JSConf US."
220 isImportant={true}
221 />
222
223 <TimelineEvent
224 year="2015"
225 title="React Native"
226 description="Facebook présente React Native, permettant aux développeurs d'utiliser React pour créer des applications mobiles natives."
227 isImportant={true}
228 />
229
230 <TimelineEvent
231 year="2017"
232 title="React Fiber"
233 description="Réécriture complète du cœur de React (React 16) introduisant une nouvelle architecture de réconciliation appelée Fiber."
234 isImportant={true}
235 />
236
237 <TimelineEvent
238 year="2019"
239 title="React Hooks"
240 description="React 16.8 introduit les Hooks, révolutionnant la façon d'écrire les composants React et de gérer l'état."
241 isImportant={true}
242 />
243
244 <TimelineEvent
245 year="2022"
246 title="React 18"
247 description="Introduction des fonctionnalités concurrentes, du batching automatique, des améliorations de Suspense et de nouveaux hooks."
248 />
249
250 <TimelineEvent
251 year="2024"
252 title="React 19"
253 description="Server Components et Actions stables ; suppression d'API obsolètes comme ReactDOM.render."
254 isImportant={true}
255 />
256 </section>
257
258 <section style={{ marginBottom: '40px' }}>
259 <h2 style={{ color: '#333', borderBottom: '2px solid #667eea', paddingBottom: '10px' }}>
260 La philosophie de React
261 </h2>
262
263 <div style={{
264 display: 'grid',
265 gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))',
266 gap: '20px',
267 margin: '20px 0'
268 }}>
269 <PhilosophyCard
270 icon="◆"
271 title="Déclarativité"
272 description="Tu décris CE À QUOI l'UI doit ressembler dans un état donné, et non QUELLES étapes suivre pour y parvenir."
273 />
274
275 <PhilosophyCard
276 icon="◆"
277 title="Composabilité"
278 description="L'application est constituée de composants indépendants et réutilisables qui peuvent être composés ensemble."
279 />
280
281 <PhilosophyCard
282 icon="▼"
283 title="Flux unidirectionnel"
284 description="Les données circulent de haut en bas, rendant l'application prévisible et facile à déboguer."
285 />
286
287 <PhilosophyCard
288 icon="◆"
289 title="Apprends une fois, écris partout"
290 description="Les mêmes concepts fonctionnent sur le web, le mobile (React Native) et le bureau."
291 />
292 </div>
293 </section>
294
295 <DeclarativeExample />
296
297 <footer style={{
298 backgroundColor: '#f8f9fa',
299 padding: '20px',
300 borderRadius: '8px',
301 textAlign: 'center',
302 marginTop: '40px'
303 }}>
304 <h3 style={{ color: '#495057' }}>React aujourd'hui</h3>
305 <p style={{ color: '#6c757d', lineHeight: '1.6' }}>
306 React est utilisé par des millions de développeurs dans le monde, dans des entreprises telles que
307 Facebook, Netflix, Airbnb, Uber, WhatsApp, Instagram and thousands of others.
308 Son écosystème comprend des milliers de bibliothèques et d'outils, ce qui en fait l'une des
309 plateformes les plus puissantes pour construire des applications web modernes.
310 </p>
311 </footer>
312 </div>
313 );
314}Tu as repéré une erreur dans cette leçon ?