Microservices nowadays is a well-known concept and maybe you are using it in your current company. Do you know that now you can apply similar ideas on the Frontend? With Module Federation you can load separately compiled and deployed code into a unique application. This plugin makes Module Federation work together with Vite.
pnpm install && pnpm run dev-vv # vite+vite dev demo
pnpm install && pnpm run preview-vv # vite+vite build demo
https://module-federation.io/guide/basic/webpack.html
With @module-federation/vite, the process becomes delightfully simple, you will only find the differences from a normal Vite configuration.
This example is with Vue.js The @module-federation/vite configuration remains the same for different frameworks.
file: remote/vite.config.ts
import { defineConfig } from 'vite';
import { federation } from '@module-federation/vite'; 👈
export default defineConfig({
[...]
plugins: [
[...]
federation({ 👈
name: "remote",
filename: "remoteEntry.js",
exposes: {
"./remote-app": "./src/App.vue",
},
shared: ["vue"],
}),
]
[...]
});
In this remote app configuration, we define a remoteEntry.js file that will expose the App component. The shared property ensures that both host and remote applications use the same vue library.
file host/vite.config.ts
import { defineConfig } from 'vite';
import { federation } from '@module-federation/vite'; 👈
export default defineConfig({
[...]
plugins: [
[...]
federation({ 👈
name: "host",
remotes: {
remote: {
type: "module",
name: "remote",
entry: "https://[...]/remoteEntry.js",
entryGlobalName: "remote",
shareScope: "default",
},
},
filename: "remoteEntry.js",
shared: ["vue"],
}),
]
[...]
});
The host app configuration specifies its name, the filename of its exposed remote entry remoteEntry.js, and importantly, the configuration of the remote application to load.
In your host app, you can now import and use the remote app with defineAsyncComponent
file host/src/App.vue
<script setup lang="ts">
import { defineAsyncComponent } from "vue";
const RemoteMFE = defineAsyncComponent( 👈
() => import("remote/remote-app")
);
</script>
<template>
<RemoteMFE v-if="!!RemoteMFE" /> 👈
</template>
Now you are ready to use Module Federation in Vite!