1. ์คํ ๋ฆฌ๋ถ ์ค์น
- ๊ธฐ์กด ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ ๋ด์์ ์คํ
- .storybook ๋๋ ํ ๋ฆฌ ์์ main.js์ preview.js๊ฐ ์์ฑ๋๋ค.
# Add Storybook:
npx storybook init
npm run storybook
๋ช ๋ น์ด๋ฅผ ํตํด ๋ก์ปฌํธ์คํธ 6006๋ฒ ํฌํธ์์ ์คํํ ์ ์๋ค.
2. Styled-components ์ ์ฉ
- preview.js์์ ์ค์ ์ ํด์ค๋ค.
import React from 'react';
import { ThemeProvider } from 'styled-components';
import { GlobalStyle } from '../src/lib/styles/global-style';
import { theme } from '../src/lib/styles/theme';
export const decorators = [
(Story) => (
<ThemeProvider theme={theme}>
<GlobalStyle />
<Story />
</ThemeProvider>
),
];
export const parameters = {
actions: { argTypesRegex: '^on[A-Z].*' },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
};
ThemeProvider์ GlobalStyle์ด ์คํ ๋ฆฌ๋ถ ์์์๋ ์ ์ฉ๋๋๋ก ํด์ฃผ์๋ค.
3. TypeScript Doc ๊ด๋ จ ์ธํ
์ด์ ์ JS์์ ์คํ ๋ฆฌ๋ถ์ ์ฌ์ฉํ์๋๋ PropTypes๋ก ์ง์ ํ์ ์ ์ง์ ํ๊ณ Docs ํ์ด์ง๋ฅผ ์ฌ์ฉํ ์ ์์๋ค. typescript์์ type์ด๋ interface๋ฅผ ์ง์ ํ ๋ ์ฃผ์์ ํจ๊ป ๋ฌ๋ฉด Docs์์ ๋ณผ ์ ์๋ค.
yarn add --dev react-docgen-typescript-loader
4. Canvas ๋ทฐํฌํธ ์ค์
์คํ ๋ฆฌ๋ถ ๋ด์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ ๋ทฐํฌํธ์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ ์ ์๋ค.
export const parameters = {
actions: { argTypesRegex: '^on[A-Z].*' },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
viewport: {
viewports: {
mobile1: {
name: 'iPhone 13 mini',
styles: {
width: '375px',
height: '812px',
},
type: 'mobile',
},
mobile2: {
name: 'iPhone 13 / 13 pro',
styles: {
width: '390px',
height: '844px',
},
type: 'mobile',
},
tablet1: {
name: 'iPad Pro 11"',
styles: {
width: '834px',
height: '1194px',
},
type: 'tablet',
},
},
defaultViewport: 'mobile1',
},
};
- Preview.js์ parameters์ ์์ ๊ฐ์ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
- ์ด๋ฒ ๊ฒฝ์ฐ์๋ ์ธ ์ข ๋ฅ์ ๋ทฐํฌํธ๋ฅผ ๋ฃ์ด๋์๊ณ , ๋ํดํธ ๊ฐ์ผ๋ก ํผ๊ทธ๋ง์์ ๋์์ธ๋ ์ฌ์ด์ฆ๋ก ํด๋์๋ค.
5. ์คํ ๋ฆฌ๋ถ ๋ด ํจ๋ฉ ์ค์
์์์ ๋ทฐํฌํธ๋ ๋์์ธ๋ ๊ฒ์ ๋ง์ถ์ด์ ์ค์ ํด ๋์๋๋ฐ, ์คํ ๋ฆฌ๋ถ์์ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ํด๋์ ๋ง์ง(16px)์ ์ฐ๋ฆฌ ๋์์ธ์ ๋ง๊ฒ ์์ ํ๊ณ ์ถ์๋ค. ๊ฐ๋จํ๋ค.
npm install --save-dev storybook-addon-paddings
- npm์์ storybook-addon-paddings๋ฅผ ์ค์นํ๊ณ
- main.js์ ๊ฐ์ addon์ ๋๊ฐ์ด 'storybook-addon-paddings'๋ฅผ ์ถ๊ฐํด์ค๋ค.
6. github Action์ผ๋ก ๋ฐฐํฌ ์ค์ ํ๊ธฐ
์ ์ํ UI์ปดํฌ๋ํธ๋ค์ ์คํ ๋ฆฌ๋ถ์ ํตํด ๋ฌธ์ํํด ๊ณต์ ํ๊ธฐ์ ์ข์ ๋ฐฉ๋ฒ์ด๋ค. ๋์์ด๋ ์ ์ฅ์์๋ ๋ด๊ฐ ์ด์ฌํ ๋์์ธํ ์ปดํฌ๋ํธ๋ค์ด ์ ๊ตฌํ๋๊ณ ์๋์ง ๊ฐ์ํ ์ ์๋ค!! github Action์ ์ด์ฉํด push ์ก์ ์ด ์ค๋ฉด ์๋์ผ๋ก ๊นํ๋ธ ํ์ด์ง์ ๋ฐฐํฌ๋ฅผ ํ๋ ค๊ณ ํ๋ค. ๋ฐฐํฌ ๋งํฌ
npm i @storybook/storybook-deployer --save-dev
- npm์์ storybook-deployer๋ฅผ ์ค์นํ๊ณ
- package.json์ ๊ฐ์ scripts์
deploy-storybook": "storybook-to-ghpages
๋ฅผ ์ถ๊ฐํด์ค๋ค.
name: Build & Deploy Storybook
on:
push:
branches: [dev]
paths: ['src/components/**']
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install and Build ๐ง
# This needs an Acces Token stored as "GH_TOKEN" ๐
run: |
npm install
npm run deploy-storybook -- --ci
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
๊นํ๋ธ ์ํฌํ๋ก์ฐ ๋๋ ํ ๋ฆฌ์ .yml ํ์ผ์ ํ๋ ๋ง๋ค์ด์ค๋ค.
dev ๋ธ๋์น์ push๊ฐ ์ค๊ณ (&&), 'src/components' ๋๋ ํ ๋ฆฌ์ ๋ณ๊ฒฝ์ฌํญ์ด ์์ ๋ ์ก์ ์ด ์คํ๋๋ค.
์ฒ์ ์คํ ๋ฆฌ๋ถ์ ์ค์นํ๋ฉด ์๋์ผ๋ก ์๊ธฐ๋ ์์ ํ์ผ๋ค ์ค์ .mdx ํ์ผ์ด ๋ค์ด์๋๋ฐ, ์ด ๋๋ฌธ์ ๋ฐฐํฌ ์ค์ ์๋ฌ๊ฐ ๋ฌ๋ค. ๋ก์ปฌ์์ ๋ฌธ์ ์์ด ๋น๋๊ฐ ๋๋๋ฐ ๊นํ๋ธ ์ก์ ์ ํตํด ๋น๋ํ ๋๋ง ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. @mdx-js/react ๋ฅผ ์ค์นํด์ฃผ๊ณ ๋ค์ push๋ฅผ ๋ ๋ ค๋ณด๋ ๋น๋๊ฐ ์ ์์ ์ผ๋ก ๋๋๊ฒ์ ํ์ธํ๋ค. ๋์ฅ๋ ์งฑ
๊ทธ๋ฆฌ๊ณ ์ด์ ์ ์คํ ๋ฆฌ๋ถ์ ์ฌ์ฉํ๋ ํ๊ธฐ