channel-io / bezier-react

React components library that implements Bezier design system.
https://main--62bead1508281287d3c94d25.chromatic.com
Apache License 2.0
230 stars 47 forks source link

Change core style library #764

Closed sungik-choi closed 2 years ago

sungik-choi commented 2 years ago

요약

현재 사용하고 있는 styled-components 를 새로운 라이브러리로 변경-혹은 개선-하면 좋겠습니다.

제안 이유

개선 방안

최근 zero-runtime 을 표방하는 CSS-in-JS 라이브러리들이 많이 등장했습니다. 빌드 타임에 디자인 시스템을 잘 만들기 위한 라이브러리들도 많아서, 이들을 잘 리서치해서 코어 라이브러리를 변경하고자 합니다. 아래와 같았으면 좋겠습니다.

레퍼런스

라이브러리 목록

등의 라이브러리들이 있습니다. 장단점 비교는 코멘트로 작성하겠습니다.

참고할만한 링크

sungik-choi commented 2 years ago

styled-components

라이브러리는 그대로 유지하는 방식입니다. 다만 성능 개선을 위해 현재 ThemeProvider를 통해 생성하는 테마 객체를 모두 CSS variable로 변경합니다.

chakra-ui에서 theme token(우리의 경우 foundation)을 CSS variable로 변경하여 얻은 장점을 아래와 같이 설명하고 있습니다.

Chakra UI now converts theme tokens (colors, font sizes, etc) to CSS Custom Properties (also known as "CSS variables").

CSS variables are now supported in all modern browsers, and we think they are useful to:

  • avoid prop interpolations;
  • avoid classname regeneration from emotion;
  • reduce runtime evaluation of token values in Theme context;
  • use theme token outside Chakra's component (embedded forms, markdown content, etc.)

장점

단점

총평

라이브러리를 pivot하지 않아, 마이그레이션 비용이 현저히 적기 때문에 가장 마음에 드는 안입니다. CSS variable을 사용할 경우 Intellisense가 잘 동작하도록 해야 합니다. (extension을 만들어보기?! like tailwind css)

sungik-choi commented 2 years ago

Stitches

near zero-runtime을 표방하는 라이브러리입니다.

장점

단점

/* https://stitches.dev/blog/migrating-from-styled-components-to-stitches */
// styled-components
const Button = styled.button`
  ${(props) =>
    props.color === 'violet' &&
    `
    background-color: 'blueviolet'
  `}

  ${(props) =>
    props.color === 'gray' &&
    `
    background-color: 'gainsboro'
  `}
`;

// Stitches
const Button = styled('button', {
  variants: {
    color: {
      violet: { backgroundColor: 'blueviolet' },
      gray: { backgroundColor: 'gainsboro' },
    },
  },
});

() => <Button color="violet">Button</Button>;

총평

다양한 API 제공, 괜찮은 성능, 훌륭한 DX 제공 등 장점이 많지만 마이그레이션이 가장 큰 걱정입니다.

sungik-choi commented 2 years ago

emotion

styled-components와 양대 산맥을 이루는 CSS-in-JS 라이브러리입니다. (차이점에 대한 링크) 추가로 테스트 결과 약간의 차이점이 있었는데,

큰 차이가 있을지는 잘 모르겠네요.

장점

단점

총평

다양한 API를 지원해줘서 마이그레이션 하는 건 어렵지 않을 거 같습니다. object style을 잘 지원해준다는 장점이 있지만, 굳이 마이그레이션 해야할까..? 라는 생각이 드네요.

sungik-choi commented 2 years ago

vanilla-extract

Zero-runtime Stylesheets in TypeScript.

장점

단점

총평

좋은 라이브러리는 맞지만, 상기한 단점때문에 사용하기가 어려워보입니다.

sungik-choi commented 2 years ago

compiled

A familiar and performant compile time CSS-in-JS library for React.

장점

-import styled from 'styled-components';
+import { styled } from '@compiled/react';

단점

총평

손쉬운 마이그레이션에 장점이 있지만, 디자인 시스템 친화적이지 않다는 점과 베타 버전이라는 점이 고민됩니다.

sungik-choi commented 2 years ago

linaria

Zero-Runtime CSS in JS

장점

단점

총평

zero-runtime css-in-js 솔루션 중에선 마이그레이션 비용이 가장 적을 거 같아 최선의 선택지로 보입니다. 테스트 후 성능이 드라마틱하게 좋아진다면 사용해봄직하다고 느꼈습니다.

guswnsxodlf commented 2 years ago

리서치 감사합니다! 🙇‍♂️ 저는 Styled-component를 그대로 사용하는 안이 가장 좋아 보입니다.

가장 큰 이유는 desk가 여전히 styled-component와 scss를 혼용해서 사용하고 있기 때문입니다. 이 상황에서 베지어 라이브러리를 교체하면, 총 세 가지의 css library를 사용하게 되고, 이 세 라이브러리 작동 방식의 충돌 (e.g. 베지어에서는 데스크 테마의 SCSS를 지원하기 위해 themeVars를 만들어 주입하고 있습니다. 이 외에도 여러가지 SCSS 를 위한 코드가 있습니다.)을 해결하는 코드를 작성해야 하며, side-effect가 크기 때문에 기능을 추가할 때에도 항상 염두하고 작성하게 될 것 같습니다.

인터페이스를 거의 비슷하게 사용할 수 있으면서 (마이그레이션 비용 낮음), 제로 런타임으로 큰 효과를 볼 수 있고, maintain 상황도 나쁘지 않은 Linaria를 고려해볼만 하다고 생각하지만, desk 입장에서 현재 SCSS를 안고 가야 하는 상황에 또 새로운 라이브러리를 추가하는 것은 지양해야 할 것 같습니다.

desk에서 SCSS를 모두 없애고 베지어에도 이를 지원하는 코드를 모두 없애는 것이 먼저일 것 같고, 그 다음에 라이브러리 교체를 생각해볼만 한 것 같습니다!

sungik-choi commented 2 years ago

리서치 감사합니다! 🙇‍♂️ 저는 Styled-component를 그대로 사용하는 안이 가장 좋아 보입니다.

👍 저도 같은 고민을 했습니다. 꽤 오랜 기간동안 scss, styled-components, +다른 라이브러리가 혼재된 상황이 될텐데, 관리가 쉽지 않을 거 같단 생각이 들었어요.

sungik-choi commented 2 years ago

styled-component를 그대로 사용합니다. CSS Variable에 관련한 별도의 이슈를 생성하고, 이 이슈는 Close합니다.