はじめに
Twitterでvite-plugin-federation というパッケージを紹介しているツイートがあったので、どんな感じに使えるかを何回かに分けて見ていきます。今回は外部のコンポーネントを組み込む方法について見ていきます。
プロジェクトの構成とプロジェクトの作成
ShellAppでリモートに定義されたHeaderコンポーネントと、Footerコンポーネントを読み込んで合成します。構成としてはこんな感じになります。
+------------------------------------+
| Shell(ShellApp:5000) |
| +--------------------------------+ |
| | Header(KernelMfe:5001) | |
| +--------------------------------+ |
| +--------------------------------+ |
| | Contents | |
| +--------------------------------+ |
| +--------------------------------+ |
| | Footer(KernelMfe:5001) | |
| +--------------------------------+ |
+------------------------------------+
プロジェクトを作ります。
❯ cd src
❯ yarn create vite shell --template react-swc-ts
❯ yarn create vite kernel --template react-swc-ts
すべてのプロジェクトに、vite-plugin-federation
パッケージを追加します。
❯ cd src/shell
❯ yarn add @originjs/vite-plugin-federation --dev
❯ cd ../kernel
❯ yarn add @originjs/vite-plugin-federation --dev
ShellApp
を5000で、KernelMFE
を5001で起動するように設定します。
例えば、ShellApp
を5000で提供する場合は次のように設定します。
{
// ... 略 ...
"scripts": {
"dev": "vite --port 5000 --strictPort",
"build": "tsc && vite build",
"preview": "vite preview --port 5000 --strictPort"
},
// ... 略 ...
}
Kernel MFEにコンポーネントを作成し公開する。
KernelMFE
にHeaderコンポーネント
とFooterコンポーネント
を追加します。
Footerコンポーネント
の実装はほぼ同じなのでここでは省略します。
import styles from './Header.module.css'
export default function Header = () => {
return (
<div className={styles.header}>
ヘッダー
</div>
);
}
vite.config.ts
にモジュールフェデレーションの設定をして、外部にHeaderコンポーネント
とFooterコンポーネント
を公開します。
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import federation from '@originjs/vite-plugin-federation'
export default defineConfig({
plugins: [
react(),
federation({
name: "remote_app",
filename: "remoteEntry.js",
exposes: {
'./Header': './src/components/Header',
'./Footer': './src/components/Footer'
},
shared: ['react','react-dom']
})
],
build: {
modulePreload: false,
target: 'esnext',
minify: false,
cssCodeSplit: false
}
})
上記の設定をした後にビルドyarn build
すると/src/kernel/dist/assets
以下にremoteEntry.jsが作成され、yarn preview
すればhttp://localhost:5001/assets/remoteEntry.js
でリモートコンポーネントが公開されます。
ShellでKernelMFEのコンポーネントを合成して表示する。
ShellApp
で、KernelMFE
のコンポーネントを参照できるようにvite.config
で参照します。
import { defineConfig } from 'vite'
import federation from '@originjs/vite-plugin-federation'
import react from '@vitejs/plugin-react-swc'
export default defineConfig({
plugins: [
react(),
federation({
name: 'kernelMfe',
remotes: {
kernelMfe: 'http://localhost:5001/assets/remoteEntry.js',
},
shared: ['react','react-dom']
})
],
build: {
modulePreload: false,
target: 'esnext',
minify: false,
cssCodeSplit: false
}
})
App.tsx
にKernel MFE
のHeaderコンポーネント
とFooterコンポーネント
を組み込む
import './App.css'
import Header from 'kernelMfe/Header';
import Footer from 'kernelMfe/Footer';
export default function App() {
return (
<div className="App">
<Header />
<div>
Shell App
</div>
<Footer />
</div>
)
}
MFEとAppを開発サーバーで起動して動作を確認する。
KernelMFE
はyarn build
後にyarn preview
で開発サーバーを起動します。
❯ cd src/kernel
❯ yarn build && yarn preview
App側はyarn dev
開発サーバーを起動すると、リモートに定義されたコンポーネントが呼び出されていることを確認できます。
❯ cd src/Shell
❯ yarn dev
そっけない画面ですが、リモートのコンポーネントが合成されて表示されたのを確認できます。
おわりに
MFEってよくわからなかったんですけれど、雰囲気わかってきました(あやしい、、、)!
次はコンポーネント間の通信を見ていきます。