Project/Figma+Storybook

4. 디자인시스템 - Storybook 및 Rollup scss 설정

건담아빠 2023. 11. 15. 16:48

 

1. storybook에 scss 설정

Storybook은 Sass를 기본적으로 지원하지 않는고 실행 하거나 스크립트를 작성할 때 webpack을 사용하여 모든 코드를 묶는다.

sass를 추가하려면 몇 가지 패키지를 추가하고 webpack 구성을 확장해야한다.

 

1.1. Sass 지원 추가를 위한 개발 종속성 추가 (참고)

$ yarn add --dev css-loader style-loader resolve-url-loader sass sass-loader

 

1.2. addon-styling-webpack 추가 (참고)

$ yarn add --dev @storybook/addon-styling-webpack

 

1.3. main.ts 설정

import type { StorybookConfig } from "@storybook/react-webpack5";

const config: StorybookConfig = {
  stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
  addons: [
    ...
    {
      name: "@storybook/addon-styling-webpack",
      options: {
        // sass: { implementation: require('sass')  }
        rules: [
          {
            test: /\.s[ac]ss$/,
            sideEffects: true,
            use: [
              require.resolve("style-loader"),
              {
                loader: require.resolve("css-loader"),
                options: {
                  importLoaders: 2,
                },
              },
              require.resolve("resolve-url-loader"),
              {
                loader: require.resolve("sass-loader"),
                options: {
                  // Want to add more Sass options? Read more here https://webpack.js.org/loaders/sass-loader/#options
                  implementation: require.resolve("sass"),
                  sourceMap: true,
                  sassOptions: {},
                },
              },
            ],
          },
        ],
      }
    }
  ],
  ...
};
export default config;

 

1.4. preview.js 설정 (참고)

공통 scss 파일인 index.scss을 import 해주고 기존에 import 되던 css 들은 모두 주석처리 및 제거한다.

# .storybook/preview.ts

import type { Preview } from "@storybook/react";

// 공통 SCSS 파일 import
import '../src/assets/styles/index.scss';

const preview: Preview = {
  ...
};

export default preview;

 

1.5. scss 공통 파일 (참고1, 참고2)

# assets/styles/index.scss

// _ 부분이라고 불리는 것은 scss에게 CSS 파일로 컴파일하지 말라고 지시합니다.
@import "variables";

// 구성 요소의 CSS를 소개합니다.
@import "../../components/Button/style";

 

1.6. Sass 적용 확인

global.scss 에서 적용된 css가 정상적으로 적용되었는지 확인

$ yarn storybook

 

2. rollup scss 설정

2.1. rollup.config.mjs 파일 변경

BEFORE

# rollup.config.mjs

import peerDepsExternal from "rollup-plugin-peer-deps-external";
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import typescript from "@rollup/plugin-typescript";
import postcss from "rollup-plugin-postcss";
import dts from "rollup-plugin-dts";

// This is required to read package.json file when
// using Native ES modules in Node.js
// https://rollupjs.org/command-line-interface/#importing-package-json
import { createRequire } from 'node:module';
const requireFile = createRequire(import.meta.url);
const packageJson = requireFile('./package.json');


export default [{
  input: "src/index.ts",
  output: [
    {
      file: packageJson.main,
      format: "cjs",
      sourcemap: true
    },
    {
      file: packageJson.module,
      format: "esm",
      sourcemap: true
    }
  ],
  plugins: [
    peerDepsExternal(),
    resolve(),
    commonjs(),
    typescript(),
    postcss({
      extensions: ['.css']
    })
  ]
}, {
  input: 'dist/index.d.ts',
  output: [{ file: 'dist/index.d.ts', format: 'es' }],
  plugins: [dts()],
  external: [/\.css$/]
}];

 

AFTER

# rollup.config.mjs

import peerDepsExternal from "rollup-plugin-peer-deps-external";
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import typescript from "@rollup/plugin-typescript";
import dts from "rollup-plugin-dts";
import scss from "rollup-plugin-scss";

// This is required to read package.json file when
// using Native ES modules in Node.js
// https://rollupjs.org/command-line-interface/#importing-package-json
import { createRequire } from 'node:module';
const requireFile = createRequire(import.meta.url);
const packageJson = requireFile('./package.json');


export default [{
  input: "src/index.ts",
  output: [
    {
      file: packageJson.main,
      format: "cjs",
      sourcemap: true
    },
    {
      file: packageJson.module,
      format: "esm",
      sourcemap: true
    },
  ],
  plugins: [
    peerDepsExternal(),
    resolve(),
    commonjs(),
    typescript(),
    scss({
      // include: ["src/assets/**/*.scss"],
      // insert: true,

      // outputStyle: "compressed", // css 출력 스타일 (expanded: 압축되지 않은, compressed: 압축된, nested: 중첩된)
      include: ["src/**/*.scss"],
      // output: 'dist/bundle.css', // 번들된 CSS 파일 경로 설정
      fileName: 'assets/bundle.css'
    })
  ]
}
, {
  input: 'dist/index.d.ts',
  output: [{ file: 'dist/index.d.ts', format: 'es' }],
  plugins: [dts()],
  external: [/\.s[ac]ss$/]
}

];

 

2.2. 라이브러리 정리

추가

$ yarn add --dev rollup-plugin-scss

 

삭제

$ yarn remove rollup-plugin-postcss

 

2.3. 확인

build 후 dist 폴더에 index.esm.js에 css 구문이 추가되었는지 OR insert: true 옵션을 주석 처리하고 dist 폴더에 해당 css가 생성되는지 확인해 본다.

$ yarn build

 

2.4. publish

$ yarn build-publish

 

3. 테스트 프로젝트에서 npm 라이브러리 설치 후 확인

https://dchkang83.tistory.com/220

 

3. 디자인시스템 - npm에서 받아서 활용해보기

앞서 설정한 디자인 시스템의 npm을 storybook 문서를 활용하여 테스트를 진행해 보자. 1. 디자인시스템 - Rollup을 사용하여 Storybook npm 배포 및 사용 2. 디자인시스템 - Storybook chromatic 배포 및 git 연동

dchkang83.tistory.com