前回は純粋な Next.js のプロジェクトに対して、XM Cloud で利用しているスタイルシートを適用した形で進めていきました。今回は Storybook をプロジェクトに追加します。
Storybookは、フロントエンド開発のためのオープンソースツールです。特にUIコンポーネントの開発、テスト、ドキュメント化に用いられます。詳しくは公式サイトをご覧ください。
Storybook をインストールする
Next.js に Storybook をインストールする手順は、以下に記載されています。
手順通りに進めていきましょう。まず、以下のコマンドを実行します。
npx storybook@latest init
実行をすると、インストーラーが Storybook をプロジェクトに追加していきます。しばらくすると、Storybook が起動します。
実際に追加された内容を確認すると、以下のフォルダが追加、またファイルが更新されています。
- .storybook
- src\stories
- .eslintrc.json
- .gitignore
- package.json
起動している環境を一度止めます。今回は src/stories の下でコンポーネントを動かすため、Tailwind CSS の content に1行追加します。
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
"./src/stories/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {},
plugins: [],
};
export default config;
Storybook を起動する際は、以下のコマンドで起動します。
npm run storybook
新しいコンポーネントを追加する
サンプルで表示されている Button のように、RichText のコンポーネントを表示できるように作業を進めていきます。Button のコンポーネントをコピーして作業を進めていきます。
RichText.stories.ts の作成
src\stories\Button.stories.ts のファイルをコピーして、src\stories\RichText.stories.ts を作成します。
RichText.tsx の作成
同様に src\stories\Button.tsx のファイルをコピーして、src\stories\RichText.tsx にファイルを作成します。
src\stories\RichText.tsx のファイルに関して、以下の点を変更します。まず、スタイルシートおよび Props の名前を変更します。
import React from 'react';
import './button.css';
interface ButtonProps {
export const Button = ({
primary = false,
size = 'medium',
backgroundColor,
label,
...props
}: ButtonProps) => {
これを以下のように書き換えます。
import React from 'react';
import './button.css';
interface RichTextProps {
export const RichText = ({
primary = false,
size = 'medium',
backgroundColor,
label,
...props
}: RichTextProps) => {
RichText.stories.ts を更新する
stories ファイルに関して、以下のように更新をします。
import { RichText } from './RichText';
const meta = {
title: 'XMCloud/RichText',
component: RichText,
} satisfies Meta<typeof RichText>;
上記の変更ができていれば、以下のように左側のメニューに RichText が追加されます。
XM Cloud で取得するデータの確認
XM Cloud の RichText コンポーネントは Sitecore からどういうデータを取得しているのでしょうか?これを確認するために、XM Cloud の src\tailwindcss\src\components\RichText.tsx に対して以下のコードを追加して確認します。
console.log(props);
Docker で起動している XM Cloud の環境で上記のデータは tailwindcss-rendering のコンテナでログとして表示されています。Visual Studio で該当するコンテナを右クリックして、View logs を選択すると、ターミナルのログが表示されます。
出力されたデータに関して、今回は以下のようになります。
{
rendering: {
uid: 'df81e62c-4d5d-4301-a24c-d90f76a81e20',
componentName: 'RichText',
dataSource: '/sitecore/content/Tailwindcss/Tailwindcss/Home/Data/Text 1',
params: {
GridParameters: 'basis-full',
FieldNames: 'Default',
DynamicPlaceholderId: '2'
},
fields: { Text: [Object] }
},
modifyComponentProps: [Function: modifyComponentProps],
componentFactory: [Function (anonymous)],
fields: {
Text: {
value: '<h1>Heading 1</h1>\n' +
'<p>paragraph</p>\n' +
'<h2>Heading 2</h2>\n' +
'<p>paragraph</p>'
}
},
params: {
GridParameters: 'basis-full',
FieldNames: 'Default',
DynamicPlaceholderId: '2',
styles: 'basis-full '
}
}
プロジェクトの微調整
上記の XM Cloud から取得するデータを扱うことができるように、sitecore-jss のパッケージを Next.js のプロジェクトに追加します。
npm install -D @sitecore-jss/sitecore-jss-nextjs
これで Sitecore JSS のパッケージを利用してコードを記述することができます。src\stories\RichText.tsx のファイルに関しては、SXA のコンポーネントの RichText.tsx のファイルに入れ替えてください。
続いて src\stories\RichText.stories.ts のファイルですが、XM Cloud から取得したデータをサンプルとして用意をして、以下のように書き換えます。
import type { Meta, StoryObj } from "@storybook/react";
import { Default as RichText } from "./RichText";
const meta = {
title: "SXAStarter/RichText",
component: RichText,
tags: ["autodocs"],
argTypes: {
fields: { control: 'object' },
params: { control: 'object' },
},
} satisfies Meta<typeof RichText>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {
args: {
fields: {
Text: {
value: '<h1>Heading 1</h1>\n<p>Paragraph</p>\n<h2>Heading 2</h2>\n<p>Paragraph</p>',
},
},
params: {
styles: 'basis-full'
},
},
};
この状態ではコンポーネントは Tailwind CSS のスタイルシートを読み込んでいない形となります。これに関しては、 .storybook\preview.ts で以下のコードを追加します。
import "../src/assets/globals.css";
これで準備が完了です。設定後は、以下のように動作していることを確認できました。
まとめ
XM Cloud で作成する Next.js のコンポーネントを XM Cloud の環境をなしに表示することができました。また、Storybook を利用することで、パラメーターの値を変更したらどのように画面の変更があるのか?というのも確認することができました。
今回は別の Next.js のプロジェクトにおいて、Headless SXA のコンポーネントを Storybook を利用して表示できるようにしてみました。このサンプルは、以下のリポジトリで公開しています。