storybook 에서 제공하는 튜토리얼을 진행하고 정리한 글
최신화 되어 있는 영문버전을 보고 진행했습니다.
template clone
npx degit chromaui/intro-storybook-react-template taskbox
cd taskbox -> yarn
yarn storybook 으로 테스트 가능
컴포넌트 중심의 개발 방법론으로 작은 컴포넌트부터 페이지까지 상향식으로 개발하는 것을 말함
CDD를 사용하면 개발하면서 겪는 규모의 복잡성을 해결하는데 도움이 됨
src/components/ 경로에
Task.jsx 와 Task.stories.jsx 파일을 생성한다
컴포넌트 단위로 storybook을 테스트 하기 때문에 컴포넌트와 같은 경로에 만들어주는게 좋을거 같다
Task.stories.jsx 파일
import Task from "./Task";
export default {
component: Task,
title: "Task",
tags: ["autodocs"],
};
.
.
.
component -- 테스트할 컴포넌트title -- 사이트바에 표시할 이름(컴포넌트 이름으로 하는게 겹치지 않고 좋을거 같음)tags -- ["autodocs"] 로 지정하면 자동으로 문서 생성해줌원문
- component -- the component itself
- title -- how to group or categorize the component in the Storybook sidebar
- tags -- to automatically generate documentation for our components
튜토리얼에는 style 파일이 추가 되어 있기 때문에 import 만 해주면 됨
.storybook/preview.js 경로로 이동해서
가장 상단에 import '../src/index.css' 를 추가해준다
typescript를 사용하지 않을때 사용하는거 같음
import PropTypes from "prop-types"; 를 컴포넌트에 import
아래의 코드를 컴포넌트 하단에 추가
이렇게 하면 잘못된 값이 전달될때 콘솔에 에러가 출력됨
Task.propTypes = {
/** Composition of the task */
task: PropTypes.shape({
/** Id of the task */
id: PropTypes.string.isRequired,
/** Title of the task */
title: PropTypes.string.isRequired,
/** Current state of the task */
state: PropTypes.string.isRequired,
}),
/** Event to change the task to archived */
onArchiveTask: PropTypes.func,
/** Event to change the task to pinned */
onPinTask: PropTypes.func,
};
최대 57%의 접근성 문제를 잡아주는 패키지 라고 한다.
yarn add --dev @storybook/addon-a11y .storybook/main.js 경로 파일 수정'@storybook/addon-a11y' 추가yarn storybook 실행아토믹 패턴 처럼 작은 컴포넌트(Task)를 불러와서 큰 컴포넌트(TaskList)를 구현 하는 방법
Task의 propsTypes나, Default.args 를 사용하는 방법을 알아두면 좋을거 같다.
TaskList.propTypes = {
/** Checks if it's in loading state */
loading: PropTypes.bool,
/** The list of tasks */
tasks: PropTypes.arrayOf(Task.propTypes.task).isRequired,
/** Event to change the task to pinned */
onPinTask: PropTypes.func,
/** Event to change the task to archived */
onArchiveTask: PropTypes.func,
};
TaskList.defaultProps = {
loading: false,
};
Task 컴포넌트를 import 하니까 Task.propTypes 를 사용가능
import * as TaskStories from "./Task.stories";export const Default = {
args: {
// Shaping the stories through args composition.
// The data was inherited from the Default story in Task.stories.jsx.
tasks: [
{ ...TaskStories.Default.args.task, id: "1", title: "Task 1" },
{ ...TaskStories.Default.args.task, id: "2", title: "Task 2" },
{ ...TaskStories.Default.args.task, id: "3", title: "Task 3" },
{ ...TaskStories.Default.args.task, id: "4", title: "Task 4" },
{ ...TaskStories.Default.args.task, id: "5", title: "Task 5" },
{ ...TaskStories.Default.args.task, id: "6", title: "Task 6" },
],
},
};yarn add @reduxjs/toolkit react-redux 커멘드 실행