Noodlのプロトタイプ作成とmicroCMSのコンテンツ管理の組合せは爆速でした

# NoodlとmicroCMSとはなんぞや？

UI/UXを爆速でプロトタイピングできるNoodlと、国産HeadlessCMSのmicroCMSの組合せは、
プロトタイプ作成とコンテンツ管理が、簡単にできて汎用性ありそうと言うお話。

**図：こんな感じ**
![img0000_result_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/6e78497d-d278-e700-f49a-26017ac66be4.png)

Noodl,microCMSについて簡単に言えば
- UI/UXをプロトタイピングするツール：Noodl
- コンテンツをAPI経由で取出せる国産の管理システム：microCMS

詳しくは下記で紹介されています
- [Noodl2.0β版が公開されたので使ってみた!](https://qiita.com/kmaepu/items/fcde6b82f49168a88612)
- [国産Headless CMS 「Micro CMS」を試してみた](https://qiita.com/oimo23/items/fc2b36b5bf543b0f23cc)

## きっかけ
昨年末より使い始めたNoodl。ついこの間、コミュニティの人達が麺書[^1]というものを作ってくださいました。今回はこの技術書典応援祭で手に入れた「麺書」を読んでひらめいた内容です。
ここで紹介されていた受付嬢(清水さん)デモで、参加者リストとしてCSVの静的データを使っていたのですが。この静的データ部分にHeadlessCMSを使ったら管理画面もノンプログラミングで爆速になるのではと考えました。

![img0000_result_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/009bac8b-658b-c4e1-012c-a5d412e644ea.png)

[^1]: 麺書は[技術書典応援祭](https://techbookfest.org/product/5665192939618304)で4月5日までオンライン販売されています。

## 早速やってみた
もととなるプロジェクトは『麺書』サンプルとして[Github](https://github.com/noodl-community/tbf08-mensho)で公開されています。
このなかのuketuke受付嬢(システム)をベースとして改造していきます。
サンプルの取込み方法、解説は[麺書](https://techbookfest.org/product/5665192939618304)を読んでいただくのが一番わかりやすいので、ここでは概要と変更に関連する部分だけ紹介します。

**図：完成後はこんな感じになります**
![image302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/9f6edaeb-6916-5195-2423-6b6ad9452745.png)
主な機能は右側の管理画面でmicroCMSから読込んだ参加者リストを表示し、
左側の受付嬢(清水さん)が入力されたお名前がリストに登録されているか確認してくれます。

完成後のデータはGithub上[こちら](https://github.com/macole/tbf08-mensho/tree/master/uketuke)にあります。

## microCMSでデータを準備

microCMSは[こちらからアクセス](https://microcms.io/)できます。
![image311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/eab30f2a-e648-03ca-3a3e-e2606f6ea5c8.png)

こんな感じでGUIを使ってコンテンツとなるデータを用意

**図：APIスキーマ**
![img0001_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/f15cf365-abed-9ebc-b571-32ab77ebf5b6.png)

**図：データを準備**
![image310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/c28474ac-6bc6-3a52-c035-c87391c32faa.png)

コンテンツを受け渡すWebAPIのURLと、APIKeyをメモしておきます。
![image309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/84e8e52a-3763-1765-21c2-7397030a33ac.png)

## Noodlプロジェクトの変更
### StaticDataノードをRESTノードに変更
次に、サンプルプロジェクトを開きkanriコンポーネントにRESTノードと、ボタンとなるGroup、Textノードを追加します。

図：RESTノードの設定
![image305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/0785e2f1-09e5-0a1e-b213-919a46d22ea1.png)
上記のようにRequest:Resoureceを「/news」(microCMS側で自分が設定したエンドポイント)とし、Request:ScriptのEditボタンを押して下記のFetchスクリプトをコピペします。

```javascript:REST_Script
define({
  inputs:{
      apikey:'string'
  },
  outputs:{
      items:'collection'
  },
  request:function(inputs,request) {
      request.headers = {"X-API-KEY":inputs.apikey};
  },
  response:function(outputs,response) {
      outputs.items = response.content.contents;
  }
})

```
内容としては
1. RESTリクエスト前にAPIキーをヘッダーとして設定し
2. 受取ったデータをitemとしてOutputしているだけです

最後にRESTノードの設定として、先ほどメモしたURLをBackend:Endpointに追加。APIキーをInputs:apikeyに追加します。

### Javascriptノードの修正
受付された名前とリストを比較しているJavascriptノードの一部を修正します。
NoodlのStaticDataではフィールドIDに日本語を使えましたが、microCMSではフィールドIDに日本語を使えなかったため、表示名⇒nameと変えたためです。

```diff
-if(key === "表示名")
+if(key === "name")
```

### ノードの接続
![image304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/b88aa95e-8bd7-9eda-6490-89973fa9c88c.png)

StaticDataノードの接続を切り、用意したRESTノード(1)をCollectionノードに接続します。
>REST:Items->Collection:Items

また、RESTのトリガーとして「リスト更新」ボタン(2)を用意しています。
>Group:Click->Rest:Fetch

リストに表示する内容が増えたため、表示用のpartsコンポーネント(3)を修正します。ModelノードのPortに受け取ったname、nickname、contentsを追加し。Textノードに流し込んで表示させます。
![image303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/8b9a51d8-4e0e-1fc7-2caf-bd7f862932c6.png)

以上・・・やってみたら。すごく簡単につながりました。

## 参考
ちなみに、webAPI経由で受け取ったrequestの中身を
Noodlのバックモードで見ると下記のようになっています。

![image308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/f41e3b39-fa5e-9dfd-fc98-747bf02b525d.png)

## 追加：画像もmicroCMSから取得する方法
microCMSでは画像も登録することができるのですが、
画像URLはフィールドID(ここではicon)の下位階層になっているので、
RESTノードScriptを修正して階層を合わせます。

```js:REST_Script修正
define({
  inputs:{
      apikey:'string'
  },
  outputs:{
      items:'collection'
  },
  request:function(inputs,request) {
      request.headers = {"X-API-KEY":inputs.apikey};
  },
  response:function(outputs,response) {
      for (i = 0; i < response.content.contents.length; i++) {
        response.content.contents[i].url=response.content.contents[i].icon.url
      }
      outputs.items = response.content.contents;
  }
})
```

表示項目が増えたので、表示用partsコンポーネントを修正します。
![img0000_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/96ab6e59-36dc-294c-f5fe-d7ccc4fc7bb5.png)

これで、リスト内に画像も取り込むことができました。
![img0001_result_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192442/d95488bc-7c00-1813-da85-c5da567297f1.png)

## まとめ
UI/UXを爆速でプロトタイピングできるNoodlと、国産HeadlessCMSのmicroCMSの組合せは、とても簡単で汎用性ありそうと言うお話でした。