Skip to content

Commit effadc8

Browse files
committed
Translation in french part7d
1 parent 91e6e8e commit effadc8

File tree

1 file changed

+172
-0
lines changed

1 file changed

+172
-0
lines changed

src/content/7/fr/part7d.md

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,4 +704,176 @@ Stockons le contenu suivant dans le fichier <i>db.json</i>:
704704
}
705705
```
706706
707+
Notre objectif est de configurer l'application avec webpack de telle manière que, lorsqu'elle est utilisée localement, l'application utilise le json-server disponible sur le port 3001 comme backend.
708+
709+
Le fichier empaqueté sera ensuite configuré pour utiliser le backend disponible à l'URL <https://notes2023.fly.dev/api/notes>.
710+
711+
Nous installerons <i>axios</i>, démarrerons le json-server, puis apporterons les modifications nécessaires à l'application. Pour varier un peu les choses, nous récupérerons les notes du backend avec notre [hook personnalisé](/en/part7/custom_hooks) appelé _useNotes_:
712+
713+
```js
714+
// highlight-start
715+
import React, { useState, useEffect } from 'react'
716+
import axios from 'axios'
717+
718+
const useNotes = (url) => {
719+
const [notes, setNotes] = useState([])
720+
721+
useEffect(() => {
722+
axios.get(url).then(response => {
723+
setNotes(response.data)
724+
})
725+
}, [url])
726+
727+
return notes
728+
}
729+
// highlight-end
730+
731+
const App = () => {
732+
const [counter, setCounter] = useState(0)
733+
const [values, setValues] = useState([])
734+
const url = 'https://notes2023.fly.dev/api/notes' // highlight-line
735+
const notes = useNotes(url) // highlight-line
736+
737+
const handleClick = () => {
738+
setCounter(counter + 1)
739+
setValues(values.concat(counter))
740+
}
741+
742+
return (
743+
<div className="container">
744+
hello webpack {counter} clicks
745+
<button onClick={handleClick}>press</button>
746+
<div>{notes.length} notes on server {url}</div> // highlight-line
747+
</div>
748+
)
749+
}
750+
751+
export default App
752+
```
753+
754+
L'adresse du serveur backend est actuellement codée en dur dans le code de l'application. Comment pouvons-nous changer l'adresse de manière contrôlée pour qu'elle pointe vers le serveur backend de production lorsque le code est empaqueté pour la production ?
755+
756+
La fonction de configuration de Webpack a deux paramètres, <i>env</i> et <i>argv</i>. Nous pouvons utiliser ce dernier pour connaître le <i>mode</i> défini dans le script npm:
757+
758+
```js
759+
const path = require('path')
760+
761+
const config = (env, argv) => { // highlight-line
762+
console.log('argv.mode:', argv.mode)
763+
return {
764+
// ...
765+
}
766+
}
767+
768+
module.exports = config
769+
```
770+
771+
Maintenant, si nous le souhaitons, nous pouvons configurer Webpack pour fonctionner différemment selon que l'environnement d'exploitation de l'application, ou <i>mode</i>, est défini sur production ou développement.
772+
773+
Nous pouvons également utiliser le [DefinePlugin](https://webpack.js.org/plugins/define-plugin/) de webpack pour définir des <i>constantes globales par défaut</i> qui peuvent être utilisées dans le code empaqueté. Définissons une nouvelle constante globale <i>BACKEND\_URL</i> qui obtient une valeur différente selon l'environnement pour lequel le code est empaqueté:
774+
775+
```js
776+
const path = require('path')
777+
const webpack = require('webpack') // highlight-line
778+
779+
const config = (env, argv) => {
780+
console.log('argv', argv.mode)
781+
782+
// highlight-start
783+
const backend_url = argv.mode === 'production'
784+
? 'https://notes2023.fly.dev/api/notes'
785+
: 'http://localhost:3001/notes'
786+
// highlight-end
787+
788+
return {
789+
entry: './src/index.js',
790+
output: {
791+
path: path.resolve(__dirname, 'build'),
792+
filename: 'main.js'
793+
},
794+
devServer: {
795+
static: path.resolve(__dirname, 'build'),
796+
compress: true,
797+
port: 3000,
798+
},
799+
devtool: 'source-map',
800+
module: {
801+
// ...
802+
},
803+
// highlight-start
804+
plugins: [
805+
new webpack.DefinePlugin({
806+
BACKEND_URL: JSON.stringify(backend_url)
807+
})
808+
]
809+
// highlight-end
810+
}
811+
}
812+
813+
module.exports = config
814+
```
815+
816+
La constante globale est utilisée de la manière suivante dans le code:
817+
818+
```js
819+
const App = () => {
820+
const [counter, setCounter] = useState(0)
821+
const [values, setValues] = useState([])
822+
const notes = useNotes(BACKEND_URL) // highlight-line
823+
824+
// ...
825+
return (
826+
<div className="container">
827+
hello webpack {counter} clicks
828+
<button onClick={handleClick} >press</button>
829+
<div>{notes.length} notes on server {BACKEND_URL}</div> // highlight-line
830+
</div>
831+
)
832+
}
833+
```
834+
835+
Si la configuration pour le développement et la production diffère beaucoup, il peut être judicieux de [séparer la configuration](https://webpack.js.org/guides/production/) des deux dans leurs propres fichiers.
836+
837+
Maintenant, si l'application est lancée avec la commande npm start en mode développement, elle récupère les notes depuis l'adresse <http://localhost:3001/notes>. La version empaquetée avec la commande _npm run build_ utilise l'adresse <https://notes2023.fly.dev/api/notes> pour obtenir la liste des notes.
838+
839+
Nous pouvons inspecter localement la version de production empaquetée de l'application en exécutant la commande suivante dans le répertoire <i>build</i>:
840+
841+
```bash
842+
npx static-server
843+
```
844+
845+
Par défaut, l'application empaquetée sera disponible à <http://localhost:9080>.
846+
847+
### Polyfill
848+
849+
Notre application est terminée et fonctionne avec toutes les versions relativement récentes des navigateurs modernes, à l'exception d'Internet Explorer. La raison en est que, à cause d'axios, notre code utilise les [Promesses](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), et aucune version existante d'IE ne les prend en charge:
850+
851+
![tableau de compatibilité des navigateurs soulignant à quel point Internet Explorer est mauvais](../../images/7/29.png)
852+
853+
Il y a beaucoup d'autres choses dans la norme qu'IE ne prend pas en charge. Quelque chose d'aussi inoffensif que la méthode [find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find) des tableaux JavaScript dépasse les capacités d'IE:
854+
855+
![tableau de compatibilité des navigateurs montrant qu'IE ne prend pas en charge la méthode find](../../images/7/30.png)
856+
857+
Dans ces situations, il ne suffit pas de transpiler le code, car la transpilation transforme simplement le code d'une version plus récente de JavaScript en une version plus ancienne avec une prise en charge plus large par les navigateurs. IE comprend syntaxiquement les Promesses mais n'a tout simplement pas implémenté leur fonctionnalité. La propriété find des tableaux dans IE est simplement <i>undefined</i>.
858+
859+
Si nous voulons que l'application soit compatible avec IE, nous devons ajouter un [polyfill](https://remysharp.com/2010/10/08/what-is-a-polyfill), qui est un code qui ajoute la fonctionnalité manquante aux navigateurs plus anciens.
860+
861+
Les polyfills peuvent être ajoutés à l'aide de [webpack et Babel](https://babeljs.io/docs/usage/polyfill/) ou en installant l'une des nombreuses bibliothèques de polyfill existantes.
862+
863+
Le polyfill fourni par la bibliothèque [promise-polyfill](https://www.npmjs.com/package/promise-polyfill) est facile à utiliser. Nous devons simplement ajouter ce qui suit à notre code d'application existant:
864+
865+
```js
866+
import PromisePolyfill from 'promise-polyfill'
867+
868+
if (!window.Promise) {
869+
window.Promise = PromisePolyfill
870+
}
871+
```
872+
873+
Si l'objet global _Promise_ n'existe pas, ce qui signifie que le navigateur ne prend pas en charge les Promesses, la Promise polyfillée est stockée dans la variable globale. Si la Promise polyfillée est suffisamment bien implémentée, le reste du code devrait fonctionner sans problèmes.
874+
875+
Une liste exhaustive des polyfills existants peut être trouvée [ici](https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills).
876+
877+
La compatibilité des différents API avec les navigateurs peut être vérifiée en visitant [https://caniuse.com](https://caniuse.com) ou le site web de [Mozilla](https://developer.mozilla.org/en-US/).
878+
707879
</div>

0 commit comments

Comments
 (0)