inblog logo
|
cmun2
  • Typescript Study
  • Linkedin
MSA

Webpack5 Module Federation

MSA
Dragon C's avatar
Dragon C
May 11, 2023
Webpack5 Module Federation
Contents
Module FederationModule Federation의 필요성Module Federation 사용법주의할 점

Module Federation

  • Micro-Frontends 의 근간이 되는 기술

  • Webpack 5에 추가된 기능

  • 컴포넌트, 서비스 단위를 각각 빌드하고 런타임에 Host 애플리케이션에서 동적으로 실행할 수 있게 함

  • Webpack 설정 시 플러그인으로 import하여 사용할 수 있음

    • exposes: 외부에 노출할 원격 모듈

    • remotes: 사용할 원격 모듈을 설정

    • shared:

      • 공유 모듈로서 여러 컨테이너에서 같이 사용하며 런타임에 한 번만 로딩됨

      • 예) vue, react

Module Federation의 필요성

  • 빌드 및 배포 시간 감소

  • 검증 범위의 감소

  • 로딩 시간의 감소

Module Federation 사용법

  • Remote 앱

// vue.config.js
new webpack.container.ModuleFederationPlugin({
        name: "vueRemote",
        filename: "remoteEntry.js",
        remotes: {},
        exposes: {
          "./ComponentA.vue": "{path}/ComponentA.vue",
        },
        shared: {
          vue: {
            singleton: true,
          },
        },
      }),
  • Host 앱

// vue.config.js
new webpack.container.ModuleFederationPlugin({
        name: "host",
        filename: "remoteEntry.js",
        remotes: {
          vueRemote:
            "vueRemote@<https://localhost:8081/remoteEntry.js>",
        },
        exposes: {},
        shared: {
          vue: {
            singleton: true,
          },
        },
      }),
// Home.vue
<template>
	<ComponentA />
</template>
<script lang="ts>
...
components: {
	ComponentA: defineAsyncComponent(() => import("vueRemote/ComponentA.vue")),
},
...
</script>

주의할 점

  1. Typescript 사용 시 원격 모듈의 타입을 알기 어려우므로 타입 정의 파일(*.d.ts)을 별도로 정의해야 함

  2. 배포 시 remoteEntry.js의 경로

    1. local, dev, stage, production 별로 파일의 경로, URL이 다르므로 webpack 설정 파일을 분리하거나 환경 변수로 받아 빌드해야 함

  3. Entry를 비동기로 가져오는 것을 권장

    1. webpack에 설정하는 entry를 기존에 main.ts로 설정했었다면 index.ts에서 main.ts를 import하여 사용하는 방식 필요

    2. 비동기 컴포넌트(defineAsyncComponent) import 방식 사용

Share article
Contents
Module FederationModule Federation의 필요성Module Federation 사용법주의할 점

cmun2

RSS·Powered by Inblog