You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/7/fr/part7d.md
+317Lines changed: 317 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -385,6 +385,323 @@ Actuellement, nous utilisons le preset [@babel/preset-react](https://babeljs.io/
385
385
}
386
386
```
387
387
388
+
Ajoutons le plugin [@babel/preset-env](https://babeljs.io/docs/plugins/preset-env/) qui contient tout ce dont nous avons besoin pour prendre le code utilisant toutes les dernières fonctionnalités et le transpiler en code compatible avec la norme ES5:
Comme nous pouvons le voir, les variables sont déclarées avec le mot-clé _var_, car JavaScript ES5 ne comprend pas le mot-clé _const_. Les fonctions fléchées ne sont également pas utilisées, c'est pourquoi la définition de _fonction_ utilise le mot-clé function.
415
+
416
+
### CSS
417
+
418
+
Ajoutons du CSS à notre application. Créons un nouveau fichier <i>src/index.css</i>:
419
+
420
+
```css
421
+
.container {
422
+
margin: 10px;
423
+
background-color: #dee8e4;
424
+
}
425
+
```
426
+
427
+
Ensuite, utilisons le style dans le composant <i>App</i>:
428
+
429
+
```js
430
+
constApp= () => {
431
+
return (
432
+
<div className="container">
433
+
hello webpack
434
+
</div>
435
+
)
436
+
}
437
+
```
438
+
439
+
Et nous importons le style dans le fichier <i>index.js</i>:
440
+
441
+
```js
442
+
import'./index.css'
443
+
```
444
+
445
+
Cela provoquera l'échec du processus de transpilation:
446
+
447
+

448
+
449
+
Lors de l'utilisation de CSS, nous devons utiliser les chargeurs [css](https://webpack.js.org/loaders/css-loader/) et [style](https://webpack.js.org/loaders/style-loader/):
Le rôle du [css loader](https://webpack.js.org/loaders/css-loader/) est de charger les fichiers <i>CSS</i> et celui du [style loader](https://webpack.js.org/loaders/style-loader/) est de générer et d'injecter un élément <i>style</i> contenant tous les styles de l'application.
472
+
473
+
Avec cette configuration, les définitions CSS sont incluses dans le fichier <i>main.js</i> de l'application. Pour cette raison, il n'est pas nécessaire d'importer séparément les styles <i>CSS</i> dans le fichier principal <i>index.html</i> de l'application.
474
+
475
+
Si nécessaire, le CSS de l'application peut également être généré dans son propre fichier séparé en utilisant le [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin).
476
+
477
+
Lorsque nous installons les chargeurs:
478
+
479
+
```bash
480
+
npm install style-loader css-loader --save-dev
481
+
```
482
+
483
+
L'empaquetage réussira à nouveau et l'application recevra de nouveaux styles.
484
+
485
+
### Webpack-dev-server
486
+
487
+
La configuration actuelle permet de développer notre application, mais le flux de travail est terrible (au point qu'il ressemble au flux de travail de développement avec Java). Chaque fois que nous apportons un changement au code, nous devons l'empaqueter et rafraîchir le navigateur pour tester le code.
488
+
489
+
Le [webpack-dev-server](https://webpack.js.org/guides/development/#using-webpack-dev-server) offre une solution à nos problèmes. Installons-le avec la commande:
490
+
491
+
```js
492
+
npm install --save-dev webpack-dev-server
493
+
```
494
+
495
+
Définissons un script npm pour démarrer le serveur de développement:
Ajoutons également une nouvelle propriété <i>devServer</i> à l'objet de configuration dans le fichier <i>webpack.config.js</i>:
509
+
510
+
```js
511
+
constconfig= {
512
+
entry:'./src/index.js',
513
+
output: {
514
+
path:path.resolve(__dirname, 'build'),
515
+
filename:'main.js',
516
+
},
517
+
// highlight-start
518
+
devServer: {
519
+
static:path.resolve(__dirname, 'build'),
520
+
compress:true,
521
+
port:3000,
522
+
},
523
+
// highlight-end
524
+
// ...
525
+
};
526
+
```
527
+
528
+
La commande _npm start_ va maintenant démarrer le serveur de développement sur le port 3000, ce qui signifie que notre application sera accessible en visitant <http://localhost:3000> dans le navigateur. Lorsque nous apportons des modifications au code, le navigateur rafraîchira automatiquement la page.
529
+
530
+
Le processus de mise à jour du code est rapide. Lorsque nous utilisons le serveur de développement, le code n'est pas empaqueté de la manière habituelle dans le fichier <i>main.js</i>. Le résultat de l'empaquetage existe uniquement en mémoire.
531
+
532
+
Étendons le code en changeant la définition du composant <i>App</i> comme indiqué ci-dessous:
533
+
534
+
```js
535
+
importReact, { useState } from'react'
536
+
import'./index.css'
537
+
538
+
constApp= () => {
539
+
const [counter, setCounter] =useState(0)
540
+
541
+
return (
542
+
<div className="container">
543
+
hello webpack {counter} clicks
544
+
<button onClick={() =>setCounter(counter +1)}>
545
+
press
546
+
</button>
547
+
</div>
548
+
)
549
+
}
550
+
551
+
exportdefaultApp
552
+
```
553
+
554
+
L'application fonctionne bien et le flux de travail de développement est assez fluide.
555
+
556
+
### Cartes sources (Source maps)
557
+
558
+
Extrayons le gestionnaire de clic dans sa propre fonction et stockons la valeur précédente du compteur dans son propre état <i>values</i>:
L'application ne fonctionne plus et la console affichera l'erreur suivante :
584
+
585
+

586
+
587
+
Nous savons que l'erreur se trouve dans la méthode onClick, mais si l'application était plus grande, le message d'erreur serait assez difficile à localiser:
588
+
589
+
<pre>
590
+
App.js:27 Uncaught TypeError: Cannot read property 'concat' of undefined
591
+
at handleClick (App.js:27)
592
+
</pre>
593
+
594
+
L'emplacement de l'erreur indiqué dans le message ne correspond pas à l'emplacement réel de l'erreur dans notre code source. Si nous cliquons sur le message d'erreur, nous remarquons que le code source affiché ne ressemble pas à notre code d'application:
595
+
596
+

597
+
598
+
Bien sûr, nous voulons voir notre véritable code source dans le message d'erreur.
599
+
600
+
Heureusement, corriger le message d'erreur à cet égard est assez facile. Nous demanderons à webpack de générer une soi-disant [carte source](https://webpack.js.org/configuration/devtool/) pour le bundle, ce qui rend possible de <i>mapper les erreurs</i> qui surviennent pendant l'exécution du bundle à la partie correspondante dans le code source original.
601
+
602
+
La carte source peut être générée en ajoutant une nouvelle propriété <i>devtool</i> à l'objet de configuration avec la valeur 'source-map':
603
+
604
+
```js
605
+
constconfig= {
606
+
entry:'./src/index.js',
607
+
output: {
608
+
// ...
609
+
},
610
+
devServer: {
611
+
// ...
612
+
},
613
+
devtool:'source-map', // highlight-line
614
+
// ..
615
+
};
616
+
```
617
+
618
+
Webpack doit être redémarré lorsque nous apportons des modifications à sa configuration. Il est également possible de faire en sorte que webpack surveille les modifications apportées à lui-même, mais nous ne le ferons pas cette fois.
619
+
620
+
Le message d'erreur est maintenant beaucoup mieux
621
+
622
+

623
+
624
+
puisqu'il se réfère au code que nous avons écrit:
625
+
626
+

627
+
628
+
Générer la carte source permet également d'utiliser le débogueur Chrome:
629
+
630
+

631
+
632
+
Corrigeons le bug en initialisant l'état de <i>values</i> comme un tableau vide:
633
+
634
+
```js
635
+
constApp= () => {
636
+
const [counter, setCounter] =useState(0)
637
+
const [values, setValues] =useState([])
638
+
// ...
639
+
}
640
+
```
641
+
642
+
### Minification du code
643
+
644
+
Lorsque nous déployons l'application en production, nous utilisons le bundle de code <i>main.js</i> généré par webpack. La taille du fichier <i>main.js</i> est de 1009487 octets même si notre application ne contient que quelques lignes de notre code. La grande taille du fichier est due au fait que le bundle contient également le code source de toute la bibliothèque React. La taille du code empaqueté est importante car le navigateur doit charger le code lorsque l'application est utilisée pour la première fois. Avec des connexions internet à haute vitesse, 1009487 octets ne posent pas de problème, mais si nous continuons à ajouter plus de dépendances externes, la vitesse de chargement pourrait devenir un problème, en particulier pour les utilisateurs mobiles.
645
+
646
+
Si nous inspectons le contenu du fichier bundle, nous remarquons qu'il pourrait être grandement optimisé en termes de taille de fichier en supprimant tous les commentaires. Il n'est pas utile d'optimiser manuellement ces fichiers, car il existe de nombreux outils pour cela.
647
+
648
+
Le processus d'optimisation pour les fichiers JavaScript s'appelle la <i>minification</i>. L'un des outils principaux destinés à cet effet est [UglifyJS](http://lisperator.net/uglifyjs/).
649
+
650
+
À partir de la version 4 de webpack, le plugin de minification ne nécessite pas de configuration supplémentaire pour être utilisé. Il suffit de modifier le script npm dans le fichier <i>package.json</i> pour spécifier que webpack exécutera l'empaquetage du code en mode <i>production</i>:
Lorsque nous empaquetons à nouveau l'application, la taille du fichier <i>main.js</i> résultant diminue considérablement:
672
+
673
+
```bash
674
+
$ ls -l build/main.js
675
+
-rw-r--r-- 1 mluukkai ATKK\hyad-all 227651 Feb 7 15:58 build/main.js
676
+
```
677
+
678
+
Le résultat du processus de minification ressemble à du code C à l'ancienne; tous les commentaires et même les espaces blancs inutiles et les caractères de nouvelle ligne ont été supprimés, et les noms de variables ont été remplacés par un seul caractère.
0 commit comments