tomodaction

目次

サムネイル画像

Astro v4からv5へのContent Collectionsアップデートのメモ

筆者: @timdaik

最終更新: 2026/04/01

タグ:

  • Tech
  • 駄文

Git Submodulesを利用してAstroサイトの各コンテンツ管理をObsidianで行うではこのブログにおける記事コンテンツの管理をObsidianとGit Submodulesを利用する方法にアップデートした内容をまとめた。

ところでGit Submodulesで管理するために、元々src/content/blog, src/content/workといったディレクトリ構造だったのを、src/blogs, src/worksというようにsrc直下に配置したくなった。

というより、それぞれをリポジトリとして管理するにあたって、GitHub上で良い感じのリポジトリ名にしたいな~と考えていたところ、「今のディレクトリ構造だとページ表示のパスが/content以下のディレクトリ名にそのまま使われてしまい不格好になってしまう!!」という勘違いを起こした。

例えばsrc/content/portfolio-blogsとすると、SSGで/blogではなくportfolio-blogsというページ名になってしまうではないか!と錯乱したわけだ。 (実際はコンテンツの置いているディレクトリ名は無関係でこれらを呼び出して表示するページ側の問題)

そこでContent Collectionsについて調べ出したところアップデートの旨を知ったのでついでに更新しようと決めたのだった。

このような勘違いから始まったアップデートによって、運よく仕様とニーズがハマったわけだ。

あとはただただバージョンアップのメモ

  • 定義ファイルは/src/content/config.tsから/src/content.config.tsに移動
  • コンテンツファイルの位置を指定するにはglob()を利用する
import { defineCollection, z } from "astro:content";
import { glob } from "astro/loaders";

const blogs = defineCollection({
	loader: glob({ pattern: "**/*.md", base: "./src/blogs" }),
	schema: ({ image }) =>
		z.object({
			cover: image(),
			title: z.string(),
			author: z.string(),
			updatedAt: z.string(),
			tag: z.array(
				z.enum([
					"ニュース",
					"日常",
					"ポエム",
					"読書",
					"振り返り",
					"年の総括",
					"イベント",
					"Tech",
					"教養",
					"高専",
					"NUT",
				]),
			),
			draft: z.boolean().default(false),
		}),
});
  • コンテンツのユニークIDがslugからidに変更された
    • Markdownのフロントマターにslugを加えるなどしてカスタムIDを生成することも可能

参考