---
title: コーポレートサンプルサイトをSSGにする
description: コーポレートサイトの会社概要やニュースのページなど、表示する内容をバックエンドから都度取得する必要のないページは、デプロイ時に予め生成しておくことで、APIリクエストの数を減らし、表示も高速にすることが可能です。本チュートリアルでは、コーポレートサンプルサイトの特定ページをSSGの構成に変更する手順を学びます。
---

## 概要
コーポレートサンプルサイトはサイト全体がCSRの構成になっています。  
これは、Kuroco管理画面での更新が即確認できる。ページ毎にクライアントサイドの処理かサーバーサイドの処理かを意識する必要が少ない。という利点があり、フロントエンドの構築にまだ馴染みがないユーザーにとって分かりやすい構成です。  

コーポレートサイトの会社概要やニュースのページなど、表示する内容をバックエンドから都度取得する必要のないページは、デプロイ時に予め生成しておくことで、APIリクエストの数を減らし、表示も高速にすることが可能です。

本チュートリアルでは、コーポレートサンプルサイトの特定ページをSSGの構成に変更する手順を学びます。

:::info
CSRとSSGの違いについて、詳しくは[Jamstackのアーキテクチャパターン](/ja/docs/about/jamstack-architecture/)を参照してください。
:::

### 前提条件
このチュートリアルでは、コーポレートサンプルサイトの利用が可能な状態になっていることを前提とします。
まだの場合は以下のチュートリアルを実施してください。

:::info
[コーポレートサンプルサイトを利用する](/ja/docs/tutorials/kuroco-corporate-sample-site/)
:::

HTMLレンダリング方式の変更はフロントエンド側の作業で完結します。
不明点がある場合はNuxt.jsのドキュメントを参照してください。

:::info
https://nuxt.com/docs/guide/
:::

## レンダリング方式をSSGに変更する
### 対象ページに`<ClientOnly>`を追加する
デプロイ時はレンダリングをせず、クライアントサイドでのみ生成される箇所には`<ClientOnly>`を追加します。  
コーポレートサンプルサイトの場合、プレビューページなど、レンダリング方式に関わらずクライアントサイドでのみ生成される箇所については既に`<ClientOnly>`が明示的に追加されていますので、ここでは以下の2ファイルに`<ClientOnly>`を追加します。

- `/pages/ltd-news/detail/[slug].vue`

```diff
 <template>
+  <ClientOnly>
   <div>
     <UiPageHeader
       :path="[{ label: '会員限定コンテンツ', to: '/ltd-news/' }]"
```
```diff
       </template>
     </div>
   </div>
+  </ClientOnly>
 </template>

 <script setup>
```

- `/pages/mypage/edit/index.vue`

```diff
 <template>
+  <ClientOnly>
   <div>
     <UiPageHeader
       :path="[{ label: 'マイページ', to: '/mypage/' }]"
```
```diff
       </div>
     </section>
   </div>
+  </ClientOnly>
 </template>

 <script setup>
```

### SSGにするページのエンドポイントへのリクエストを調整する
エンドポイントからのデータを取得をサーバーサイドから実施するため、useFetchのserver: falseオプションを削除します。

例：`/pages/contact/index.vue`
```diff
 const { data: response } = await useFetch(
   `${config.public.kurocoApiDomain}/rcms-api/1/inquiry/1`,
   {
     credentials: "include",
-     server: false,
   }
 );
```

対象は8ファイル10箇所あります。

|ページ|エンドポイント|
|:--|:--|
|`/pages/index.vue` |/rcms-api/1/news/list<br/>/rcms-api/1/ltd-news/list|
|`/pages/company/index.vue`  |/rcms-api/1/content/details/company|
|`/pages/contact/index.vue`  |/rcms-api/1/inquiry/1 (GET)|
|`/pages/news/detail/[id].vue`  |/rcms-api/1/news/details/<br/>/rcms-api/1/master|
|`/pages/news/index.vue`  |/rcms-api/1/master|
|`/pages/preview/news.vue`  |/rcms-api/1/master|
|`/pages/privacy/index.vue`  |/rcms-api/1/content/details/privacy|
|`/pages/service/index.vue`  |/rcms-api/1/content/details/service|

### サイト全体をSSGの構成にする
`nuxt.config.ts` を編集して、アプリケーション全体のサーバーサイドレンダリングを有効にします。
`ssr: false`の部分を`ssr: true`に変更します。

```ts
import { defineNuxtConfig } from 'nuxt/config';

export default defineNuxtConfig({
  ssr: true, //サーバーサイドレンダリングを有効化
  runtimeConfig: {
    public: {
      kurocoApiDomain: 'https://**********.g.kuroco.app',
    },
  },
  app: {
    head: {
      title: 'front_nuxt_corporate',
  ・
  ・
  ・
```

ここまで実施したら`npm run dev`で表示の確認をします。
エラーが出る場合は修正漏れなどがないか再度確認してください。

### デプロイする
表示に問題が無ければ変更をプッシュしてデプロイします。  
ビルドが成功して表示が確認できたらレンダリング方式の変更は完了です。  

## バックエンドの変更の反映方法
SSGの構成になると企業情報のページなどはユーザーのアクセス時にAPIリクエストを送らなくなります。  
これにより、事前に生成したHTMLを表示するため高速になりますが、再ビルドを実施するまでKuroco管理画面での変更が反映されなくなります。

例えば、Kuroco管理画面から企業情報のコンテンツを更新しても、これだけではフロントエンド側の表示は更新されません。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/9049f026693b8bf23439a3b600baba17.png)

コンテンツの更新をフロントエンド側に反映させるには、[GitHub](/ja/docs/management/github/)のページで[Githubの連携対象]のブランチが設定してある状態で、
コンテンツ更新時に[Github Actions ワークフロー]を有効にして更新してください。 

![Image from Gyazo](https://t.gyazo.com/teams/diverta/9c2e640cbbafee5e78bb49493745e2e1.png)

これにより、コンテンツ更新時にGitHub Actionsが実行され、フロントに反映されます。

:::info
[SSGにしています。コンテンツ更新後すぐにフロントに反映させるにはどうしたらいいですか？](/ja/docs/faq/how-do-i-reflect-updated-ssg-contents-on-the-frontend/)
:::

他には、変更を反映したいタイミングで[GitHub](/ja/docs/management/github/)ページの[Run Deployment]をクリックすることでもGitHub Actionsの実行が可能です。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/6c709e49ba7327bf4f6c1a86bd796839.png)

## ニュースページのアーカイブの表示ついて
コーポレートサンプルサイトのニュースページに表示しているアーカイブは、事前にバッチ処理でコンテンツ数を集計し、マスタに保存した値をAPIで呼び出して利用しています。  

**フロント**
![Image from Gyazo](https://t.gyazo.com/teams/diverta/fe5a45d0d0f0595204ed7cf46fffbbf6.png)

**マスタ**
![Image from Gyazo](https://t.gyazo.com/teams/diverta/c9adbb823b5a1f4d4d5e85db229244f4.png)

**バッチ処理**
![Image from Gyazo](https://t.gyazo.com/teams/diverta/ad825c0c586c68fcd2aa2f67d0684448.png)

ユーザーのアクセス毎に、集計のためのAPIリクエストをする必要がないため、APIリクエストの数を削減できますが、コンテンツの更新やデプロイのタイミングによって、コンテンツ数の値がずれることがあります。  

アーカイブの作成については、以下の方法もありますのでコンテンツの更新頻度やキャッシュ戦略によって検討してください。
- ユーザーのアクセスがあったタイミングでAPIを利用して集計する。その際、エンドポイントはできる限りキャッシュされたリクエストになるよう調整する。
- アーカイブの集計をコンテンツの更新後のトリガーに設定する。

## 関連ドキュメント
- [Jamstackのアーキテクチャパターン](/ja/docs/about/jamstack-architecture/)
- [コーポレートサンプルサイトを利用する](/ja/docs/tutorials/kuroco-corporate-sample-site/)
- [コンテンツの更新時にGitHub Actionsを自動実行する](/ja/docs/tutorials/auto-run-github-with-contents-update/)