analogcoding

typescript 에서 storybook 사용하기 본문

Be well coding/Mine

typescript 에서 storybook 사용하기

be well 2020. 4. 28. 12:47

웹팩 + 타입스크립트 + 리액트 + styled components 로 진행 중인 프로젝트에 storybook 도입을 시도했다.

참고문서
Ts+storybook

px -p @storybook/cli sb init

스토리북 설치

.storybook/webpack.config.js

생성된 스토리북 폴더에 webpack module 추가

module.exports = ({ config, mode }) => {
  config.module.rules.push({
    test: /\.(ts|tsx)$/,
    use: [
      {
        loader: require.resolve("babel-loader"),
        options: {
          presets: [["react-app", { flow: false, typescript: true }]],
        },
      },
      require.resolve("react-docgen-typescript-loader"),
    ],
  });
  config.resolve.extensions.push(".ts", ".tsx");
  return config;
};

ts 및 tsx 확장자에 대하여 babel-loader 와 react-docgen-typescript-loader 를 사용하도록 설정한다.

.storybook/config.js

import { configure } from '@storybook/react';

configure(require.context('../src', true, /\.stories\.(js|mdx|tsx)$/), module);

tsx 파일도 Storybook에서 처리하도록 코드를 수정

src/typings.d.ts

declare module '*.mdx';

추후 ts 파일에서 mdx 확장자로 이루어진 파일을 불러오게 될 때 모듈이 없다는 에러를 방지.


Button 컴포넌트를 모아둔 폴더에 Buttons.stroies.tsx 파일 생성

import * as React from "react";
import { DefaultBtn, StyledBtn } from "./Buttons";

export default {
  title: "components|Button",
  component: DefaultBtn,
};

// title 은 상위 폴더가 되고 | 뒤에 내용이 하위 폴더로 추가된다.

export const defaultbtn = () => {
  return (
    <DefaultBtn theme={{ width: 300, height: 50, fontSize: 16 }}>
      이메일 로그인
    </DefaultBtn>
  );
};

defaultbtn.story = {
  name: "defaultBtn",
};

// 추가될 스토리의 이름을 설정한다.

export const googleLoginBtn = () => {
  return (
    <StyledBtn
      theme={{
        width: 300,
        height: 50,
        fontSize: 16,
        radius: 5,
        backGroundColor: "#dd4b39",
        color: "white",
      }}
    >
      Google 로그인
    </StyledBtn>
  );
};

googleLoginBtn.story = {
  name: "googleLoginBtn",
};

 

화면에 story code 가 나오는데 이것은 추가로 모듈을 설치해야 한다.

 

스토리 소스 에드온을 추가

 

npm i @storybook/addon-storysource

.storybook/main.js 에 addons 추가한다.

module.exports = {

stories: ["../stories/**/*.stories.js"],

addons: [

"@storybook/addon-actions",

// "@storybook/addon-links",

"@storybook/addon-storysource",

],

webpackFinal: async (config) => {

// do mutation to the config



return config;

},

};

마지막으로 webpack.config.js 부분 rules 에 아래 코드를 추가하면 확인할 수 있다.

 (module.exports = function({ config }) {
        config.module.rules.push({
          test: /\.stories\.tsx?$/,
          loaders: [
            {
              loader: require.resolve("@storybook/source-loader"),
              options: { parser: "typescript" },
            },
          ],
          enforce: "pre",
        });

        return config;
      }),

 

다음에는 action 까지 추가해보는 걸로!

Comments