1 분 소요

storybook 사용하면서 겪었던 시행착오

🔥storybook에 theme 적용하기

[ 문제상황 ]

storybook에서 theme이 적용이 안 되고 있습니다!!!!!


[ 원인 ]

ThemeProvider를 사용하여 공통 theme을 관리하고 있었는데 이걸 storybook 인식하지 못 하여 오류가 발생했습니다.

index.tsx

import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider } from "react-router-dom";
import { ThemeProvider } from "styled-components";
import router from "@/router";
import GlobalStyles from "@/styles/globalStyles";
import { theme } from "@/styles/theme";

ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
  <React.StrictMode>
    <ThemeProvider theme={theme}>
      <GlobalStyles />
      <RouterProvider router={router} />
    </ThemeProvider>
  </React.StrictMode>
);


[ 해결방안 ]

.storybook > preview.tsx 코드 수정

  • 원래는 preview.ts인데 decorator를 적용하기 위해 tsx로 변경합니다.
  • 그 후 StoryThemeProvider 로 감싸주면 됩니다.
import GlobalStyles from "../src/styles/globalStyles";
import { theme } from "../src/styles/theme";
import type { Preview } from "@storybook/react";
import React from "react";
import { ThemeProvider } from "styled-components";

const preview: Preview = {
  parameters: {
    controls: {
      matchers: {
        color: /(background|color)$/i,
        date: /Date$/i,
      },
    },
  },
};

export const decorators = [
  (Story) => (
    <ThemeProvider theme={theme}>
      <GlobalStyles />
      <Story />
    </ThemeProvider>
  ),
];

export default preview;



🔥storybook에 절대 경로 적용하기

[ 문제상황 ]

storybook에서 절대경로를 인식하지 못 하여 import 오류가 떴습니다.


[ 해결방안 ]

1. 패키지 설치

  • TypeScript 프로젝트에서 절대 경로를 설정하고, 이를 Webpack에서 해석할 수 있도록 돕는 플러그인입니다.
npm install -D tsconfig-paths-webpack-plugin


2. 코드 수정

.storybook > main.ts

  • 아래 ‘이 부분!!’을 추가해주면 됩니다.
  • config.resolveconfig.resolve.plugins가 undefined될 수 있다는 오류가 뜨기 때문에 조건문을 추가해주었습니다.
import type { StorybookConfig } from "@storybook/react-webpack5";
import TsconfigPathsPlugin from "tsconfig-paths-webpack-plugin"; //이 부분!!

const config: StorybookConfig = {
  stories: ["../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
  addons: [
    "@storybook/addon-webpack5-compiler-swc",
    "@storybook/addon-onboarding",
    "@storybook/addon-links",
    "@storybook/addon-essentials",
    "@chromatic-com/storybook",
    "@storybook/addon-interactions",
  ],
  framework: {
    name: "@storybook/react-webpack5",
    options: {},
  },
  docs: {
    autodocs: true,
  },

  // 이 부분!!
  webpackFinal: async (config) => {
    if (!config.resolve) {
      config.resolve = {};
    }
    if (!config.resolve.plugins) {
      config.resolve.plugins = [];
    }
    config.resolve.plugins.push(new TsconfigPathsPlugin({}));
    return config;
  },
  //
};
export default config;



🔥createPortal 사용하는 컴포넌트 띄우기

[ 문제상황 ]

“Target container is not a DOM element”

createPortal를 사용하면 스토리북을 쓸 때 위와 같은 에러 문구를 볼 수 있습니다.


[ 원인 ]

createPortal은 먼저 index.html 파일에 element를 적은 후 그 곳에 자식 요소를 띄우는 것입니다. 이 index.html 파일은 public에 있으며 storybook이 인식할 수 없기 때문에 에러가 발생합니다.

1


[ 해결방안 ]

.storybook > preview-body.html

storybook에서도 html 파일을 생성하여 createPortal이 열리는 요소를 미리 지정해줘야 합니다.

<div id="modal"></div>

위 코드를 적은 후 storybook을 재실행하면 오류가 사라진 것을 볼 수 있습니다.

댓글남기기