Étape 03
Prérequis
git checkout --force step-03
pnpm i
Description
Comment gérer les versions des paquets partagés via l'option shared ? Vous allez aider l'équipe Booklist à comprendre l'utilisation de l'option shared. (doc)
Exercice
Mise à jour de react
- Lancez le script
dev:
pnpm dev
A chaque modification de la configuration Webpack, il vous faudra relancer pnpm dev pour qu'elle soit prise en compte.
Ouvrez les devtools de votre navigateur sur l'onglet Network. Vous remarquerez que vos dépendances partagées (react, react-dom, react-query et react-dom-router) ne sont chargées qu'une seule fois depuis le host (localhost:3000). Les autres modules les réutilisent!
- Si vous regardez vos devtools, la version de
reactest la 18.1.0.
L'équipeBooklista à coeur d'avoir ses dépendances à jour et décide de mettre à jourreactà la version 18.2.0.
Commencez par mettre à jour la version de react de l'app Booklist :
"dependencies": {
"api": "workspace:*",
"classnames": "^2.3.2",
"css": "workspace:*",
"query-provider": "workspace:*",
- "react": "18.1.0",
- "react-dom": "18.1.0",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
"react-query": "^3.39.2",
"react-router-dom": "^6.4.2"
},
Installez à nouveau les dépendances : pnpm i.
L'équipe ne comprends pas encore le fonctionnement de l'option shared.
Elle repart d'une configuration simple en ne spécifiant que la requiredVersion.
Mettez à jour les requiredVersion dans Booklist :
'react': {
- requiredVersion: '^18.1.0',
+ requiredVersion: '^18.2.0',
},
'react-dom': {
- requiredVersion: '^18.1.0',
+ requiredVersion: '^18.2.0',
}
Exécutez à nouveau : pnpm dev
Depuis vos devtools, vous remarquerez que c'est toujours la version 18.2.0 qui est chargée mais depuis le remote Booklist (localhost:3001) cette fois-ci.
Module Federation utilise le Semantic Versionning pour récupérer la version compatible la plus à jour. Ici le Host Bookshelf enregistre dans le contexte partagé react:18.1.0 alors que Booklist enregistre react:18.2.0. Sachant que la dépendance react est spécifié via ^18.1.0 dans les shared, elle est compatible avec une montée de patch vers la version 18.2.0, c'est donc la version 18.2.0 de Booklist qui est utilisée.
- Fixez la version de
reactde manière strict dansBookshelf:
'react': {
- requiredVersion: '^18.1.0',
+ requiredVersion: '18.1.0',
},
'react-dom': {
- requiredVersion: '^18.1.0',
+ requiredVersion: '18.1.0',
}
Relancez pnpm dev.
Ouchh si vous ouvrez vos devtools vous verrez 2 versions de react téléchargées.
L'option singleton à la rescousse! Rajoutez la à la configuration de Bookshelf :
'react': {
+ singleton: true,
requiredVersion: '18.1.0',
},
'react-dom': {
+ singleton: true,
requiredVersion: '18.1.0',
},
On ne charge plus qu'une seule version de react.
L'option singleton utilise la version la plus élevée indépendamment du semantic versioning. Vous pouvez utiliser l'option strictVersion pour lancer une exception dès qu'il y a un mismatch de version.
reactest chargé depuis le remoteBooklist(localhost:3001). Si nous voulons utiliser la version du host quoiqu'il arrive nous pouvons utiliser la configuration suivante sur les remotesBooklistetBook:
'react': {
- requiredVersion: '^18.2.0',
+ singleton: true,
+ requiredVersion: false,
+ version: '0',
},
'react-dom': {
- requiredVersion: '^18.2.0',
+ singleton: true,
+ requiredVersion: false,
+ version: '0',
},
'react': {
- requiredVersion: '^18.1.0',
+ singleton: true,
+ requiredVersion: false,
+ version: '0',
},
'react-dom': {
- requiredVersion: '^18.1.0',
+ singleton: true,
+ requiredVersion: false,
+ version: '0',
},
En spécifiant version: '0', ils utiliseront désormais la version de react du host quoiqu'il arrive.
Partager le module api entre Book et Booklist
Depuis l'onglet Network des devtools, retrouvez le chargement du module Booklist. Vous y trouverez le chargement du package api ../../packages/api. Bizarrement (ou pas) vous retrouvez ces mêmes fichiers chargés séparément à la fois par le module Book et par le module Booklist qui l'utilisent tous les deux. Les équipes aimeraient ne pas avoir à re-télécharger le module une 2nde fois.
- Mettez à jour les configurations Webpack de
BooketBooklistpour ne charger qu'une seule fois le moduleapi:
+ 'api': {
+ singleton: true,
+ requiredVersion: false,
+ },
+ 'api': {
+ singleton: true,
+ requiredVersion: false,
+ },
- Rejouez
pnpm dev.
Testez l'application en ouvrant les devtools.apin'est chargé qu'une seule fois lorsque vous naviguez entre la pageBooket la pageBooklist.
Solution
Pour accéder à la solution :
git checkout --force step-03-result
Pour voir les changements :
git diff step-03..step-03-result
ou sur Github.