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
+172Lines changed: 172 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -704,4 +704,176 @@ Stockons le contenu suivant dans le fichier <i>db.json</i>:
704
704
}
705
705
```
706
706
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_:
<div>{notes.length} notes on server {url}</div>// highlight-line
747
+
</div>
748
+
)
749
+
}
750
+
751
+
exportdefaultApp
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
+
constpath=require('path')
760
+
761
+
constconfig= (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
+
constpath=require('path')
777
+
constwebpack=require('webpack') // highlight-line
778
+
779
+
constconfig= (env, argv) => {
780
+
console.log('argv', argv.mode)
781
+
782
+
// highlight-start
783
+
constbackend_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
+
newwebpack.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:
<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
+

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
+

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
+
importPromisePolyfillfrom'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/).
0 commit comments