Figma×Amplify×Reactのローコードツールを0から検証してみたらフロントの難易度がさらに上がったと感じた話

## Figma × Amplify × React の激震

昨年末に開催されたAWS主催のre:Inventでモバイル、WEBアプリケーション開発を行える、ローコードツール　Amplify Studio の発表がされました。
この発表に対して「フロントエンドエンジニアはもういらない」「これなら俺でもフロントエンドができそう」など冗談混じりの会話が知人との中でなされていて、自分はフロントエンジニアとしての不安感と、サービス開発者としての期待感をいただいております。


![スクリーンショット 2022-01-02 21.41.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/53a63178-352a-74c5-7f31-47646cd522ef.png)

ただ正直、これからフロントエンジニアにどういう影響を与えるか不安なので、色んな記事を調べさせていただいたのですが、ほとんど出来合いのデザインを活用したチュートリアルを試してみたものが多く、０からデザインして運用し開発へどう活用するか？の疑問が解決できなかったので自分で試してみて、フロントエンジニアという職種、強いてはエンジニア全体にどのような影響を与えるのか調べていきたいなと思っています。

ハンズオン形式となっているので実際に試してみたい方は次の章から、実際に触ってみた感想だけ知りたい方は**一番最後まで読み飛ばしてください。**


## React のブロジェクトを作成

まずこれを利用するにあたってReactのプロジェクトを作成する必要があります。
下記コマンドを打って。

```

HiguchiShuya@MacBook-Shuya v % npx create-react-app memory-talk 

```

こんな感じでプロジェクトの作成に成功します。

![スクリーンショット 2022-01-01 23.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/0cffd9a8-cb52-a6c9-5ead-a36fd61d57f7.png)

画像のように Happy hacking! が表示されたら成功です。

無事プロジェクトの作成に成功したらgithubにpushしましょう。
後ほどAmplifyで連携するために利用します。

![スクリーンショット 2022-01-02 14.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/04db0302-4769-7052-3ef4-65d06fbf8a4a.png)


## Figmaでプロジェクトを作成する

Figmaでプロジェクトを作成する際は　[Figma公式](https://www.figma.com/) からアクセスし、すでにアカウントがある場合は New design file からシートを作成します。

![スクリーンショット 2022-01-02 11.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/cec4444e-b4f1-f931-d6bc-fe6b240b4d9c.png)


新しくシートが作成されたら上の Untitled のところをクリックしてプロジェクトに名前をつけましょう。


![スクリーンショット 2022-01-02 11.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/fea03f10-7d3e-73c2-e8b4-a8fa8e21bad5.png)



## Figmaでお絵かき開始


今回はスマホをメインに作成してこうと思うのですが、まずベースとなる台紙を用意します。

まずは　左上にある漢字の井みたいなところを押して画面上にある適当なところに四角形を作成します。

![スクリーンショット 2022-01-02 11.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/1a79819e-0317-36d8-d69e-944acaa5c82e.png)


作成したら下図に示すFrameのところをクリックすると

![スクリーンショット 2022-01-02 11.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/8cac27f0-c999-1eb2-365c-ecdfd4ad6dda.png)

好きなスマホサイズを選べます。

![スクリーンショット 2022-01-02 11.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/68378573-6245-365c-4250-de025386248e.png)


これで　Figmaの画面を作成する下地ができました。

こんな感じで画面を作成していきFrameの中にFrameを配置することで画面を作っていくことができます。
色はFillのところのタブを開くと表示されるのでそこで色を変更することができます。

![スクリーンショット 2022-01-02 11.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/a7d9b031-35f8-ea76-9238-6e773047417f.png)


ちなみにUIのコンポーネントをただおくだけであれば簡単にズレてしまうので、それが不安な方は是非 [Auto Layout](https://bagelee.com/design/figma-auto-layout-feature/) 機能を使いましょう！

そしていい感じにスマホ画面のUIの土台となる部分を作成しましょう。
Figmaのデザインに凝りすぎてしまうといつまで経っても進まないのでほどほどのところで次のステップに進みます。

![スクリーンショット 2022-01-02 14.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/b65ce6ee-cc8c-0bcc-f12b-f8f6a7a81be5.png)


## Amplify のアプリケーションを作成する

AWSコンソールにサインインしてAmplifyの画面を開きます。
右上の新しいアプリケーションからウェブアプリケーションをホストを選択しましょう。

![スクリーンショット 2022-01-02 14.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/9dfd6f48-c191-6c71-fde4-674bbb4e4126.png)

そしてgithubを選択して続行

![スクリーンショット 2022-01-02 14.07.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/c5a7a15b-cf71-8d13-68d6-de67cd77c83f.png)

最初に作成したリポジトリとブランチを選択します。

![スクリーンショット 2022-01-02 14.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/e78ca573-749e-f5ef-c71d-116b6a2d745b.png)

すると無事アプリケーションの作成が開始され時期に下図のような画面がでます。

![スクリーンショット 2022-01-02 14.15.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/9cada7fc-b13a-6361-a6f4-2e0e5b0ec75f.png)

そしてタブで「Backend environments」に切り替えて「Get started」を押します。

![スクリーンショット 2022-01-02 14.30.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/9b63b41d-53db-fbcc-bcbe-6e98fbbdbef0.png)


ちなみにこれをしないとAmplify Studioに遷移したとき下図のような `An error occurred while fetching the app backend: NotFoundException - An error occurred while processing your request: BackendEnvironment staging does not exist.` というエラーが表示されてしまします。

![スクリーンショット 2022-01-02 14.31.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/2932a07f-048b-a2a3-2e11-fd00bec58eb8.png)


## Amplify と　Figma の連携

左のタブに表示されている アプリの設定ー＞Amplify Studio の設定　を押して下図のような画面へ遷移して　「Amplify Studio を有効にします。」 を on　にしてください。

![スクリーンショット 2022-01-02 14.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/168e1e3b-27f6-4131-2e04-d87da79a43d9.png)

ユーザーの招待を押して自分のメールアドレスを入力します。
権限はバックエンドもいじりたいのでとりあえずフルアクセスにしてます。

![スクリーンショット 2022-01-02 14.21.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/0a36472a-124a-9dd7-33fb-d8559c2a90f2.png)

そうするとメールアドレスに招待メールが届き、一時的なパスワードが記載されているのでそれをコピーして「Visit the Amplify Studio」をクリック。

![スクリーンショット 2022-01-02 14.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/5a0165ea-4a3f-a639-91fc-7f86ae08ad8b.png)

メアドと一時バスワードを入力すると新しいパスワードが要求されるので、大文字と記号を含んだパスワードを新しいパスワードとして設定すると Amplify Studio にログインできます。

![スクリーンショット 2022-01-02 14.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/3ebf0079-4825-953b-b5d7-902e80c88bce.png)

Amplify Studio に入れましたね

![スクリーンショット 2022-01-02 14.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/a0a8318b-bd79-3db9-78ee-ef4f501362cc.png)

そしていよいよFimgaとの連携

Figmaの Share -> copy link を押してFigmaの閲覧用のURLを取ってきて

![スクリーンショット 2022-01-02 14.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/fcaa1f3e-a4cb-4b5d-3ba7-1bdd3457c68f.png)

Amplify Studio の UI Library (preview) の Get started を押して

![スクリーンショット 2022-01-02 14.35.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/04189d92-84bc-80b1-90e1-2d85b48638c3.png)

出てきたポップアップに先ほどコピーしたFimgaのリンクを貼ります。
そして Continue を押します。

![スクリーンショット 2022-01-02 14.36.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/5e3118b1-2f94-f5d6-ac92-c3ab8ecc472b.png)

これで連携されるはずですが、、、うまくいきませんでした。


![スクリーンショット 2022-01-02 14.45.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/ec69fce6-c6a1-e4d0-2675-5e3f3b37bd3e.png)

```

Cannot find components
We couldn't find any components in the following file:

```

とエラー文が表示されているのでおそらくFigma上でコンポーネント化していないものに関しては連携されないようです。
気を取り直してコンポーネント化してFimgaとの連携を楽しんでいきましょう。

## Figma でコンポーネントを作成して Amplify Studio から扱えるようにする。

Figmaでコンポーネントにできそうな親のフレームを選択して右クリックすると Create Component を選択するとその部分をコンポーネントにできます。

![スクリーンショット 2022-01-02 14.51.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/8bfb80b5-5bc8-f8b2-d9aa-05c0153ff00a.png)

そして再度連携すると下図のようにコンポーネントが表示されます。
Accept もしくは Accept All を押してコンポーネントを Amplify Studio に読み込ませましょう。

![スクリーンショット 2022-01-02 14.54.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/5cbc09a0-7455-08a4-b591-1ad228a10c7f.png)

またここは自分でも誤解していたところになりますが、 **Figmaで書いたものが何でもかんでもReactのコードとして吐き出せるわけではなくあくまでFigma上でコンポーネント化したもののみがAmplify　Studio で扱ってコードとして吐き出すことができる模様です。**

## Amplify で生成したコンポーネントをローカル環境へインストール

作成したコンポーネントをローカルの開発環境で使うためには Amplify CLI の準備などが必要で [こちらの記事](https://qiita.com/Junpei_Takagi/items/f2bc567761880471fd54) がわかりやすいので参考にして環境の準備の方をしてください。

先ほどのAmplify Studio の画面で Configure を押して

![スクリーンショット 2022-01-02 14.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/a9181d58-3d85-251b-4369-fef0766d219d.png)

Get component Code を押すとインストールの仕方が表示されます。

![スクリーンショット 2022-01-02 15.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/cc108bf0-af80-809a-13c4-911e429a8b86.png)

元々必要なライブラリがローカル環境に入っているか否かで設定が変わりますが自分の場合は以下の手順で設定を進めました。

amplify で生成されたコンポーネントをインストール

```

amplify pull --appId [個々人で違うappId] --envName staging

```

するとブラウザが起動してボタンを押すと以下のような画面になるので再度CLIに戻る

![スクリーンショット 2022-01-02 15.38.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/a5fcbd35-4d53-fde9-a0c2-297090877b2a.png)

CLIから設定に関する質問がくるのでそれを以下のように設定

![スクリーンショット 2022-01-02 15.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/382c79b4-d546-2b98-5249-dcccce0d9687.png)

そして足りないライブラリを追加すると準備完了

```

npm install aws-amplify @aws-amplify/ui-react

```

画像のように `ui-components` というフォルダができてその中に Figma から作成したコンポーネントが表示されます。

![スクリーンショット 2022-01-02 15.46.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/4b12b9e3-4791-a1f8-f0e2-7d417f590829.png)

ちなみに吐き出されたコードはこんな感じ。Figmaでちゃんと　Auto Layout を使っていたおかげかちゃんと生成されたコードに `Flexbox` が使われいる。Figmaでのコンポーネント作成をちゃんと頑張ればいい感じに使えそう。

```CardHomeTalk.jsx
/***************************************************************************
 * The contents of this file were generated with Amplify Studio.           *
 * Please refrain from making any modifications to this file.              *
 * Any changes to this file will be overwritten when running amplify pull. *
 **************************************************************************/

/* eslint-disable */
import React from "react";
import { getOverrideProps } from "@aws-amplify/ui-react/internal";
import { Flex, Text, View } from "@aws-amplify/ui-react";
export default function CardHomeTalk(props) {
  const { overrides: overridesProp, ...rest } = props;
  const overrides = { ...overridesProp };
  return (
    <Flex
      border="1px SOLID rgba(0,0,0,1)"
      padding="0px 23px 0px 23px"
      backgroundColor="rgba(255,255,255,1)"
      overflow="hidden"
      alignItems="flex-start"
      borderRadius="8px"
      gap="20px"
      width="289px"
      position="relative"
      direction="row"
      {...rest}
      {...getOverrideProps(overrides, "Flex")}
    >
      <View
        padding="0px 0px 0px 0px"
        backgroundColor="rgba(255,255,255,1)"
        overflow="hidden"
        shrink="0"
        width="60px"
        position="relative"
        height="100px"
        {...getOverrideProps(overrides, "Flex.View[0]")}
      >
        <View
          padding="0px 0px 0px 0px"
          backgroundColor="rgba(196.00000351667404,196.00000351667404,196.00000351667404,1)"
          top="16px"
          borderRadius="8px"
          left="0px"
          width="60px"
          position="absolute"
          height="60px"
          {...getOverrideProps(overrides, "Flex.View[0].View[0]")}
        ></View>
      </View>
      <View
        padding="0px 0px 0px 0px"
        backgroundColor="rgba(255,255,255,1)"
        overflow="hidden"
        shrink="0"
        width="185px"
        position="relative"
        height="100px"
        {...getOverrideProps(overrides, "Flex.View[1]")}
      >
        <Flex
          padding="16px 0px 0px 8px"
          alignItems="center"
          top="0px"
          left="0px"
          gap="10px"
          width="195px"
          position="absolute"
          direction="row"
          {...getOverrideProps(overrides, "Flex.View[1].Flex[0]")}
        >
          <Text
            padding="0px 0px 0px 0px"
            color="rgba(0,0,0,1)"
            textAlign="left"
            shrink="0"
            display="flex"
            justifyContent="flex-start"
            fontFamily="Roboto"
            fontSize="18px"
            lineHeight="21.09375px"
            position="relative"
            fontWeight="700"
            direction="column"
            children="Title"
            {...getOverrideProps(overrides, "Flex.View[1].Flex[0].Text[0]")}
          ></Text>
        </Flex>
        <Flex
          padding="0px 0px 0px 8px"
          alignItems="flex-start"
          top="42px"
          left="0px"
          gap="8px"
          width="195px"
          position="absolute"
          direction="row"
          height="58px"
          {...getOverrideProps(overrides, "Flex.View[1].Flex[1]")}
        >
          <Text
            padding="0px 0px 0px 0px"
            color="rgba(0,0,0,1)"
            textAlign="left"
            shrink="0"
            display="flex"
            justifyContent="flex-start"
            fontFamily="Roboto"
            fontSize="12px"
            lineHeight="14.0625px"
            position="relative"
            fontWeight="400"
            direction="column"
            children="text"
            {...getOverrideProps(overrides, "Flex.View[1].Flex[1].Text[0]")}
          ></Text>
        </Flex>
      </View>
    </Flex>
  );
}


```

## 生成されたコンポーネントをReactで扱う

まず React で Amplify で生成されたコンポネントを扱うための準備をおこないます。
`src/index.js` で必要なライブラリのインポートを行い `<App />` を ` <AmplifyProvider>` ` </AmplifyProvider>`で囲みます。

```index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

// 追加
import Amplify from 'aws-amplify';
import "@aws-amplify/ui-react/styles.css";
import {AmplifyProvider} from "@aws-amplify/ui-react";
import awsconfig from './aws-exports';
Amplify.configure(awsconfig);
// ここまで

ReactDOM.render(
  <React.StrictMode>
    <AmplifyProvider>
      <App />
    </AmplifyProvider>
  </React.StrictMode>,
  document.getElementById('root')
);


```

そして `import { CardHomeTalk } from './ui-components';` を追加して余計なタグを削除した上で　`<CardHomeTalk />` を `div` 配下において書き換えます。

```App.js

import logo from './logo.svg';

import './App.css';

// 追加
import { CardHomeTalk } from './ui-components';

function App() {
  return (
    <div className="App">
      <CardHomeTalk />
    </div>
  );
}

export default App;

```

するとこう表示されていたものが、、

![スクリーンショット 2022-01-02 15.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/5cf70050-b298-91b7-f65a-3f9f94448026.png)

こうなりちゃんとFigmaで作成したコンポーネントが表示されたことがわかります。

![スクリーンショット 2022-01-02 15.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/ad53a736-3a7d-396a-cc90-e0a9904bd157.png)

## 感想

結論、フロントエンジニアの難易度はさらに上がると思います。
１人のフロントエンドエンジニアとしては業界を変えるほどの大きなブレークスルーにはならないと感じております。
理由としては、なんだかんだでやりにくいというのが正直な感想だからです。
ローコードなので完全にコードを理解しないで作れるわけではないので、一部でコードを書く必要が出てきます。
そうなった時に、状態管理、アーキテクチャの選定、コンポーネント管理など多くのエンジニアが頭を悩ます問題に直面し、その上に Amplify Studio から生成されたコードとの兼ね合いも調整する必要があります。
つまり、フロントのコードとしては難易度は上がります。
なのでこの Amplify Studio をプロダクトレベルで用いるためには **フロントエンジニアとしてより高いスキルが求められるようになる** でしょう。

ただ、うまく扱えるとかなりの武器になると思います。
例えばフロントでは「Figmaと実際に作られたプロダクトのデザインが違う」なんてことがざらにあります。
また、Figmaのデザインがフロントからしたら構築しにくいこともあります。
そういった仕様把握の問題解決や、実装の工数を削減してくれるという点では期待が持てます。

ノーコード、ローコードの期待感は高まる一方で色んな理想が語られることはありますが、現実では問題点が多く
それを活用するのにエンジニアとして知恵を絞る必要があると感じています。

最後に、
自分はこれからこの AWS Amplify Studio を使って個人のサービス開発を行なっていく予定です。
間違いや至らぬ点などあるかもしれませんが、新しい発見とかを時間を見つけて発信していくのでよかったらフォローなどをして応援してもらえると嬉しいです。