Étape 01
Prérequis
git checkout --force step-01
pnpm i
Description
L'application de Bookshelf grossit et nous avons désormais 2 équipes travaillant sur le projet, une pour la vue liste et une pour la vue de détails d'un roman.
Pour augmenter l'autonomie et la productivité de ces équipes, nous allons mettre en place Module Federation.
Exercice
Charger le composant Booklist via Module Federation.
Dans packages/booklist :
- Ajoutez le script
devdans lepackage.json. Nous avons déjà ajouté les devDependencies pour webpack.
"scripts": {
+ "dev": "webpack serve",
"lint": "eslint src/",
"tscheck": "tsc --noEmit"
},
- Créez un fichier
webpack.config.js.
const {createConfig} = require('webpack-config')
const {ModuleFederationPlugin} = require('webpack').container
module.exports = createConfig('Booklist', {
output: {
// Voir https://webpack.js.org/concepts/module-federation/#infer-publicpath-from-script
publicPath: 'auto',
},
devServer: {
// Nous utilisons un port différent que Bookshelf afin de lancer tous les serveurs de dev en parallèle
port: 3001,
},
plugins: [
new ModuleFederationPlugin({
name: 'TODO',
filename: 'TODO',
exposes: {
TODO: 'TODO',
},
shared: {
'react': {
singleton: true,
requiredVersion: '18.1.0',
},
'react-dom': {
singleton: true,
requiredVersion: '18.1.0',
},
'react-router-dom': {
singleton: true,
requiredVersion: '^6.4.2',
},
'react-query': {
singleton: true,
requiredVersion: '^3.39.2',
},
},
}),
],
})
webpack-config est un package interne fournissant une configuration Webpack par défaut.
Vous pouvez la surcharger en passant à la fonction createConfig une config Webpack en second paramètre.
Le merge est effectué à l'aide de webpack-merge.
- Configurez le plugin Module Federation dans le fichier
packages/booklist/webpack.config.jsen remplaçant les TODO.booklistest un remote module qui doit exposer le composantBooklist.
Aidez-vous de l'exemple situé ici.
Dans apps/bookshelf :
- Supprimez la dépendance
booklist, vous n'en aurez plus besoin !
Puis rejouez la commandepnpm ipour appliquer la suppression.
"dependencies": {
"book": "workspace:*",
- "booklist": "workspace:*",
"css": "workspace:*",
"query-provider": "workspace:*",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-query": "^3.39.2",
"react-router-dom": "^6.4.2"
},
Configurez le plugin Module Federation dans le fichier
apps/bookshelf/webpack.config.jsen remplaçant les TODO.
Il s'agit du host qui va utiliser le remote modulebooklist.
Aidez-vous de l'exemple situé ici.Modifiez l'import vers le composant
Booklistdans le fichierapp/bookshelf/src/App.tsx.
Aidez-vous de l'exemple situé ici.
Typescript ne sera pas content, ajouter un// @ts-ignore, nous y reviendrons plus tard 😉
Vérifier que tout fonctionne
- Jouez la commande
pnpm dev, elle va lancer les scriptsdevdebookshelfetbooklist. - Vérifiez que l'application fonctionne à l'adresse suivante : http://localhost:3000. Si ce n'est pas le cas, vérifiez votre configuration et ce schéma.
- Dans vos devtools, onglet Network, regardez les fichiers JS chargés.
Le composant
Booklistest chargé depuis le port 3001.
Bonus 01
Charger le composant Book via Module Federation.
Bonus 02
Charger les composants Booklist et Book en asynchrone (hint: React.lazy).
Bonus 03
Récupérer les versions des librairies shared depuis le package.json.
Solution
Pour accéder à la solution :
git checkout --force step-01-result
Pour voir les changements :
git diff step-01..step-01-result
ou sur Github.