Storybook
설치npm install --save-dev sb
npx sb init --builder webpack5
y
를 입력하여 설치./.storybook/...
: Storybook
에 대한 설정 파일./stories/...
: Storybook
의 샘플 코드npm run storybook
http://localhost:6006/
이 자동으로 열리며, 스토리북이 실행됨Next.js
의 globals.css
를 Storybook
에서도 사용할 수 있도록 ./storybook/preview.ts
파일을 열고 다음과 같이 수정import type { Preview } from '@storybook/react';
import '../src/styles/globals.css'; // 추가
const preview: Preview = {
parameters: {
actions: { argTypesRegex: '^on[A-Z].*' },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
},
};
export default preview;
globals.css
파일에 아래 코드가 반드시 추가되어 있어야 함.@tailwind base;
@tailwind components;
@tailwind utilities;
./.storybook/main.js
파일을 열고 다음과 같이 수정module.exports = {
"stories": [
"../**/*.stories.mdx",
"../**/*.stories.@(js|jsx|ts|tsx)"
],
...
}
.stories.tsx
파일명을 가지면, Storybook
이 이를 인식하여 화면에 표시하게 된다.MyComponent
|- index.tsx
|- MyComponent.stories.tsx
import '@components/MyComponent'
components/atoms/StyledButton/index.tsx
파일을 만들고 아래와 같이 작성interface ButtonProps {
label: string;
backgroundColor?: string;
}
function StyledButton({ label, backgroundColor }: ButtonProps) {
return (
<button type="button" className={`${backgroundColor} text-white p-2 rounded-2xl`}>
{label}
</button>
);
}
StyledButton.defaultProps = {
backgroundColor: 'bg-blue-500',
};
export default StyledButton;
StyledButton.stories.tsx
를 만들어 스토리 작성import { ComponentMeta } from '@storybook/react';
import StyledButton from '.'; // 스토리 대상 컴포넌트 불러오기
// 파일 안의 스토리 설정 (메타데이터 객체)
export default {
// 그룹명
title: 'stories/Button',
// 사용하는 컴포넌트
component: StyledButton,
} as ComponentMeta<typeof StyledButton>;
argTypes
를 설정하여 스토리북에서 control 가능하게 만들 수도 있다.import { ComponentMeta } from '@storybook/react';
import StyledButton from '.'; // 스토리 대상 컴포넌트 불러오기
// 파일 안의 스토리 설정 (메타데이터 객체)
export default {
// 그룹명
title: 'stories/Button',
// 사용하는 컴포넌트
component: StyledButton,
argTypes: {
backgroundColor: { control: 'text' },
},
} as ComponentMeta<typeof StyledButton>;
import { ComponentStory } from '@storybook/react';
const Template: ComponentStory<typeof StyledButton> = (args) => <StyledButton {...args} />;
export const Primary = Template.bind({});
Primary.args = {
backgroundColor: 'bg-blue-500',
label: 'Primary Button',
};
const Template: ComponentStory<typeof StyledButton> = function Template(args) {
return <StyledButton {...args} />;
};
controls
값을 수정하면 스토리북에서 바로 변경된 값을 확인할 수 있다.className
으로 설정했던 backgroundColor
은 수정하면 확인 할 수 없는 문제가 발생한다.export const Success = Template.bind({});
Success.args = {
backgroundColor: 'bg-yellow-500',
label: 'Success Button',
};
import React from 'react';
import StyledButton from '@/components/atoms/StyledButton';
function test() {
return <StyledButton label="버튼 테스트" />;
}
export default test;
tags: ['autodocs']
옵션을 추가export default {
// 그룹명
title: 'stories/Button',
// 자동으로 문서 생성
tags: ['autodocs'], // 추가
// 사용하는 컴포넌트
component: StyledButton,
// Docs에 출력할 description 작성
argTypes: {
backgroundColor: {
description: '버튼의 배경색을 지정합니다.',
},
label: {
description: '버튼에 표시되는 레이블을 지정합니다.',
},
},
} as ComponentMeta<typeof StyledButton>;
StyledButton/index.tsx
interface ButtonProps {
label: string;
backgroundColor?: string;
}
/**
* 버튼 컴포넌트
* @param {string} backgroundColor - 버튼의 배경색을 지정
* @param {string} label - 버튼에 표시되는 레이블을 지정
*/
function StyledButton({ label, backgroundColor }: ButtonProps) {
return (
<button type="button" className={`${backgroundColor} text-white p-2 rounded-2xl`}>
{label}
</button>
);
}
StyledButton.defaultProps = {
backgroundColor: 'bg-blue-500',
};
export default StyledButton;
StyledButton/StyledButton.stories.tsx
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import StyledButton from '.';
// 파일 안의 스토리 설정 (메타데이터 객체)
export default {
// 그룹명
title: 'stories/Button',
// 자동으로 문서 생성
tags: ['autodocs'],
// 사용하는 컴포넌트
component: StyledButton,
argTypes: {
backgroundColor: {
description: '버튼의 배경색을 지정합니다.',
},
label: {
description: '버튼에 표시되는 레이블을 지정합니다.',
},
},
} as ComponentMeta<typeof StyledButton>;
const Template: ComponentStory<typeof StyledButton> = (args) => <StyledButton {...args} />;
export const Primary = Template.bind({});
Primary.args = {
backgroundColor: 'bg-blue-500',
label: 'Primary Button',
};
export const Success = Template.bind({});
Success.args = {
backgroundColor: 'bg-yellow-500',
label: 'Success Button',
};
export const Example = Template.bind({});
Example.args = {
backgroundColor: 'bg-green-500',
label: 'Example Button',
};
ComponentMeta, ComponentStory를 사용해서 스토리 작성시 아래와 같이 VSCode에서 취소선이 출력됨을 발견하였다.
'ComponentMeta' is deprecated.ts(6385)
더 이상 안쓰는 모듈이라고 나와있음...import StyledButton from '.';
// 파일 안의 스토리 설정 (메타데이터 객체)
export default {
// 그룹명
title: 'stories/Button',
// 자동으로 문서 생성
tags: ['autodocs'],
// 사용하는 컴포넌트
component: StyledButton,
argTypes: {
backgroundColor: {
description: '버튼의 배경색을 지정합니다.',
},
label: {
description: '버튼에 표시되는 레이블을 지정합니다.',
},
},
};
export const Primary = {
args = {
backgroundColor: 'bg-blue-500',
label: 'Primary Button',
}
};
export const Success = {
args = {
backgroundColor: 'bg-yellow-500',
label: 'Success Button',
}
};
References