Next.js + TailwindcssのプロジェクトにStorybookを導入
Next.js + Tailwindcss + Typescripで構築しているプロジェクトにStorybookを導入します。Next.jsでプロジェクトを作成して、Vercelで公開するまでをまとめます。
技術スタックは下記の通りです。
- Next.js
- Tailwindcss
- Storybook
- Typescript
Next.jsのセットアップ
nextjsでアプリを作成します。
npx create-next-app --ts --use-npm nextjs-tailwindcss-storybook
Typescript化します。
cd nextjs-tailwindcss-storybook
npm install --save-dev typescript @types/react
touch tsconfig.js
Next.jsを起動します。
npm run dev
https://localhost:3000
をブラウザで開いて、Next.jsのウェルカムページがでればOK。
Tailwindcssのセットアップ
tailwindcssをセットアップします。
npm install --save-dev tailwindcss postcss autoprefixer
設定ファイルを生成します。
npx tailwindcss init -p
tailwind.config.js
を編集します。
module.exports = {
- purge: [],
+ purge: ['./pages/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}'],
darkMode: false, // or 'media' or 'class'
theme: {
extend: {},
},
variants: {
extend: {},
},
plugins: [],
}
styles/global.css
を下記の内容に書き換えます。
@tailwind base;
@tailwind components;
@tailwind utilities;
pages/index.js
とstyles/Home.module.css
は削除します。
pages/index.tsx
を作成して、内容は下記の通りにします。
export default function Home() {
return (
<div>
<h1 className="text-red-500">Hello, World!</h1>
</div>
);
}
「Hello, World!」が赤文字で出力できればセットアップ完了です。
Storybookのセットアップ
Storybookをセットアップします。
必要なパッケージ類をインストールします。
npm install --save-dev @storybook/addon-actions @storybook/addon-essentials @storybook/addon-links @storybook/react @storybook/addon-postcss
.storybook/main.js
というファイル名で設定ファイルを作成します。
module.exports = {
stories: ["../stories/**/*.stories.@(js|mdx|tsx)"],
addons: [
"@storybook/addon-links",
"@storybook/addon-essentials",
"@storybook/addon-postcss",
],
};
公式のドキュメントでは、pages
と同じ階層に.stories.tsx
をおくのが慣習のようですが、Next.jsだとこれだとビルド時に問題があるので別のディレクトリにいれるようにしています。
先ほど設定した、Next.jsとは別の仕組みでコンポーネントを表示するので、Storybookに表示するためのファイルを作成します。
import "../styles/globals.css";
export const parameters = {
actions: { argTypesRegex: "^on[A-Z].*" },
};
Storybookを起動するためのスクリプトを、package.json
に追加します。
"scripts": {
"dev": "next dev",
"build": "next build",
- "start": "next start"
+ "start": "next start",
+ "storybook": "start-storybook -s public -p 6006",
+ "storybook:build": "build-storybook -s public"
},
試しに、ホームページのストーリーを作成します。
import Home from "./index";
export default {
title: "pages/Home",
component: Home,
};
const Template = () => <Home />;
export const Default = Template.bind({});
Default.args = {};
Stoybookを起動します。
npm run storybook
http://localhost:6006
に接続して、Storybookで内容を確認できます。
HTMLのソースの表示
コードを表示するのに、公式がだしているStorysourceというアドオンがあります。
ただ、Tailwindcssの場合、ストーリーのソースよりも、TaiwindUIみたいにReactのソースをコピペできると便利なんだけどな。それっぽいアドオンは見当たらない。
とりあえず、HTMLのソースが@whitespace/storybook-addon-html
がよさそう。
npm install --save-dev @whitespace/storybook-addon-html
.storybook/main.js
にアドオンを追加します。
module.exports = {
stories: ["../pages/**/*.stories.@(js|mdx|tsx)"],
addons: [
"@storybook/addon-links",
"@storybook/addon-essentials",
"@storybook/addon-postcss",
"@storybook/addon-postcss",
+ "@whitespace/storybook-addon-html",
],
};
「HTML」というタブが表示されて、コードを参照できるようになります。
Storysourseアドオンの追加
ストーリーでコードを表示できるようにStorysourceアドオンを追加。
npm install --save-dev @storybook/addon-storysource
TypescriptだとStorysourceでソースが表示できないの、webpackの設定を追加。
addons: [
...
"@storybook/addon-storysource",
],
webpackFinal: async (config) => {
// remove existing source-loader in place
config.module.rules.splice(6, 1);
config.module.rules = [
...config.module.rules,
{
test: /\.stories\.[jt]sx?$/,
loaders: [
{
loader: require.resolve("@storybook/source-loader"),
options: { parser: "typescript", injectStoryParameters: false },
},
],
enforce: "pre",
},
];
return config;
},
画像の表示
Next.jsでpublic
に入れた画像を表示する場合、Storybookでも表示するには、起動オプションで指定します。
下記のようにオプションを追加します。
"storybook": "start-storybook -s public -p 6006"
next/imageの表示
next/image
を使っていると、Storybookで表示できないので、下記をpreview.js
に追加する。
import * as NextImage from 'next/image'
const OriginalNextImage = NextImage.default
Object.defineProperty(NextImage, 'default', {
configurable: true,
value: (props) => <OriginalNextImage {...props} unoptimized />,
})
参考
vercelにデプロイ
GitHubなどにコミットしておきます。
Vercelのダッシュボードから新しくプロジェクトを作成して、リポジトリの一覧から該当のリポジトリを選択します。
それぞれの欄に下記を参考に入力します。
- PROJECT NAME
デフォルトでリポジトリ名になるので、そのままでよければそのままで、アプリ自体もVercelで公開する場合は、名前が被ってしまうので何か別の名前を入力します - FRAMEWORK PRESET
「Other」を選択します
「Build and Output Settings」には下記を入力します。
- BUILD COMMAND: npm run storybook:build
- OUTPUT DIRECTORY: storybook-static
- INSTALL COMMAND: npm install
以上で「Deploy」ボタンを押して、デプロイを開始します。