L'host importe dynamiquement les modules du remote. Il n'y a pas de contrôle sur ce qui est importé au build time. Par conséquent on peut découvrir des erreurs au runtime !
Bien définir des contrats d'interface !
L'architecture monorepo est, je pense, à conseiller dans le cas d'un microfrontend. Il faut cependant un gitflow solide.
2011 Arrivée de l'architecture Microservices
Grand succès, sauf que cette architecture traite principalement d'aspect back-end.
2016 Première apparition du mot Microfrontend
Définition
Avec le microfrontend il est possible d'avoir un écran découpé en plusieurs applications (de techno différentes ou non) qui discutent avec différents microfrontend (ou non)
On peut aussi imaginer un microfrontend ou c'est pas "l’écran" qui est découpé mais les différentes routes.
Web4g ?
La difference est essentiellement pour le dev. Il y a donc un changement de paradigme sur les serveurs de développements. Le temps de démarrage est très très rapide.
Pour le build en production, Vite utilise rollup (un module bundler comme webpack). Webpack est basé sur CommonJS quand rollup réfère à ES Module.
Créer un fichier **bootstrap.tsx**
```tsx
import { createRoot } from "react-dom/client";
import { RouterProvider } from "react-router-dom";
import { createRouter } from "./routing/router-factory";
import type { RoutingStrategy } from "./routing/types";
const mount = ({
mountPoint,
initialPathname,
routingStrategy,
}: {
mountPoint: HTMLElement;
initialPathname?: string;
routingStrategy?: RoutingStrategy;
}) => {
const router = createRouter({ strategy: routingStrategy, initialPathname });
const root = createRoot(mountPoint);
root.render(<RouterProvider router={router} />);
return () => queueMicrotask(() => root.unmount());
};
export { mount };
```
---
**routing/router-factory.ts**
```ts
import { createBrowserRouter, createMemoryRouter } from "react-router-dom";
import { routes } from "./routes";
import type { RoutingStrategy } from "./types";
interface CreateRouterProps {
strategy?: RoutingStrategy;
initialPathname?: string;
}
export function createRouter({ strategy, initialPathname }: CreateRouterProps) {
if (strategy === "browser") {
return createBrowserRouter(routes);
}
const initialEntries = [initialPathname || "/"];
return createMemoryRouter(routes, { initialEntries: initialEntries });
}
```
---
**routing/routes.tsx**
Le fichier root.tsx sans le browserRouter et renommage _*router*_ en routes.
```tsx
import App from "App";
export const routes = [
{ path: "/remote-routes", element: <div>Test router in remote </div> },
{ path: "/", element: <App /> },
];
```
---
Dans le **main.tsx**
```tsx
import "./index.css";
import("./bootstrap").then(({ mount }) => {
const localRoot = document.getElementById("root") as HTMLElement;
mount({
mountPoint: localRoot!,
routingStrategy: "browser",
});
});
export {};
```
---
# On test que le remote n'est pas cassé
```bash
yarn dev:remote
yarn build:remote
yarn serve:remote
```
http://localhost:5001/remote-routes
Tout à l'air ok !
---
# On modifie l'export
```ts
"./remoteApp": "./src/bootstrap.tsx"
```
---