Module Federation에 대해서 설명하기 위해서는 우선 Micro Frontend에 대해서 알아야 한다.

MFE는 프론트엔드 애플리케이션을 작은 독립적인 모듈로 분리하여 개발하고 관리하는 아키텍쳐로, 전체 시스템의 복잡성을 줄이고 생산성을 향상하는 데 도움이 된다.
여기에서 모듈이란 빌드할 때 사용하는 코드를 포함한 모든 리소스를 말한다. 즉, JS 뿐만 아니라 HTML, CSS, JSON, 각종 이미지 파일 등이 해당한다.
여러 개의 모듈들이 분리되어 독립적인 CI/CD를 진행하고 나면 하나의 웹 페이지로 조립하는 통합 과정이 필요하다.
통합 기법의 종류는 다음과 같다. (자세한 설명은 여기에서)
이 중 5번에 대해 알아보자.
자바스크립트를 통한 런타입 통합이란 웹 페이지를 불러온 시점에, 컨테이너 애플리케이션이 어떤 애플리케이션을 마운트할지 결정하고 관련 함수를 호출하여 애플리케이션에 렌더링할 시기와 위치를 알려주는 기법이다.
장점
단점
Module Federation은 바로 이 자바스크립트를 통한 런타임 통합 기법을 구현할 수 있는 방법 중 하나이다.
다시 말해서 Module Federation은 MFE를 구현하기 위한 방식들 중 하나로, 런타임에 통합되어 각 앱이 서로 코드를 공유할 수 있도록 하는 기능이다.
Webpack 5에서 처음 도입되었고 다음과 같은 특징이 있다.
주요 개념
공식문서: https://webpack.js.org/concepts/module-federation/
webpack.config.js
// remote
new ModuleFederationPlugin({
name: "appA",
filename: "remoteEntry.js",
exposes: {
"./Button": "./src/Button",
},
shared: ["react", "react-dom"],
}),
// host
new ModuleFederationPlugin({
name: "appB",
remotes: {
appA: "appA@http://localhost:3001/remoteEntry.js",
},
shared: ["react", "react-dom"],
}),
공유된 모듈 사용
import Button from 'appA/Button';
const Button = React.lazy(() => import('appA/Button')); // dynamic import
⚠️주의사항
런타임에서 모듈을 동적으로 로드해야 하기 때문에 dynamic import를 사용해야 한다. 일반 import를 사용한다면 Webpack이 빌드 시점에 모듈을 찾으려고 시도하기 때문에 에러가 발생할 수 있다.