Back to Index

WordPress×NuxtのJamstackでサイトをリニューアル

弊社サイトリニューアルの実装を担当しました磯です。
今回のリニューアルに関して、実装面での概要を書きたいと思います。

まず、フロント側の課題としては表示スピードの改善が一番の課題でした。
今までは、WordPress×Pjaxでなるべく体感的に表示スピードが速くなるよう実装してましたが、どうしてもサーバ側のレンダリングがボトルネックになってしまい限界を感じてました。

そこで、今流行りのJamstackを導入してみました。
Jamstackとは、

  • Javascript
  • APIs
  • Markup

を組み合わせたWebアーキテクチャのことで、WordPressなど通常のCMSではアクセスがあったタイミングでページを生成しますが、Jamstackでは事前に静的にファイルを生成して配信となるのでパフォーマンスが高くなるだけでなく、サーバの管理が不要になりデータベースとの接続も無くなるのでセキュリティも高くなります。

構成について

CMS

ヘッドレスCMSとして有名なContentfulやmicroCMSなども候補にしましたが、今までの記事の移行や、コストを考えるとそのままWordPressをヘッドレスCMSとして使用しました。
WordPressをヘッドレスCMSとする場合、通常はREST APIを使うのが一般的ですが、サイトの構成が複雑だったのでオリジナルでAPIを構築してます。

JSのフレームワーク

VueとReactのどちらを使うかで考えましたが、どちらもほとんど経験がなかったため、単純にとっつきやすそうなVueがベースとなるNuxt.jsを採用しました。

ホスティング

JamstackですとNetlifyやVercelなどのサービスがよく使われてますが、同ドメインでCMSを使用している別サイトもあるため、今まで通りのサーバでいきました。
ただ、今のサーバではnode.jsをインストールできずデプロイできません。。
なのでGitHub Actionsを使用してサーバにデプロイする環境を構築しました。

デプロイ環境

デプロイ環境はざっくりとこんな感じ。

  1. WordPressの管理画面に「サイト構築」ボタンを設置
  2. GitHub REST APIからworkflowを実行
  3. GitHub ActionsでNuxt.jsからサイトを生成
  4. 生成されたファイルをサーバにrsync

GitHub Actionsのworkflow

workflowはこんな感じです。

name: deploy

on:
  workflow_dispatch:
    branches: [master]

jobs:
  deplay:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: setup node
        uses: actions/setup-node@v1
        with:
          node-version: '14.x'

      - name: cache node_modules
        id: node_modules_cache_id
        uses: actions/cache@v2
        with:
          path: |
            node_modules
          key: node-deps-${{ hashFiles(format('{0}{1}', github.workspace, '/yarn.lock')) }}

      - name: install
        run: yarn

      - name: generate
        run: yarn generate

      - name: ssh key generate
        run: echo "$SSH_PRIVATE_KEY" > key && chmod 600 key
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}

      - name: rsync deploy
        run: rsync -auzrv -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p ${{ secrets.SSH_PORT }}" --delete --include-from=".rsyncincludes" --exclude="*" ./dist/ ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }}:${{ secrets.SSH_PATH }}

キャッシュを残しておいてnode_modulesのインストール時間を短縮させてます。

      - name: cache node_modules
        id: node_modules_cache_id
        uses: actions/cache@v2
        with:
          path: |
            node_modules
          key: node-deps-${{ hashFiles(format('{0}{1}', github.workspace, '/yarn.lock')) }}

      - name: install
        run: yarn

Secretsにサーバ情報を登録しておいてサーバにrsync。

      - name: ssh key generate
        run: echo "$SSH_PRIVATE_KEY" > key && chmod 600 key
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}

      - name: rsync deploy
        run: rsync -auzrv -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p ${{ secrets.SSH_PORT }}" --delete --include-from=".rsyncincludes" --exclude="*" ./dist/ ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }}:${{ secrets.SSH_PATH }}

WordPressの管理画面に「サイト構築」ボタンを設置

save_postとかにフックをかけてGitHub REST APIを実行してもよかったのですが、GitHub Actionsの実行時間に制限があるので、サイト構築ボタンを管理画面に追加してそれをフックに実行するようにしました。

まとめ

Jamstack、Nuxt.js、GitHub Actions全部初めての経験でしたのでVueの書き方やデプロイ環境の作り方などググっては実行しての繰り返しと試行錯誤で大変でしたがすごく勉強になる制作でしたが、こんな感じで実装できました。

Contact us

ホームページやインターネット広告などに関するご相談、
ご質問などお気軽にお問い合わせください。
お見積りやご相談はすべて無料で承ります。

Tel:0287-69-6283(9:00-18:00 土日祝祭日を除く)