Contents
Outline
In this blog post, I will introduce how to use Storybook for Component Driven Development in the Next.js project based on TypeScript.
You can see the full source code of this blog post on the following link.
Blog list
This blog post is a series. If you want to check other blog posts of the series, see the links below.
- [Next.js] Getting Started
- [Next.js] TypeScript
- [Next.js] Prettier
- [Next.js] Absolute path
- [Next.js] Test
- [Next.js] Storybook
- [Next.js] Change Storybook background color
- [Next.js] Localization
- [Next.js] MUI
Create Next.js project with TypeScript
To use Storybook in the Next.js project based on TypeScript, execute the following command to create a new Next.js project with TypeScript.
npx create-next-app --typescript start-storybook
Install Storybook
To use Storybook for Component Driven Development in the Next.js project, we need to install Storybook. Execute the following command to install Storybook.
# cd start-storybook
npm install --save-dev sb
Initialize Storybook
To use Storybook, we need to initialize Storybook to install required libraries. Execute the following command to initialize Storybook.
npx sb init --builder webpack5
And then, you can see Storybook is initialized automatically like the below.
sb init - the simplest way to add a Storybook to your project.
• Detecting project type. ✓
There seems to be a Storybook already available in this project.
Apply following command to force:
sb init [options] -f
🔎 checking 'cra5'
🔎 checking 'webpack5'
🔎 checking 'angular12'
🔎 checking 'mainjsFramework'
Unable to find storybook main.js config, skipping
🔎 checking 'eslintPlugin'
Lastly, you can see a question like the below.
? Do you want to run the 'eslintPlugin' fix on your project? › (y/N)
If you use ESLint to check the code style, press the y key to proceed. If not, press the N key to skip. In this blog post, I pressed the y key for proceeding.
And then, Storybook installs the required libraries and writes the execution script to the package.json automatically like the below.

{
...
"scripts": {
...
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook"
},
...
"devDependencies": {
"@babel/core": "^7.17.7",
"@storybook/addon-actions": "^6.4.19",
"@storybook/addon-essentials": "^6.4.19",
"@storybook/addon-interactions": "^6.4.19",
"@storybook/addon-links": "^6.4.19",
"@storybook/react": "^6.4.19",
"@storybook/testing-library": "^0.0.9",
"babel-loader": "^8.2.3",
"eslint-plugin-storybook": "^0.5.7",
...
}
}
Also, to show how to use Storybook, Storybook creates the configuration files and sample codes like the below.
./.storybook/...: Configuration files forStorybook../stories/...: Sample codes forStorybook.
configure public folder
To make Storybook recognize the public folder that includes the static files in Next.js, modify the scripts like the below.
{
...
"scripts": {
...
"storybook": "start-storybook -p 6006 -s ./public",
"build-storybook": "build-storybook -s public"
},
...
}
Execute Storybook
To check Storybook is installed and configured well, let’s try to execute Storybook. Execute the following command to execute Storybook.
npm run storybook
And then, the browser will open automatically with http://localhost:6006 and you can see the screen like the below.

This page content is from the ./stories/Introduction.stories.mdx file.
Check Storybook
When you click the Button > Primary on the left of the screen in Storybook, you can see the screen like the below.

This page content is from the ./stories/Button.stories.tsx file.
Check sample code
To see more details, let’s see the sample code. The Button component(./stories/Button.tsx) is like the following.
import React from 'react';
import './button.css';
interface ButtonProps {
primary?: boolean;
backgroundColor?: string;
size?: 'small' | 'medium' | 'large';
label: string;
onClick?: () => void;
}
export const Button = ({
primary = false,
size = 'medium',
backgroundColor,
label,
...props
}: ButtonProps) => {
...
};
As you can see, the Button component has various Props like primary and backgroundColor. Next, the Storybook file(./stories/Button.stories.tsx) is like the following.
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import { Button } from './Button';
export default {
title: 'Example/Button',
component: Button,
argTypes: {
backgroundColor: { control: 'color' },
},
} as ComponentMeta<typeof Button>;
const Template: ComponentStory<typeof Button> = (args) => <Button {...args} />;
export const Primary = Template.bind({});
Primary.args = {
primary: true,
label: 'Button',
};
export const Secondary = Template.bind({});
Secondary.args = {
label: 'Button',
};
export const Large = Template.bind({});
Large.args = {
size: 'large',
label: 'Button',
};
export const Small = Template.bind({});
Small.args = {
size: 'small',
label: 'Button',
};
First, you need to prepare the component to show it on Storybook.
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import { Button } from './Button';
export default {
title: 'Example/Button',
component: Button,
argTypes: {
backgroundColor: { control: 'color' },
},
} as ComponentMeta<typeof Button>;
const Template: ComponentStory<typeof Button> = (args) => <Button {...args} />;
...
When you configure control: 'color' to backgroundColor in argTypes, you can see the color picker on Storybook like the below.

And then, you need to write Story.
...
export const Primary = Template.bind({});
Primary.args = {
primary: true,
label: 'Button',
};
...
You can create Story to set the Props of the Button component to args in here.
Configure Storybook
First, we need to configure Storybook to use globals.css of Next.js. Open the ./storybook/preview.js file and modify it like the below.
import '../styles/globals.css'
export const parameters = {
...
}
Currently, we can only write the Story in the ./stories folder. However, we normally create and manage the components in the ./components folder or others.
If you want to create Story to other folder, you should modify the ./.storybook/main.js file. Open the ./.storybook/main.js file and modify it like the below.
module.exports = {
"stories": [
"../**/*.stories.mdx",
"../**/*.stories.@(js|jsx|ts|tsx)"
],
...
}
From now, you can write Story with the .stories.tsx file extension in any folder and Storybook recognizes them to show them. To check it, Create the ./components/SampleButton folder, and copy and rename the following files.
./stories/button.css>./components/SampleButton/index.css./stories/Button.stories.tsx>./components/SampleButton/index.stories.tsx./stories/Button.tsx>./components/SampleButton/index.tsx
And, open the ./components/SampleButton/index.tsx file and modify it like the below.
...
import './index.css';
...
export const SampleButton = ({
...
}: ButtonProps) => {
...
};
And, open the ./components/SampleButton/index.stories.tsx file and modify it like the below.
...
import { SampleButton } from '.';
...
export default {
title: 'Example/SampleButton',
component: SampleButton,
...,
} as ComponentMeta<typeof SampleButton>;
const Template: ComponentStory<typeof SampleButton> = (args) => (
<SampleButton {...args} />
);
...
We’ve modified the Storybook configuration, so we need to restart Storybook to apply it. When you restart Storybook, you can see the SampleButton component in the Storybook screen like the below.

Complete
Done! we’ve seen how to install and configure Storybook for Component Driven Development in the Next.js project based on TypeScript. From now, when you develop an app, you can focus to develop the components with Storybook.
Was my blog helpful? Please leave a comment at the bottom. it will be a great help to me!
App promotion
Deku.Deku created the applications with Flutter.If you have interested, please try to download them for free.



