楽天セール開催中!ポイント最大11倍! セール会場へ

Nuxt 3 + microCMSのサイト作成記録|旧構成の手順と制限

この記事はNuxt 3のディレクトリ構成を対象にした過去の学習・実装記録です。Nuxt 3は2026年7月31日で通常サポートが終了しています。新しい公開サイトは、Nuxt公式のサポート状況を確認し、サポート中の版で構築してください。

旧構成をローカルで学習する場合だけv3テンプレートを指定します。以下は開発サーバーで一覧と詳細を表示する例で、静的書き出しや本番配信、Nuxt 4への移行まで検証した手順ではありません。

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

その備忘録です。

目次

著者

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

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

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

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

Nuxtの初期環境構築

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

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

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

以下はMacのDocuments内に新しい学習用フォルダを作る例です。Node.jsの要件を公式で確認し、作成時のパッケージ管理にはnpmを選びます。作成後は依存関係をインストールして起動し、ターミナルに表示されたURLを開きます。

cd ~/Documents
npm create nuxt@latest nuxt3-microcms-study -- -t v3
cd nuxt3-microcms-study
npm install
npm run dev

最後に初期状態を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断片は当時の導入例です。実際に入ったバージョンはnpm lsとロックファイルで確認し、現在のインストール結果がこの番号になるとは考えないでください。

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

envの作成

.envにはサービスID(XXXX.microcms.ioのXXXX部分)と、学習用コンテンツの読み取り専用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への接続設定です。掲載当時のモジュール3.0.2は、開発モードではAPIキーをpublic runtimeConfigへ入れる実装です。3.0.2のソースで確認できます。target: serverでも開発時のキー非公開は保証されません。本番用キーは使わず、共有公開しないローカルの学習環境に限定してください。新しい版では仕様を改めて確認します。

記事リストの作成

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

index.vueを編集します。

APIのエンドポイントをnewsにし、title(テキスト)とcontent(リッチエディタ)を作り、テスト記事を公開しておきます。一覧ではid・公開日・タイトルを取得し、タイトルを表示します。次の例にはページ送りがないため、全件取得には別途limitとoffsetの実装が必要です。

<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 external :to="`/news/${news.id}`">
			{{ news.title }}
		</NuxtLink>
		</li>
	</ul>
</template>

モジュール3.0.2の既定設定では、本番のクライアント側へAPIキーを出しません。一方、クライアント側での追加取得を仲介するサーバーAPIもこの例にはないため、通常のSPA遷移で認証付き取得が成功するとは限りません。以下のNuxtLinkにはexternalを指定し、サーバーで取得する通常のページ遷移にしています。静的ホスティングだけで動作する保証ではありません。

確認しましょう。

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

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

小文字のpagesフォルダにnewsというフォルダを作成します。

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

トップページ

pages > index.vue

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

<template>
  <div>
	トップページ
	<NuxtLink external 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 external :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: newsDetail } = await useMicroCMSGetListDetail<News>({
  endpoint: 'news',
  contentId: contentId,
  queries: { fields: ['id', 'publishedAt', 'title', 'content'] },
})
</script>

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

詳細のv-htmlはCMSのHTMLを描画するため、編集権限を持つ信頼できる人が管理した内容だけを対象にします。不特定ユーザーの入力をそのまま流さないでください。Vue公式のHTML描画に関する注意点も確認します。

お知らせ一覧

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

お知らせ詳細

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

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

見た目を変更する

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

NuxtのSCSSを設定します。

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

npm install -D sass

以下のpackage.json断片は当時の導入例です。実際に入ったバージョンはnpm lsとロックファイルで確認し、現在のインストール結果がこの番号になるとは考えないでください。

  "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や通信にキーが含まれないことを確認します。

今回の修正では公式資料とモジュール3.0.2のソースを照合しました。実microCMS接続、本番ビルド、静的生成、エラー時の表示は未検証です。掲載コードだけで本番運用に必要な処理が揃うわけではありません。

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

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

よくある質問:Nuxt3 + microCMSで基本的なサイトを作る方法

この記事は、どんな内容ですか?

記事では、Jamstack、静的サイトの勉強としてNuxt3 + microCMSを触った実装記録です。Nuxt3でサイトを構築し、さらにmicroCMSの内容(お知らせ)を表示するところまで作成しています。

Nuxt 4でも、そのまま使えますか?

そのままの適用は対象外です。この記事は通常サポートを終了したNuxt 3の学習記録で、新規の公開サイトにはサポート中の版を選びます。v3指定は旧構成をローカルで確認するためのものです。

サイトは、どんな順で作りますか?

記事では、Nuxtの初期環境構築(npmやNode.js、git等の導入は省略、環境はMac)、トップページの作成(app.vueを編集し、pagesフォルダにindex.vueを作成)、ヘッダーとフッターの作成(layoutsにdefault.vue、componentsにTheHeader.vueとTheFooter.vue)、microCMSで作成したお知らせの表示、見た目の変更(SCSS)、の順に進めます。作業の区切りごとにgitでコミットしておきます。

microCMSの接続は、どう設定しますか?

記事では、microCMSのアカウントを作成してAPIキーを取得し、.envファイルに取得したいドメイン名とAPIキーを入れ、nuxt.config.tsに接続設定を記載します。APIキーはgitに上げないように対策しましょう。

APIキーは、ブラウザーから見えませんか?

掲載当時の3.0.2では開発モードの公開設定へキーが入るため、ブラウザーから見えないとはいえません。学習用の読み取り専用キーでローカル確認する範囲に限定します。APIキーは読み取り対象を必要なAPIへ限定し、ブラウザーへ配信するJavaScriptや通信にキーが含まれないことを確認します。

一覧から詳細ページへのリンクは、どう作りますか?

記事では、pages/newsにindex.vue(一覧)とidを使う動的な詳細ページのファイルを作成します。一覧ではリンク生成に使うidをfieldsへ含め、リンク先を/news/記事IDに揃えます。publishedAtはJSONでは日付文字列なので、TypeScript型はstringとして受け取り、日付計算をするときだけDateへ変換します。

確認すべきことと、検証の範囲は?

記事では、開発サーバーのポートが使用中なら別のポートになるため、ターミナルに表示されたURLを開いてください。空の一覧、存在しないID、APIエラー、詳細ページの直接再読み込みも複製環境で確認します。今回の修正では公式資料とモジュール3.0.2のソースを照合しました。実microCMS接続、本番ビルド、静的生成、エラー時の表示は未検証です。掲載コードだけで本番運用に必要な処理が揃うわけではありません。戻す場合は変更前のファイルとロックファイルへ戻します。ツールの仕様は変わる可能性があるため、最新は公式で確認してください。

  • URLをコピーしました!

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

MOTOKI合同会社のサービス

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

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

目次