Module Federation 2.0 개선점들

런타임 분리

(MF 생태계에서 런타임이란, 원격 모듈을 실제로 불러오고 실행하는 역할을 담당하는 코드를 의미함)

[웹팩] ──── 강하게 결합 ──── [런타임]
   └─ 빌드할 때 런타임 코드가 웹팩에 내장됨
   └─ 다른 빌드 도구 사용 어려움
[빌드 도구들]  ────  독립적  ──── [@module-federation/enhanced/runtime]
웹팩                                        └─ 모듈 로딩
Rspack                                      └─ 의존성 관리
기타 도구들                                  └─ 공유 모듈 처리
// 이제는 런타임을 직접 제어할 수 있음
import { init, loadRemote } from '@module-federation/enhanced/runtime';

// 런타임 설정을 자유롭게 할 수 있음
init({
  name: '@demo/app-main',
  remotes: [
    // 웹팩으로 빌드된 모듈도 로드 가능
    {
      name: "@demo/app1",
      entry: "http://localhost:3005/mf-manifest.json",
    },
    // Rspack으로 빌드된 모듈도 로드 가능
    {
      name: "@demo/app2",
      entry: "http://localhost:3006/remoteEntry.js",
    },
  ],
});

버전 관리 개선

타입스크립트 지원 강화

버전 관리 개선

// webpack.config.js
new ModuleFederationPlugin({
  name: 'host',
  remotes: {
    'remote_v1': 'remote@http://localhost:3001/remoteEntry.js',
    'remote_v2': 'remote@http://localhost:3002/remoteEntry.js',
  },
})
import ComponentV1 from 'remote_v1/Component';
import ComponentV2 from 'remote_v2/Component';

const loadComponent = async (version) => {
  if (version === 'v1') {
    return import('remote_v1/Component');
  } else {
    return import('remote_v2/Component');
  }
};

// webpack.config.js
new ModuleFederationPlugin({
  // ...
  shared: {
    'some-library': {
      singleton: true,
      requiredVersion: '^2.0.0',
      strictVersion: true,
      versionCheck: (version) => {
        // 버전 충돌 시 사용할 로직
        return semver.satisfies(version, '^2.0.0');
      }
    }
  }
})

보안 강화

성능 최적화

플러그인 시스템 개선

컨테이너 간 통신 개선

// store.js (shared module)
import { createStore } from 'redux';
const store = createStore(rootReducer);
export default store;

// In each Micro Frontend
import store from 'shared/store';
// Using a custom event bus
const eventBus = new EventEmitter();
eventBus.on('stateChange', (newState) => {
  // Update local state
});

// When state changes
eventBus.emit('stateChange', newState);
// store.js (shared module)
import { createStore, combineReducers } from 'redux';

const createRootReducer = (asyncReducers) => combineReducers({
  ...asyncReducers,
  // other shared reducers
});

export default function configureStore(initialState = {}) {
  const store = createStore(createRootReducer());
  store.asyncReducers = {};
  return store;
}

export function injectReducer(store, key, reducer) {
  store.asyncReducers[key] = reducer;
  store.replaceReducer(createRootReducer(store.asyncReducers));
}

// In each Micro Frontend
import configureStore, { injectReducer } from 'shared/store';
import myReducer from './reducer';

const store = configureStore();
injectReducer(store, 'myFeature', myReducer);

마이크로프론트엔드 지원 강화

배포 플랫폼 지원