【SAPUI5】SAPUI5+Luigiでマイクロフロントエンドな実装を試してみる

この記事は [chillSAP 夏の自由研究2021](https://note.com/chillsap/n/n08ef5ec73b4c) の記事として執筆しています。

# はじめに
夏の自由研究のお題としてSAPFiori関連でなにかしてみようと思い、
Luigiフレームワーク＋SAPUI5でマイクロフロントエンドな実装を試してみました。

マイクロフロントエンドはマイクロサービスの考え方をフロントエンドに拡張したもので、
フロントエンドとバックエンドを切り離すだけでなくフロントエンド層も機能単位で切り離して開発する考え方です。

Luigiはマイクロフロントエンドのアーキテクチャを実現するためのフレームワークです。
SAPUI5以外にもAngular/React/Vue等でも利用できます。
＝SAPUI5がベースのアプリケーションとReact、Vueで作成した機能を組み合わせることも可能となります。

【Luigi】
　[GitHub](https://github.com/SAP/luigi)
　[公式](https://luigi-project.io/)

【参考】
[マイクロフロントエンドについて詳しい内容はこちら](https://micro-frontends-japanese.org/)

Luigiへの取っ掛かりとしては下記のSAPチュートリアルとGitHubのスタートガイドがありましたので、それぞれ試してどういう作りになっているか？をまとめてみました。

【SAPチュートリアル】
[Create an Application with the Luigi Micro Frontend Framework](https://developers.sap.com/group.luigi-app.html)

【Luigi Core Installation】
[Luigi Core Installation（OpenUI5）](https://github.com/SAP/luigi/blob/master/docs/application-setup.md#application-setup-for-sapui5openui5)



# SAPチュートリアルをやってみる
まずは下記のSAPチュートリアルを試します。
[Create an Application with the Luigi Micro Frontend Framework]
(https://developers.sap.com/group.luigi-app.html)


## 構造
上記のチュートリアルではReactアプリケーションとSAPUI5アプリケーションを作成し、
ReactアプリケーションからSAPUI5アプリケーションで作成している画面（View+Controller）を実行することができます。

Luigiでは、Luigi CoreアプリケーションとLuigi Clientライブラリで構成されます。
各Clientの呼出は`luigi-config.js`で定義されます。

このチュートリアルではReact側がLuigi Coreアプリケーションとなり、
Luigi ClientであるSAPUI5の画面を呼び出すことができます。
また、Luigi Clientとして実行されている場合はSAPUI5側の画面からLuigi Client APIを通してReactアプリケーションの画面を呼び出すことも可能です。（チュートリアルのOrder.controller.jsを参照）



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159467/5c20eb9c-3096-66a6-c089-c5fae2dde812.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159467/c59b7cea-94b9-ed10-f337-6705567eafc8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159467/bfa82815-651e-8390-1601-523c94666abe.png)


## トラブルシューティング
チュートリアルに記載のまま進めると下記の箇所でエラーとなります。。

### Reactアプリケーションの実行時のエラー
チュートリアルのBuild Luigi App with React：Step 14にて、 `npm start` を実行した際、
以下のエラーとなりました。

```
TypeError: compilation.getCache is not a function
```

これはStep 5で記載されている `copy-webpack-plugin` モジュールのバージョンを下げることで解消可能です。
（2021/08/19時点）
 参考↓
https://github.com/framework7io/framework7/issues/3785

package.jsonで `copy-webpack-plugin`のバージョンを以下の通りに変更して対応しました。

```json:package.json
"copy-webpack-plugin": "^9.0.1"
 ↓
"copy-webpack-plugin": "^6.3.2"
```

### ReactアプリケーションでProductsを表示した際のエラー

こちらもBuild Luigi App with React：Step 14で`npm start`を実行後、
Home画面からProductsに遷移した際に下記のエラーとなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159467/87fc1d6f-9f61-a563-60ae-8a69ab66a4ce.png)


Developer Toolから確認すると、Products.jsxでエラーとなっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159467/acb21fd4-7590-5e5f-a70b-46963a05224c.png)

バージョンの違いによって、Products.jsxのline:14にある `fundamental-react`モジュールの`LayoutGrid` の中身が変更されていることが原因ですので、`fundamental-react`モジュールのバージョンを`0.11.0`まで下げることで解消します。

```json:package.json
"fundamental-react": "^0.13.1",
 ↓
"fundamental-react": "^0.11.0",
```


# Luigi Core Installationをやってみる
次に、GitHubのスタートガイドを試します。
[Luigi Core Installation（OpenUI5）](https://github.com/SAP/luigi/blob/master/docs/application-setup.md#application-setup-for-sapui5openui5)


Application setup for SAPUI5/OpenUI5に記載の通り、こちらは下記のコマンドだけで実行可能です。

```
bash <(curl -s https://raw.githubusercontent.com/SAP/luigi/master/scripts/setup/openui5.sh)
```

## 構造
GitHubのスタートガイドで作成されるアプリケーションはSAPUI5アプリケーションのみとなります。
単一のプロジェクト内にLuigi CoreアプリケーションとLuigi Clientライブラリが存在しています。
単一のプロジェクトでもClientの呼出は`luigi-config.js`での管理となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159467/627222c5-596f-e826-0e53-82109755fc40.png)

プロジェクトの構造はSAPUI5のwebapp配下にLuigi Core＋各Clientのディレクトリが作られています。
controller/viewなどは各Clientディレクトリ内にまとまっていました。

index.htmlからhome配下のView（Luigi Core）が起動し、そこからsample1などの各Clientを呼び出しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159467/c7868f9c-a07a-d94d-d151-aaea1b621278.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159467/25fe54ed-95e9-5b28-0d5b-ea65f709b1a4.png)

# まとめ

SAPUI5+Luigiフレームワークの組合せでマイクロフロントエンドを実現することを試してみました。
ReactやVue等、他のフレームワークとSAPUI5のアプリケーションを組み合わせたい場合はLuigiフレームワークを使って実現することでマイクロフロントエンドの利点を活かすことができると思いました。

逆にSAPUI5アプリケーション同士を組合せたい場合であればSAPUI5ライブラリでView（＋Controller）を管理するほうがシンプルな作りとできるような気がします。