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
따라서 본 포스팅에서는 기존 프로젝트에 직접 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
tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./pages/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {},
},
plugins: [],
};
styles/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;
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;
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;
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
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',
},
};
.storybook/preview.js
import '../styles/globals.css';
export const parameters = {
actions: { argTypesRegex: '^on[A-Z].*' },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
};
tsconfig.json
에 baseUrl
추가
tsconfig.json
{
"compilerOptions": {
...
"baseUrl": "."
...
},
...
}
package.json
에 script
추가
package.json
{
...
"scripts": {
...
"storybook:dev": "start-storybook -p 6006 -s public",
"storybook:prod": "serve storybook-static",
"storybook:build": "build-storybook -s public"
},
...
}
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',
};
storybook
구동 후 Storybook Dashboard
확인
Terminal
pnpm storybook:dev
Result
👉 CodeSandBox Sample Link
Conclusion
본 포스팅에서는 Next.Js 12
를 기준으로 Tailwind CSS
와 함께 StoryBook
을 적용하는 방법을 알아보았다.
현재 기준 (2022/08) StoryBook
이 Next.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)