DEV Community

Cover image for How to set up Storybook for Tailwind CSS + Next.Js 12 (existing project)
soom
soom

Posted on • Edited on

How to set up Storybook for Tailwind CSS + Next.Js 12 (existing project)

Abstract

Introducing how to apply Storybook for Tailwindcss component on Next.js framework.

UI Component Documentation 하면 떠오르는 가장 대표적인 도구는 바로 Storybook 이다.
이번에 포스팅할 내용은 Utility-first CSS framework인 Tailwind CSS를 적용한 Next.Js 기반 Storybook 을 작성하는 방법이다.

기존 Storybook에 올라온 Next.Js 12 적용 방법은 하기의 명령어를 이용해storybook cli 기능을 이용해서 프로젝트를 setup 하는 방식이다.
하지만 이 방법은 시간이 오래 걸리는데다 실패율도 높다는 단점이 있다.

npx sb init --builder webpack5
Enter fullscreen mode Exit fullscreen mode

따라서 본 포스팅에서는 기존 프로젝트에 직접 Storybook을 적용하는 방법을 소개하고자 한다.

기존 방법은 하기 관련 링크를 참조:
https://storybook.js.org/blog/get-started-with-storybook-and-next-js/


Getting Started

Setting up Next.js Application

원하는 프로젝트를 폴더에 Next.Js TypeScript + Tailwind CSS 프로젝트 생성

Terminal
# Next.Js 프로젝트 생성
pnpm create next-app . --typescript

# Tailwind CSS 설치
pnpm add -D tailwindcss postcss autoprefixer

pnpm dlx tailwindcss init -p
Enter fullscreen mode Exit fullscreen mode
tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
    content: ['./pages/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}'],
    theme: {
        extend: {},
    },
    plugins: [],
};
Enter fullscreen mode Exit fullscreen mode
styles/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;
Enter fullscreen mode Exit fullscreen mode

Tailwind CSS을 이용한 버튼 컴포넌트 Button.tsx을 생성

components/Button.tsx
import type { FC } from 'react';

interface ButtonProps {
    name: string;
    className: string;
}

const Button: FC<ButtonProps> = ({ name, className }) => {
    return (
        <button className={`p-2 rounded-lg shadow-lg hover:shadow font-bold ${className}`}>
            {name}
        </button>
    );
};

export default Button;
Enter fullscreen mode Exit fullscreen mode

index.tsx 다음과 같이 작성

pages/index.tsx
import type { NextPage } from 'next';
import Button from '../components/Button';

const Home: NextPage = () => {
    return (
        <main className='w-[100vw] h-[100vh] flex justify-center items-center'>
            <div className='text-center'>
                <header className='mb-5'>
                    <h1 className='text-4xl font-bold text-pink-500'>Storybook</h1>
                    <h3 className='text-sm text-gray-400'>Next.JS, Tailwind CSS</h3>
                </header>
                <Button name={'Hello Tailwind CSS'} className={'bg-teal-400 text-white'} />
            </div>
        </main>
    );
};

export default Home;
Enter fullscreen mode Exit fullscreen mode

Storybook 관련 패키지 설치

Terminal
# Storybook Core
pnpm add -D @storybook/addon-actions @storybook/addon-essentials @storybook/addon-links @storybook/builder-webpack5 @storybook/manager-webpack5 @storybook/react

# Storybook Addons
pnpm add -D @storybook/preset-scss css-loader sass sass-loader style-loader postcss-loader

# For Next.JS Public Serve
pnpm add -D serve
Enter fullscreen mode Exit fullscreen mode

Setting up Storybook for Next.js

.storybook 폴더 생성 후 main.js, preview.js 생성

Note

  • 따로 dedicated한 폴더를 만들어 관리하지 않고 직접 컴포넌트 폴더에서 [filename].stories.ts 방식으로 관리할 예정이기에 다음과 같이 적용 범위 설정
stories: [
      '../components/**/*.stories.@(js|jsx|ts|tsx)',
      '../pages/**/*.stories.@(js|jsx|ts|tsx)',
  ],
  • 필수 요소를 제외한 addon 들은 Sass 관련, Next.Js 12 관련 addon
.storybook/main.js
module.exports = {
    stories: [
        '../components/**/*.stories.@(js|jsx|ts|tsx)',
        '../pages/**/*.stories.@(js|jsx|ts|tsx)',
    ],
    addons: [
        '@storybook/addon-links',
        '@storybook/addon-actions',
        '@storybook/addon-essentials',
        {
            name: '@storybook/preset-scss',
            options: {
                cssLoaderOptions: {
                    modules: { localIdentName: '[name]__[local]--[hash:base64:5]' },
                },
            },
        },
        'storybook-addon-next',
    ],
    framework: '@storybook/react',
    core: {
        builder: 'webpack5',
    },
};
Enter fullscreen mode Exit fullscreen mode
.storybook/preview.js
import '../styles/globals.css';

export const parameters = {
    actions: { argTypesRegex: '^on[A-Z].*' },
    controls: {
        matchers: {
            color: /(background|color)$/i,
            date: /Date$/,
        },
    },
};
Enter fullscreen mode Exit fullscreen mode

tsconfig.jsonbaseUrl 추가

tsconfig.json
{
    "compilerOptions": {
        ...
        "baseUrl": "."
        ...
    },
    ...
}
Enter fullscreen mode Exit fullscreen mode

package.jsonscript 추가

package.json
{
    ...
    "scripts": {
        ...
        "storybook:dev": "start-storybook -p 6006 -s public",
        "storybook:prod": "serve storybook-static",
        "storybook:build": "build-storybook -s public"
    },
    ...
}
Enter fullscreen mode Exit fullscreen mode

components 폴더에 Button.tsx 대응하는 Button.stories.tsx 생성

components/Button.stories.tsx
import Button from './Button';
import { ComponentMeta, ComponentStory } from '@storybook/react';

export default {
    title: 'Button',
    component: Button,
    argTypes: {
        name: {
            control: 'text',
        },
        className: {
            control: 'text',
        },
    },
} as ComponentMeta<typeof Button>;

const Template: ComponentStory<typeof Button> = (args) => <Button {...args} />;

export const Default = Template.bind({});

Default.args = {
    name: 'Hello Tailwind CSS',
    className: 'bg-teal-400 text-white',
};
Enter fullscreen mode Exit fullscreen mode

storybook 구동 후 Storybook Dashboard 확인

Terminal
pnpm storybook:dev
Enter fullscreen mode Exit fullscreen mode

Result

👉 CodeSandBox Sample Link

result
sb result


Conclusion

본 포스팅에서는 Next.Js 12 를 기준으로 Tailwind CSS 와 함께 StoryBook을 적용하는 방법을 알아보았다.
현재 기준 (2022/08) StoryBookNext.Js 12에 다소 안정화되지 않은 모습이 아쉽지만 Component 별로 UI Documentation 기능을 제공하는 StoryBook 자체의 장점만으로도 충분히 매력적인 선택지라고 생각한다.

StoryBook에는 위에 언급된 addon 외 에도 Tailwind CSS 다크 모드를 지원하는 Tailwind dark mode를 포함한 다양한 addon을 지원하고 있다.

하기 링크에서 더 많은 addon을 확인할 수 있다.
SB Addons Link: https://storybook.js.org/addons/

Top comments (0)