LoginSignup
23
13

More than 3 years have passed since last update.

Nuxt.js / Contentful / NetlifyでJAMstackなブログ開設

Last updated at Posted at 2019-12-24

繋がらないマッチングプラットフォーム「FLAPTALK」を運営する株式会社OneSmallStep代表取締役CTOの@_takeshi_24です。

この記事はアドベントカレンダー「diffeasyCTO西の24(にし)日連続投稿チャレンジ Advent Calendar 2019」の24日目の記事です。

この記事は前回の「JAMstackなブログ開設にチャレンジ」「Nuxt.js / Contentful でJAMstackなブログ開発編」の続きです。
JAMstackなブログ開発にチャレンジしたい方、是非Qiitaアカウントかtwitterをフォローしていただき、ツッコミやいいね!お願いします!

前回はContentfulで記事を投稿し、Nuxt.jsで表示するところまでを解説しましたが、今回はContentfulへの記事投稿をトリガーにNetlifyでGitHubからNuxt.jsのソースを取得し、静的サイトをジェネレートし、配信するまでを解説します。
スクリーンショット 2019-12-24 23.01.54.png

Nuxt.jsの修正

Contentfulで記事を取得して生成される動的なルートを静的サイトとして生成するため、nuxt.config.jsを以下のように修正します。

nuxt.config.js
import { createClient } from './plugins/contentful.js'
let envSet = {}
if (environment !== 'production') {
  envSet = require(`./env.${environment}.js`)
}

export default {
  //・・・

  generate: {
    routes() {
      const client = createClient()
      return client
        .getEntries({ content_type: process.env.CTFL_CONTENT_TYPE_POST })
        .then((entries) => {
          return entries.items.map((entry) => {
            return {
              route: '/posts/' + entry.sys.id,
              payload: entry
            }
          })
        })
    }
  }
}

payloadでentryをセットしていますが、記事詳細ページを生成するときに、再度Contentfulにリクエストを投げて記事を取得せずに、一覧で取得した記事データを利用するためです。
記事ページも以下の通り、payloadがあればそちらからデータを取得するように修正します。

/pages/posts/_id/index.vue
<template>
  <section class="container">
    <h1>{{ post.fields.title }}</h1>
    <v-row>
      <v-col>
        <div v-html="toHtmlString(post.fields.body)"></div>
      </v-col>
    </v-row>
  </section>
</template>
<script>
import { documentToHtmlString } from '@contentful/rich-text-html-renderer'
import { createClient } from '~/plugins/contentful.js'

const client = createClient()
export default {
  async asyncData({ params, payload }) {
    // payloadのデータがあれば、そちらから取得する
    if (payload) return { post: payload }
    const entry = await client.getEntry(params.id)
    return {
      post: entry
    }
  },
  methods: {
    toHtmlString(obj) {
      return documentToHtmlString(obj)
    }
  }
}
</script>

修正したらGitHubにpushします。

Netlifyの構築

アカウント登録

以下のサイトからNetlifyにアクセスし、アカウント登録がまだの場合は、GitHubアカウントで登録します。
https://app.netlify.com/

Siteの登録

Sitesを開き、「New site from Git」をクリックします。
スクリーンショット 2019-12-24 23.40.20.png

GitHubを選択します。
スクリーンショット 2019-12-24 23.41.41.png

リポジトリを選択します。
スクリーンショット 2019-12-24 23.42.34.png

デプロイするブランチを選択し、
Build command : nuxt generate、Publish directory : distを入力します。
スクリーンショット 2019-12-24 23.43.23.png

環境変数ファイルはソース管理から除外しているため、「Show advanced」をクリックし、環境変数を設定します。
スクリーンショット 2019-12-25 0.09.36.png

「Deploy site」をクリックすると、静的サイトの生成が実行され、公開されます。
スクリーンショット 2019-12-24 23.47.11.png

Contentfulの記事投稿をトリガーに自動デプロイ

次に、Contentfulに記事が投稿されたら、Netlifyの静的サイト生成とデプロイを自動実行するよう対応します。

NetlifyでWebhooksのURL発行

Netlifyの「Settings」→「Build & deploy」から「Build hooks」に遷移し、「Add build hook」をクリックします。
スクリーンショット 2019-12-25 0.34.26.png

Build hook名を入力して、保存します。
スクリーンショット 2019-12-25 0.36.30.png

URLが発行されるのでコピーします。

ContentfulのWebhooks設定

次にContentfulのスペースを開き、「Settings」から「Netlify」の「Add」をクリックします。
スクリーンショット 2019-12-25 0.41.12.png

先ほどコピーしたNetlifyのWebhooksのURLを貼り付けて、「Create webhook」をクリックします。
スクリーンショット 2019-12-25 0.42.23.png

記事投稿

記事を投稿すると、Webhookが実行され、Netlifyのdeployが走ります。
スクリーンショット 2019-12-25 0.44.30.png
スクリーンショット 2019-12-25 0.45.08.png

これで、Contengfulで記事投稿すると、NetlifyにジェネレートされたNuxt.jsの静的サイトがデプロイされます。

23
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
13