Module Federation — механизм, представленный в Webpack 5, который позволяет приложениям динамически обмениваться модулями во время выполнения. В контексте Preact это открывает возможности для построения микрофронтендов, когда разные части интерфейса могут быть загружены из отдельных сборок без необходимости объединять весь код на этапе сборки.
Remote и Host приложения
Динамическая загрузка Module Federation позволяет подключать компоненты или библиотеки по URL в рантайме, что сокращает время сборки и снижает дублирование кода.
Совместное использование зависимостей Общие
зависимости (например, preact и preact/hooks)
могут быть вынесены в shared, чтобы избежать дублирования и
уменьшить размер бандла.
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
const path = require("path");
module.exports = {
mode: "development",
entry: "./src/index.js",
output: {
publicPath: "http://localhost:3001/",
},
plugins: [
new ModuleFederationPlugin({
name: "remoteApp",
filename: "remoteEntry.js",
exposes: {
"./Button": "./src/components/Button",
},
shared: {
preact: {
singleton: true,
requiredVersion: "^10.5.14"
},
"preact/hooks": {
singleton: true,
requiredVersion: "^10.5.14"
}
}
})
],
resolve: {
extensions: [".js", ".jsx"],
alias: {
react: "preact/compat",
"react-dom": "preact/compat"
}
}
};
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
module.exports = {
mode: "development",
entry: "./src/index.js",
output: {
publicPath: "http://localhost:3000/",
},
plugins: [
new ModuleFederationPlugin({
name: "hostApp",
remotes: {
remoteApp: "remoteApp@http://localhost:3001/remoteEntry.js",
},
shared: {
preact: {
singleton: true,
requiredVersion: "^10.5.14"
},
"preact/hooks": {
singleton: true,
requiredVersion: "^10.5.14"
}
}
})
],
resolve: {
extensions: [".js", ".jsx"],
alias: {
react: "preact/compat",
"react-dom": "preact/compat"
}
}
};
После настройки Module Federation можно динамически импортировать
компоненты из remote-приложения. Например, использование
Button из remoteApp:
import { h } from 'preact';
import { lazy, Suspense } from 'preact/compat';
const RemoteButton = lazy(() => import("remoteApp/Button"));
export default function App() {
return (
<div>
<h1>Пример Preact с Module Federation</h1>
<Suspense fallback={<div>Загрузка кнопки...</div>}>
<RemoteButton />
</Suspense>
</div>
);
}
preact/compat с
Preact и при интеграции с внешними микрофронтендами.preact/compat с
React-плагинами Module Federation облегчает миграцию с React на
Preact.useState, useEffect)
работают корректно при использовании remote-компонентов, если версии
Preact и preact/hooks синхронизированы.shared
обязательно.preact/compat для корректного использования React-подобных
функций.Module Federation с Preact идеально подходит для крупных проектов, где интерфейс делится на независимые модули. Это позволяет:
Использование Module Federation в Preact создаёт гибкую архитектуру микрофронтендов, оптимизируя как процесс разработки, так и производительность конечного приложения.