# next 프로젝트 세팅
$ npx create-next-app --typescript start-storybook
# storybook cli 설치
$ npm install --save-dev sb
# storybook 세팅
$ npx sb init
package.json파일에 위 이미지와 같이 자동으로 scripts가 생성된다
위와 같이 stories 폴더안에 관련한 파일들이 자동으로 생성된다
Story는 Storybook을 구성하는 기본 구성 단위이고, 컴포넌트는 기본적으로 하나 이상의 Story로 구성된다.
Story는 <컴포넌트이름>.stories.js 파일 안에 작성하고, 컴포넌트 파일과 같은 디렉토리 안에 작성한다.
# Storybook-project/
├── src/
│ └── components/
│ ├── ...
│ ├── MyButton.js # => Component
│ ├── MyButton.stories.js # => Story
│ └── ...
# .storybook/main.js
module.exports = {
"stories": [
"../stories/**/*.stories.mdx",
"../stories/**/*.stories.@(js|jsx|ts|tsx)",
"../src/components/**/*.stories.js" <---- 추가
]
}
Story파일은 컴포넌트 스토리 포맷(Component Story Format, CSF)으로 default export 한다
// src/stories/Button.stories.js
import React from 'react';
import { Button } from './Button';
export default {
title: 'Example/Button',
component: Button,
args: {
backgroundColor: '#000'
},
argTypes: {
backgroundColor: { control: 'color' },
},
};
...
title
title: 'Example/Button'
은 Example 그룹의 Button 스토리component
args
backgroundColor: '#000'
일 경우, backgroundColor
props로 #000
으로 전달된다argTypes
각 Story args의 행동(behavior), 타입(Type) 에 대한 설정
argTypes: {
backgroundColor: { control: 'color' },
zorba: { control: { type: 'range', min: 1, max: 30, step: 3 } }
},
decorators
parameters
excludeStories
# MyName.tsx
interface MyNameInterface {
/**
* 이건 name 이다
*/
name: string,
/**
* 이건 title 이다
*/
title: number
}
장점
Increase UI coverage
Target feedback
Build a component library
Test visually
import React from 'react';
import Task from './Task';
export default {
component: Task,
title: 'Task',
};
const Template = (args) => <Task {...args} />;
export const Default = Template.bind({});
Default.args = {
task: {
id: '1',
title: 'Test Task',
state: 'TASK_INBOX',
updatedAt: new Date(2021, 0, 1, 9, 0),
},
};
export const Pinned = Template.bind({});
Pinned.args = {
task: {
...Default.args.task,
state: 'TASK_PINNED',
},
};
export const Archived = Template.bind({});
Archived.args = {
task: {
...Default.args.task,
state: 'TASK_ARCHIVED',
},
};