Skip to content

Commit 91e6e8e

Browse files
committed
Translation in french part7d line 705
1 parent 0baf546 commit 91e6e8e

File tree

1 file changed

+317
-0
lines changed

1 file changed

+317
-0
lines changed

src/content/7/fr/part7d.md

Lines changed: 317 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,323 @@ Actuellement, nous utilisons le preset [@babel/preset-react](https://babeljs.io/
385385
}
386386
```
387387

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:
388389

390+
```js
391+
{
392+
test: /\.js$/,
393+
loader: 'babel-loader',
394+
options: {
395+
presets: ['@babel/preset-env', '@babel/preset-react'] // highlight-line
396+
}
397+
}
398+
```
399+
400+
Installons le preset avec la commande:
401+
402+
```bash
403+
npm install @babel/preset-env --save-dev
404+
```
405+
406+
Lorsque nous transpilons le code, il est transformé en JavaScript à l'ancienne. La définition du composant <i>App</i> transformé ressemble à ceci:
407+
408+
```js
409+
var App = function App() {
410+
return _react2.default.createElement('div', null, 'hello webpack')
411+
};
412+
```
413+
414+
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+
const App = () => {
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+
![échec de webpack manquant chargeur pour css/style](../../images/7/23x.png)
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/):
450+
451+
```js
452+
{
453+
rules: [
454+
{
455+
test: /\.js$/,
456+
loader: 'babel-loader',
457+
options: {
458+
presets: ['@babel/preset-react', '@babel/preset-env'],
459+
},
460+
},
461+
// highlight-start
462+
{
463+
test: /\.css$/,
464+
use: ['style-loader', 'css-loader'],
465+
},
466+
// highlight-end
467+
],
468+
}
469+
```
470+
471+
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:
496+
497+
```js
498+
{
499+
// ...
500+
"scripts": {
501+
"build": "webpack --mode=development",
502+
"start": "webpack serve --mode=development" // highlight-line
503+
},
504+
// ...
505+
}
506+
```
507+
508+
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+
const config = {
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+
import React, { useState } from 'react'
536+
import './index.css'
537+
538+
const App = () => {
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+
export default App
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>:
559+
560+
```js
561+
const App = () => {
562+
const [counter, setCounter] = useState(0)
563+
const [values, setValues] = useState() // highlight-line
564+
565+
//highlight-start
566+
const handleClick = () => {
567+
setCounter(counter + 1)
568+
setValues(values.concat(counter))
569+
}
570+
//highlight-end
571+
572+
return (
573+
<div className="container">
574+
hello webpack {counter} clicks
575+
<button onClick={handleClick}> // highlight-line
576+
press
577+
</button>
578+
</div>
579+
)
580+
}
581+
```
582+
583+
L'application ne fonctionne plus et la console affichera l'erreur suivante :
584+
585+
![console devtools ne peut pas concaténer sur undefined dans handleClick](../../images/7/25.png)
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+
![la source devtools n'affiche pas notre code source](../../images/7/26.png)
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+
const config = {
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+
![console devtools montrant une erreur de concat à une ligne différente](../../images/7/27.png)
623+
624+
puisqu'il se réfère au code que nous avons écrit:
625+
626+
![source devtools montrant notre vrai code avec values.concat](../../images/7/27eb.png)
627+
628+
Générer la carte source permet également d'utiliser le débogueur Chrome:
629+
630+
![débogueur devtools en pause juste avant la ligne en cause](../../images/7/28.png)
631+
632+
Corrigeons le bug en initialisant l'état de <i>values</i> comme un tableau vide:
633+
634+
```js
635+
const App = () => {
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>:
651+
652+
```json
653+
{
654+
"name": "webpack-part7",
655+
"version": "0.0.1",
656+
"description": "practising webpack",
657+
"scripts": {
658+
"build": "webpack --mode=production", // highlight-line
659+
"start": "webpack serve --mode=development"
660+
},
661+
"license": "MIT",
662+
"dependencies": {
663+
// ...
664+
},
665+
"devDependencies": {
666+
// ...
667+
}
668+
}
669+
```
670+
671+
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.
679+
680+
```js
681+
function h(){if(!d){var e=u(p);d=!0;for(var t=c.length;t;){for(s=c,c=[];++f<t;)s&&s[f].run();f=-1,t=c.length}s=null,d=!1,function(e){if(o===clearTimeout)return clearTimeout(e);if((o===l||!o)&&clearTimeout)return o=clearTimeout,clearTimeout(e);try{o(e)}catch(t){try{return o.call(null,e)}catch(t){return o.call(this,e)}}}(e)}}a.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)
682+
```
683+
684+
### Configuration de développement et de production
685+
686+
Ensuite, ajoutons un backend à notre application en réutilisant le backend de l'application de notes désormais familier.
687+
688+
Stockons le contenu suivant dans le fichier <i>db.json</i>:
689+
690+
```json
691+
{
692+
"notes": [
693+
{
694+
"important": true,
695+
"content": "HTML is easy",
696+
"id": "5a3b8481bb01f9cb00ccb4a9"
697+
},
698+
{
699+
"important": false,
700+
"content": "Mongo can save js objects",
701+
"id": "5a3b920a61e8c8d3f484bdd0"
702+
}
703+
]
704+
}
705+
```
389706
390707
</div>

0 commit comments

Comments
 (0)