Amazonで商品を見る セール会場へ

Nuxt3 + microCMS│基本的なサイトの作り方

この記事はNuxt 3のディレクトリ構成を対象にした実装記録です。

新規作成コマンドでv3テンプレートを指定し、Nuxt 4の初期構成と混在させないでください。

Jamstack、静的サイトの勉強としてNuxt3 + microCMSを触ってみました。

その備忘録です。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

Nuxt3 + microCMSで基本的なサイトを作成する

Nuxt3でサイトを構築、さらにmicroCMSの内容を表示するところまで作成してみます。

Nuxtの初期環境構築

npmやNode .js、git等のツールの導入は省きます。

必要なものを事前に入れておいてください。

ちなみに自分の環境はMacです。

Nuxtの公式サイトに沿って進めます。

cd Documents

最後に初期状態をgitでコミットしておきましょう。

作業の区切りごとにコミットしておきましょう。

トップページの作成

app.vueのファイルを開きます。

初期画面の表示を消して、ページを表示するように書きます。

<template>
  <NuxtLayout>
    <NuxtPage />
  </NuxtLayout>
</template>

次にpagesというフォルダを作成して、index.vueというファイルを作成します。

<template>
  <div>
	テスト!
  </div>
</template>

表示を確認しましょう。

テンプレートにテストの文字列を追加してブラウザで表示確認した画面。

ヘッダーとフッターの作成

まずはlayoutsというフォルダを作成して、default.vueを作成します。

<template>
	<div>
	  <TheHeader />

    <slot />

    <TheFooter />
  </div>
</template>

ここでヘッダー(TheHeader)とフッター(TheFooter)を作成していきます。

componentsというフォルダを作成して、TheHeader.vueというファイルを作成します。

<template>
	<header>
		ヘッダーだよ!
	</header>
</template>

同じくフッター(TheFooter.vue)も作ります。

<template>
	<footer>
		フッターだよ!
	</footer>
</template>

確認しましょう。

レイアウトにフッターを追加した後のブラウザでの表示確認画面。

microCMSで作成したお知らせを表示する

CMS(microCMS)も入れたかったので、表示させてみます。

microCMSのアカウントを作成

microCMSのアカウントを作成して、APIキーを取得しておきます。

お知らせはチュートリアルガイドに従って記事を作成しておきましょう。

チュートリアルガイドに従って作成されたmicroCMSのコンテンツ詳細画面。

nuxt-microcms-moduleの導入

NuxtとmicroCMSを繋ぐための公式プラグインがあるので導入します。

VSCodeのターミナルで以下を実行

npm install nuxt-microcms-module

package.jsonに以下が記載されていればOKです。

"nuxt-microcms-module": "^3.0.2",

envの作成

.envというファイルを作成して、microCMSに取得したいドメイン名とAPIキーを入れておきます。

MICRO_CMS_DOMAIN = ドメイン名
MICRO_CMS_API_KEY = APIキー

.envを作成して、APIキーはgitに上げないように対策しましょう。

nuxt.config.tsに以下のコードを記載します。

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  compatibilityDate: '2024-04-03',
  devtools: { enabled: true },
  modules: [
    [
    'nuxt-microcms-module',
    {
      serviceDomain: process.env.MICRO_CMS_DOMAIN,
      apiKey: process.env.MICRO_CMS_API_KEY,
    },
    ],
  ],
});

microCMSへの接続設定です。APIキーの非公開性は、使用するモジュールのバージョンと出力を確認して判断します。

記事リストの作成

試しにトップページに記事リストを表示してみましょう。

index.vueを編集します。

お知らせの記事群から公開日とタイトルを取得してリストで表示します。

<script setup lang="ts">
type News = {
  id: string,
  publishedAt: string,
  title: string;
};

const { data: newsList } = await useMicroCMSGetList<News>({
  endpoint: 'news',
  queries: { fields: ['id', 'publishedAt', 'title'] },
});
</script>

<template>
	<ul>
		<li v-for="news in newsList?.contents" :key="news.id">
		<NuxtLink :to="`/news/${news.id}`">
			{{ news.title }}
		</NuxtLink>
		</li>
	</ul>
</template>

詳細は先ほど貼ったnuxt-microcms-moduleのドキュメントに記載されています。

確認しましょう。

公式モジュール導入後にデータ連携を確認している画面。

お知らせ詳細ページの作成

Pagesフォルダにnewsというフォルダを作成。

そこにindex.vueファイルを作成します。

トップページ

pages > index.vue

前項で表示させたお知らせ一覧は消して、リンクだけ作成しました。

<template>
  <div>
	トップページ
	<NuxtLink to="/news">
	  お知らせ一覧へ
	</NuxtLink>
  </div>
</template>

お知らせの一覧ページ

pages > news > index.vue

前項で作成したお知らせ一覧はこちらで表示します。

<script setup lang="ts">
type News = {
  id: string,
  publishedAt: string,
  title: string
}

const { data: newsList } = await useMicroCMSGetList<News>({
  endpoint: 'news',
  queries: { fields: ['id', 'publishedAt', 'title'] },
})
</script>

<template>
	<ul>
		<li v-for="news in newsList?.contents" :key="news.id">
			<NuxtLink :to="`/news/${news.id}`">
				{{ news.title }}
			</NuxtLink>
		</li>
	</ul>
</template>

newsフォルダのindex.vueと同じ階層に[id].vueというファイルを作成して、以下のコードを記載します。

[id]の部分は動的に記事のID名になるようにしています。

お知らせ詳細

pages > news > [id].vue

<script setup lang="ts">
const route = useRoute()
const contentId = route.params.id.toString()

type News = {
  id: string,
  publishedAt: string,
  title: string,
  content: string
}

const { data: newsDatail } = await useMicroCMSGetListDetail<News>({
  endpoint: 'news',
  contentId: contentId,
  queries: { fields: ['id', 'publishedAt', 'title', 'content'] },
})
</script>

<template>
	<div>
		{{ newsDatail?.title }}
		{{ newsDatail?.publishedAt }}
		<div v-html="newsDatail?.content" />
	</div>
</template>

確認します。

お知らせ一覧

実装したお知らせ一覧のブラウザ表示確認画面。

お知らせ詳細

実装したお知らせ詳細ページのブラウザ表示確認画面。

という感じでmicroCMSで作成したお知らせ記事を表示できました!

見た目を変更する

SCSSで見た目を調整していきます。

NuxtのSCSSを設定します。

公式サイトから下記のコマンドをターミナルで実行します。

npm install -D sass

package.jsonに以下が記載されていればOKです。

  "devDependencies": {
    "sass": "^1.79.5"
  }

main.scssの作成

assetsフォルダを作成、さらにその中にscssフォルダを作成します。

scssフォルダの中にmain.scssを作成します。

共通のCSSはmain.scssに作成します。

nuxt.config.ts

css: ['~/assets/scss/main.scss']の記述を追加

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  compatibilityDate: '2024-04-03',
  devtools: { enabled: true },
  modules: [
    [
    'nuxt-microcms-module',
    {
      serviceDomain: process.env.MICRO_CMS_DOMAIN,
      apiKey: process.env.MICRO_CMS_API_KEY,
    },
    ],
  ],
  css: ['~/assets/scss/main.scss']
});

固有のCSSはそれぞれの.vueファイルの中に書きます。

例えばヘッダーを赤くしたい時はTheHeader.vueの最後に下記のコードを追加します。

<style lang="scss" scoped>
header {
  background: red;
}
</style>

scopedと書いてあるので、そこだけにSCSSが適応されます。

基本的なことは以上です。

この記事で紹介しているコードは、GitHubのMOTOKI-LLC/WAZA-codeにもまとめています。

一覧から詳細へ移動できるか確認する

一覧ではリンク生成に使うidをfieldsへ含め、リンク先を/news/記事IDに揃えます。

publishedAtはJSONでは日付文字列なので、TypeScript型はstringとして受け取り、日付計算をするときだけDateへ変換します。

開発サーバーのポートが使用中なら別のポートになるため、ターミナルに表示されたURLを開いてください。

空の一覧、存在しないID、APIエラー、詳細ページの直接再読み込みも複製環境で確認します。

APIキーは読み取り対象を必要なAPIへ限定し、ブラウザーへ配信するJavaScriptや通信にキーが含まれないことを確認します。

今回の修正では実microCMS接続と本番ビルドの検証は済んでいません。

戻す場合は変更前のファイルとロックファイルへ戻します。

作成コマンドの参照:Nuxt 3公式インストール手順。

  • URLをコピーしました!

制作・運用のご依頼はこちら

MOTOKI合同会社のサービス

WordPressの制作・カスタマイズ・高速化・SEO対策・保守まで、Webサイトに関する業務を一括で承ります。料金はサービスごとに公開しています。

WAZAの有料記事のサブスクリプションも開始しました。

目次