FlamelinkのクライアントをNuxtで作成してみる

## ■ 今回お話すること
- ヘッドレスCMS「Flamelink」で書いたブログをFlamelinkSDKを利用してNuxtで表示させる

## ■ 前提
- Firebase CLIが利用できること。
- FlamelinkとFirebaseの設定は完了済みであること。<br>
 （上記の設定については、『[今すぐ始められる！FIrebaseをブログのCMSに変える「Flamelink」を使ってみた！](http://urx.blue/Pfh2)』を参照するとわかりやすいです。）

- ちなみに忘備録的にサイトを作った記事になりますのでご了承ください（汗）

## ■ 今回の環境
### > 開発端末
```
MacOS Mojave 10.14.1
```

### > Nuxt
```
nuxt: 2.0
```

### > Firebase
```
firebase: 5.7.3
firebase CLI: 6.1.2
firebase-admin: 6.5.0
```

### > Flamelink
```
flamelink: 0.19.6
```

## ■ 環境構築
### 1. Nuxtのプロジェクトを作成する
- npxコマンドでプロジェクト作成します

```Terminal
$ npx create-nuxt-app <project-name>
```
- プロジェクト作成時に設定した内容です
![98.nuxt_初期設定.png](https://qiita-image-store.s3.amazonaws.com/0/252086/20c19494-fcfc-7289-2320-57655d76e95a.png)

- 一度起動して動くか確認してみます

```Terminal
$ npm run dev
```

- 【参考】サーバを立ち上げた時、Eslintのエラーが出た時
 - [create-nuxt-appで作ったプロジェクトが最初からフォーマットエラーを抱えているときの対応](http://urx.blue/Pfj7)

### 2. 必要なライブラリ設定
- package.jsonに以下のライブラリを追加します

```json:package.json
  "dependencies": {
    "firebase": "^5.7.3",
    "firebase-admin": "^6.5.0",
    "flamelink": "^0.19.6"
  },
```

- Installしておきましょう。

```Terminal
$ npm install
```

### 3. Flamelinkを使う設定
- Nuxt.configに、以下の設定を追加してください。

```javascript
  plugins: [
    '@/plugins/flamelink'
  ],
```

- 公式のgitHubからflamelink.jsを取得して、plugins配下に配置します。
 - gitHub：[examples/examples/nuxt-basic/plugins/flamelink.js](http://urx.blue/PfjD)

### 4. Firebaseの設定
- サービスアカウント情報を含むJsonファイルをFirebase側で生成、ダウンロードし、Nuxtのプロジェクト配下に設置します。<br>設定 > サービスアカウント > 新しい秘密鍵の生成 で作成できます。
![firebase_サービスアカウント.png](https://qiita-image-store.s3.amazonaws.com/0/252086/b7ca2e47-3103-119b-0ef3-4c3bafe723af.png)

- .envファイルの設定を行います。 『Firebase > Authentication > ウェブ設定』で表示される値を.envファイルに設定します。

```env:.env
FLAMELINK_API_KEY="<firebase-api-key>"
FLAMELINK_AUTH_DOMAIN="<firebase-auth-domain>"
FLAMELINK_DB_URL="<firebase-db-url>"
FLAMELINK_PROJECT_ID="<firebase-project-id>"
FLAMELINK_STORAGE_BUCKET="<firebase-storage-bucket>"
FLAMELINK_PATH_TO_SERVICE_ACCOUNT="<firebase-path-to-service-account>"
```

- Realtime Databaseの設定をします。私がセットアップしていた時点での公式では、以下のような設定をおこなうと書かれていましたが、ページ遷移を実施した時にPermissionエラーとなったので、少し変更しました。

> 公式

```json:
{
  "rules": {
    "flamelink": {
      ".read": "auth != null",
      ".write": "auth != null",
      "users": {
        ".indexOn": ["id", "email"]
      }
    }
  }
}
```

> 今回設定したRule

```json:
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "flamelink": {
      ".read": "auth != null",
      ".write": "auth != null",
      "environments": {
        ".read": true,
      },
      "users": {
        ".indexOn": ["id", "email"]
      }
    }
  }
}
```

- Firebaseへホスティングする準備

 - 公式の[サイトをデプロイする](http://urx.blue/Pfn8)の手順を参考にFirebase CLIで設定してください。

### 5. ディレクトリ構成
- 最終的なディレクトリ構成はこんな感じです。<br>
![スクリーンショット 2019-01-13 18.41.34.png](https://qiita-image-store.s3.amazonaws.com/0/252086/2a306cbe-21a4-c718-236b-53105ed6741c.png)

### 6. Firebaseにホスティングする
- generateを実行して、ホスティングするファイルを生成しましょう。

```Terminal
$ npm run generate
```

- Firebaseへdeployします。

```Terminal
$ firebase deploy
```

## ■ 実装ファイルの説明
- asyncDataでFlamelinkから取得しています。<br>`flamelink.content.get`の部分ですね。<br>`'myblog'`の部分は、FlamelinkのSchemesで設定したidになります。

```js:index.vue
<script>
export default {
  async asyncData({ app }) {
    try {
      const myblog = await app.flamelink.content.get('myblog', {
        populate: ['image']
      })
      return { myblog }
    } catch (err) {
      console.log(err)
      return { myblog: [] }
    }
  }
}
</script>
```
ちなみに・・・Flamelinkから取得したデータ構造はこんな感じです。 
![スクリーンショット 2019-01-13 18.54.40のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/252086/0991f35e-1981-db95-0168-c37c61cf06c3.png)

## ■ 今日の成果物
- gitHub：[flamelink-client-nuxt](http://urx.blue/Pfmi)
- （仮）ブログ：[NunnallyBlog](http://urx.blue/Pfml)
![ブログイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/252086/b6503e4b-f46d-8b8b-4468-48070f88f6d6.png)

## ■ あとがき
- Realtime DatabaseのRulesでPermissionエラーが出たときは一瞬戸惑ったんですが、Firebaseの癖がわかれば爆速かと思いました。
- とりあえず、Flamelinkで書いたブログを画面に表示させたくてNuxtで作ってみましたが、今流行の（？）のJAMstackなブログ作成にとりかかります（笑）

## ■ 参考リンク
- [Flamelink](https://flamelink.io/)
- [Flamelink Documentation](http://urx.blue/Pfiz)
- Flamelink GitHub：[examples/nuxt-basic](http://urx.blue/Pfit) 
- [今すぐ始められる！FIrebaseをブログのCMSに変える「Flamelink」を使ってみた！](http://urx.blue/Pfh2)