StoryblokとAstro連携
Astroプロジェクトの立ち上げから、Storyblokを組み込んで実際にブラウザで確認するまでの全工程を解説します。
src/ ├ pages/ │ └ […slug].astro ← すべてのページを受ける │ ├ components/ │ ├ storyblok/ ← ★CMS用コンポーネント │ │ ├ Page.astro │ │ ├ Feature.astro │ │ ├ Grid.astro │ │ └ Teaser.astro │ │ │ └ ui/ ← 通常UI │ ├ Header.astro │ └ Footer.astro │ ├ layouts/ │ └ BaseLayout.astro │ └ lib/ └ storyblok.js ← API設定(任意)
import { defineConfig } from ‘astro/config’; import storyblok from ‘@storyblok/astro’; import tailwind from ‘@astrojs/tailwind’; // Tailwind等を使う場合
export default defineConfig({ // 1. インテグレーションの設定 integrations: [ storyblok({ // [必須] Storyblokの「Settings > Access Tokens」から取得したPreviewトークン accessToken: ‘YOUR_PREVIEW_TOKEN_HERE’,
// [必須] Storyblokのコンポーネント名(Key)とAstroコンポーネントのパスを紐付け
components: {
page: 'src/storyblok/Page',
feature: 'src/storyblok/Feature',
grid: 'src/storyblok/Grid',
teaser: 'src/storyblok/Teaser',
// ネストされたディレクトリでも指定可能
hero: 'src/components/storyblok/Hero',
},
// [任意] APIの基本設定
apiOptions: {
// リージョン指定(欧州以外、例えば米国データセンターを使う場合は 'us')
region: 'eu',
// データのキャッシュ設定など
https: true,
},
// [任意] ライブプレビュー用のBridge設定
bridge: true, // デフォルトでtrue。Visual Editorでのリアルタイム反映に必須
}),
tailwind(), // 他のツールと併用可能
],
// 2. 画像最適化の設定 (Storyblokの画像サービスを利用する場合) image: { domains: [‘a.storyblok.com’], // Storyblokの画像ドメインを許可 }, });
1. Astroプロジェクトの作成
まずはベースとなるAstroプロジェクトを作成します。ターミナルを開いて以下のコマンドを実行してください。
Bash
# プロジェクトの作成(対話形式で進みます)
npm create astro@latest my-astro-storyblok
# ディレクトリへ移動
cd my-astro-storyblok
# 依存パッケージのインストール
npm install
Tip: セットアップ中の質問では「Empty」テンプレートを選び、TypeScriptは「Strict」または「Recommended」にすることをおすすめします。
npm create astro@latest my-astro-storyblok で出てくるこの2つは、スタート地点の“完成度”の違いです。
Astro と Storyblok を組み合わせる前提で、実務目線で整理します。
結論(先に)
-
すぐ開発したい → Basic
-
完全に自分で設計したい → Minimal
① A basic, helpful starter project
👉 最初から“サイトっぽい形”が出来ている
含まれるもの
-
レイアウト(Layout.astro)
-
サンプルページ(index.astro)
-
CSS(ある程度整っている)
-
コンポーネント例
-
ナビゲーションなどの構造
イメージ
👉 「すでに骨組みがある家」
src/
├ layouts/
├ components/
├ pages/
│ └ index.astro
└ styles/
メリット
-
すぐ画面がそれっぽくなる
-
初心者でも迷わない
-
Storyblokのデータ差し込みだけに集中できる
デメリット
-
不要なコードが混ざる
-
構成を理解せず使うと後で詰まる
-
CMS設計とズレる可能性あり
② Use minimal (empty) template
👉 完全に空の状態からスタート
含まれるもの
-
ほぼ何もなし
-
index.astroのみ
イメージ
👉 「更地」
src/
└ pages/
└ index.astro
メリット
-
完全に自由設計
-
Storyblok中心の構成にしやすい
-
無駄がない(本番向き)
デメリット
-
最初の構築コストが高い
-
レイアウトも全部自作
-
初学者は迷いやすい
③ Storyblok連携視点での違い(重要)
ここが一番大事です👇
Basicの場合
- 既存のHTML構造に
→ Storyblokのデータを“流し込む”
👉 テンプレ主導
Minimalの場合
- Storyblokのblok設計に合わせて
→ Astro側を作る
👉 CMS主導(推奨)
④ 実務おすすめ
小規模・検証
👉 Basic
-
とりあえず動かしたい
-
学習目的
-
UIを気にしない
本番開発(かなり重要)
👉 Minimal(おすすめ)
理由:
-
Storyblokは「コンポーネント設計」が命
-
Astroもコンポーネントベース
つまり👇
👉 両方を合わせて設計した方が強い
⑤ 実務でよくある構成(Minimalベース)
src/
├ pages/
│ └ [...slug].astro
├ components/
│ ├ Page.astro
│ ├ Feature.astro
│ └ Grid.astro
└ lib/
└ storyblok.js
👉 Storyblokのblokと1対1対応させる
⑥ どっちを選ぶべきか(判断基準)
あなたの状態別👇
-
Astro初めて → Basic
-
CMS連携やる → Minimal
-
将来拡張する → Minimal
-
とりあえず触る → Basic
まとめ
| 項目 | Basic | Minimal |
|---|---|---|
| 初期状態 | 完成に近い | 空 |
| 学習コスト | 低い | 高い |
| 自由度 | 低い | 高い |
| Storyblok相性 | 普通 | ◎ |
一言でいうと
👉 Basic = 「完成された雛形」
👉 Minimal = 「プロ向けの土台」
2. Storyblokパッケージの導入
公式のインテグレーションを追加します。
Bash
npx astro add storyblok
実行すると、astro.config.mjs への自動追記とパッケージのインストールが行われます。
3. Storyblok側の準備
ブラウザで Storyblok にログインし、以下の設定を行います。
-
Spaceの作成: 新しいSpaceを作成します。
-
APIキーの確認: Settings > Access Tokens から
Previewトークンをコピーします。 -
コンポーネント作成: Block Library で
page(既にあるはずです)と、新しくfeatureという名前のコンポーネントを作ります。 -
Preview URLの設定: Settings > Visual Editor で、Locationを
http://localhost:4321/に設定します。
4. 設定ファイルとコンポーネントの記述
astro.config.mjs の編集
コピーしたAPIキーを貼り付け、Storyblokのコンポーネント名とAstroファイルを紐付けます。
JavaScript
import { defineConfig } from 'astro/config';
import storyblok from '@storyblok/astro';
export default defineConfig({
integrations: [
storyblok({
accessToken: 'ここに入力',
components: {
page: 'src/storyblok/Page',
feature: 'src/storyblok/Feature',
},
}),
],
});
コンポーネントファイルの作成
Storyblokから渡されるデータを表示するためのファイルを作ります。
src/storyblok/Page.astro
コード スニペット
---
import { storyblokEditable } from '@storyblok/astro';
import StoryblokComponent from '@storyblok/astro/StoryblokComponent.astro';
const { blok } = Astro.props;
---
<main {...storyblokEditable(blok)}>
{blok.body?.map((nestedBlok) => (
<StoryblokComponent blok={nestedBlok} />
))}
</main>
src/storyblok/Feature.astro
コード スニペット
---
import { storyblokEditable } from '@storyblok/astro';
const { blok } = Astro.props;
---
<section {...storyblokEditable(blok)} style="padding: 2rem; border: 1px solid #ccc;">
<h2>{blok.name}</h2>
</section>
5. 動的なルーティングの設定
Storyblokの階層構造をそのままURLにするため、[...slug].astro ファイルを作成します。
src/pages/[…slug].astro を作成し、以下を記述:
コード スニペット
---
import { useStoryblokApi } from '@storyblok/astro';
import StoryblokComponent from '@storyblok/astro/StoryblokComponent.astro';
const { slug } = Astro.params;
const storyblokApi = useStoryblokApi();
const { data } = await storyblokApi.get(`cdn/stories/${slug === undefined ? 'home' : slug}`, {
version: 'draft',
});
const story = data.story;
---
<html lang="ja">
<head>
<title>{story.name}</title>
</head>
<body>
<StoryblokComponent blok={story.content} />
</body>
</html>
6. 開発サーバーの起動
最後に、以下のコマンドでプレビューを開始します。
Bash
npm run dev
ブラウザで http://localhost:4321 を開きつつ、Storyblokの管理画面(Visual Editor)を開くと、Storyblokで追加した feature コンポーネントがリアルタイムで画面に反映されるはずです!
src/ ├ pages/ │ └ […slug].astro ← すべてのページを受ける │ ├ components/ │ ├ storyblok/ ← ★CMS用コンポーネント │ │ ├ Page.astro │ │ ├ Feature.astro │ │ ├ Grid.astro │ │ └ Teaser.astro │ │ │ └ ui/ ← 通常UI │ ├ Header.astro │ └ Footer.astro │ ├ layouts/ │ └ BaseLayout.astro │ └ lib/ └ storyblok.js ← API設定(任意)