single-spa | single-spaなるマイクロフロントエンドさくっと作れそうなフレームワークを試してみました。
準備
single-spa
はプロジェクト作成用などのcliを用意してくれているようなので、まずはそれをインストールします。
npm install --global create-single-spa
こんな感じにバージョン確認できればインストールは成功です。
create-single-spa --version 2.1.1
アプリケーションの作成手順
ここから新規で、single-spa
を使ったマイクロフロントエンドなアプリケーションを作る流れになります。
ルートHTMLを持つプロジェクトの作成
create-single-spa
コマンドを使って、moduleType
にroot-config
を指定することでルートHTMLを持つプロジェクトを作成できます。
いくつか作成するプロジェクトに関する質問をされますが、好きなものを選ぶな&入力する感じでOKです。
create-single-spa --dir root-config --moduleType root-config
プロジェクトが作成できたら、早速起動してみましょう。
cd root-config npm run start
ブラウザで、http://localhost:9000
にアクセスしてこんな感じのページが表示されればOKですね!
1つめのマイクロフロントエンドとなるアプリケーションの作成
マイクルフロントエンドとなるアプリケーションも、create-single-spa
を使って作成できます。
framework
には、色々なもの*1が指定できますが、今回はvue
を指定して2系でプロジェクトを作ってみます。
vue
を指定した場合、vue-cli
が実行されプロジェクトが作成されます。
create-single-spa --dir vue2-app --framework vue
さっそくプロジェクトを起動してみましょう。
cd vue2-app
npm run serve
ブラウザでhttp://localhost:8080
にアクセスすると、いつものVueなアプリケーションの画面が表示されませんね…
これは、run serve
で起動した場合、結合モードでマイクロフロントエンド側のアプリケーションとして実行されていて単体での画面表示ができないことが原因みたいですね。
マイクロフロントエンド側のアプリケーション単体で画面表示&開発をしたい場合にはserve:standalone
で起動してあげます。
npm run serve:standalone
これで再度ブラウザで表示してみるといつもの見慣れた初期画面が表示されますね。
vue2のアプリケーションであることがさくっとわかるように、src/App.vue
のtemplateを書き換えておきます。
<template> <div id="app"> <h1>vue2 app</h1> <router-view/> </div> </template>
ポートかぶりをなくすために、vue.config.js
を作成して、使用するポートも変更しておきます。
module.exports = { devServer: { port: 9001, disableHostCheck: true } }
2つめのマイクロフロントエンドとなるアプリケーションの作成
1つ目と同じようにcreate-single-spa
を使って作成していきます。2つ目のサービスはVueの3系を指定して作ってみます。
create-single-spa --dir vue3-app --framework vue
以降の手順は、1つ目のプロジェクトと同じため省略します。ポートは連番でわかりやすく9002
に変更しておきます。
作成した2つのサービスを使って画面表示してみる
最初に作った、root-config
側を編集して、2つのマイクロサービスを切り替えて画面表示していきます。
cd root-config
vi src/index.ejs
@single-spa/welcome
が記述されている行を探し、importmap
を変更していきます。
importmap
の名前には、各マイクロフロントエンドサービスのpackage.jsonに指定されている名前を指定するのがわかりやすいでしょう。
JavaScriptのパスは、マイクロフロントエンドサービスをnpm run serve
で起動した際に画面に表示されているパス(下の画像の赤枠のパス)を指定します。
- 変更前
<% if (isLocal) { %> <script type="systemjs-importmap"> { "imports": { "@single-spa/welcome": "https://unpkg.com/single-spa-welcome/dist/single-spa-welcome.js", "@siosio/root-config": "//localhost:9000/siosio-root-config.js" } } </script> <% } %>
- 変更後
<% if (isLocal) { %> <script type="systemjs-importmap"> { "imports": { "@siosio/root-config": "//localhost:9000/siosio-root-config.js", "@siosio/vue2-app": "http://localhost:9001/js/app.js", "@siosio/vue3-app": "http://localhost:9002/js/app.js" } } </script> <% } %>
続いて、各マイクロフロントエンドサービスの画面を表示する部分を変更しています。
変更する部分は、route default
が記述されているあたりになります。
route
のpath
を指定することでパスによって表示するマイクロフロントエンドサービスを切り替えられるようです。
application
のname
には、上で編集したimportmap
の名前を指定してあげます。
- 変更前
<main> <route default> <application name="@single-spa/welcome"></application> </route> </main>
- 変更後
<main> <route path="/vue2"> <application name="@siosio/vue2-app"></application> </route> <route path="/vue3"> <application name="@siosio/vue3-app"></application> </route> </main>
アプリケーションを起動して画面表示をしてみましょう。
npm run start
ブラウザで、http://localhost:9000/vue2
/http://localhost:9000/vue3
で、それぞれのマイクロフロントエンドサービス側の画面が表示されれば成功ですね。
おわり。